gpt4 book ai didi

lazarus - 在 Lazarus 中处理项目后调整 TListview 中选定项目的颜色

转载 作者:行者123 更新时间:2023-12-04 10:51:04 28 4
gpt4 key购买 nike

在花了很多时间之后

'''

procedure Tf100.lvListCustomDrawItem(Sender: TCustomListView; Item: TListItem;
State: TCustomDrawState; var DefaultDraw: Boolean);
begin
Sender.Canvas.Font.Color := clRed; // default was clBlack
end;

procedure Tf100.lvListCustomDrawSubItem(Sender: TCustomListView;
Item: TListItem; SubItem: Integer; State: TCustomDrawState;
var DefaultDraw: Boolean);
begin
Sender.Canvas.Font.Color := clRed; // Default was clBlack;
end;

'''

我能够更改 ListView 中项目的颜色。然而,我真正想要的是:
  • 以黑色显示 ListView 中的所有项目(完成,好的)
  • 以编程方式循环遍历所有项目并同时选择 1 个项目(完成,好的)但是
    使字体颜色为红色(所选项目的颜色)。
  • 阅读项目的标题(文件名)并处理该文件名(完成,好的)
  • 如果处理成功,则将当前项目设为绿色,如果不成功则将其保留为红色。
  • 选择列表中的下一项,直到列表末尾(完成,好的)。

  • 希望这是有道理的。概括起来就是:如何根据某个函数的结果来改变一个TListItem的颜色。我什至不知道在什么情况下我应该调用这个函数(在 listview 的事件中?)。

    现在,我有这个:
    iIndex := 0;
    repeat

    pbProgress.Position := iIndex + 1;

    try
    lvList.SetFocus; // The color should become clRED
    lvList.ItemIndex := iIndex;
    lvList.Items[iIndex].Selected := true;
    lvList.Selected.MakeVisible(True);

    sFile := txtFolder.text + '\' + lvList.Items[iIndex].Caption;
    DisplayPicture(sFile);
    application.processmessages ;
    txtCurrent.Text := Format('%D of %D',[iIndex + 1, iMax]);
    bOke := ProcessFile(sFile);

    if (bOke) then begin
    // Current index color should become clGREEN but I don't know how
    end;

    except
    on E:Exception do begin
    bOke := False;
    msgbox(Format('Error at index %d',[iIndex]),'ooops',acError,[mbOk],['Press']);
    end;
    end;

    if (bOke) then
    Inc(FGood)
    else
    Inc(FWrong);

    UpdateStats(Self);

    Inc(iIndex);

    until (iIndex = iMax);

    希望有人能够回答我的问题。
    此致,
    马丁

    最佳答案

    我没有安装Lazarus,所以下面是用Delphi完成的。我 99.9% 确定它也适合你。

    您已经在 OnCustomDrawItem() 中看到了如何定义项目的颜色。和 OnCustomDrawSubItem()事件。

    这里重要的是要了解 TListView不会在任何地方保存该颜色设置。如果您考虑上下滚动列表, ListView 会调用 OnCustomDrawItem()OnCustomDrawSubItem()每个项目的事件,因为它们需要被绘制。一个项目的状态可能自它之前显示以来已经改变。

    因此,您需要将文件处理的结果保存在某处,以便您可以在 OnCustomDrawItem() 中告诉 ListView 为每个项目使用什么颜色。和 OnCustomDrawSubItem()事件。

    我建议您创建一个数据结构,一个包含文件名和处理结果的简单类。然后,当您将文件添加到 ListView 进行显示时,您还将对每个文件对象的引用添加到 ListView 。

    首先是一些类型和变量声明

    type
    // enum for the different processing states
    TProcessEnum = (NotDone, Processing, DoneSucceeded, DoneFailed);
    // class for holding file names and process state
    TMyFileData = class
    FileName: string;
    ProcessState: TProcessEnum;
    end;
    // Array type for file data
    TMyFileDataArray = array of TMyFileData;

    const
    // string representation for process states
    ProcessStates: array of string = ['Not done', 'Processing', 'Succeeded', 'Failed'];

    var
    // data array
    MyFileDataArray: TMyFileDataArray;

    然后创建一些演示数据
    procedure TForm21.FormCreate(Sender: TObject);
    var
    i: integer;
    begin
    SetLength(MyFileDataArray, 9);

    for i := 0 to Length(MyFileDataArray)-1 do
    begin
    MyFileDataArray[i] := TMyFileData.Create;
    MyFileDataArray[i].FileName := 'c:\tmp\example'+IntToStr(i)+'.txt';
    MyFileDataArray[i].ProcessState := NotDone;
    end;
    end;

    然后将文件名和数据引用添加到 LV 项目和过程状态到 LV 子项目。数据引用是 AddItem() 的第二个参数稍后可以在 OnCustomDrawItem() 中访问它和 OnCustomDrawSubItem()事件使用 Item.Data
    procedure TForm21.Button1Click(Sender: TObject);
    var
    i: integer;
    begin
    for i := 0 to Length(MyFileDataArray)-1 do
    begin
    ListView1.AddItem(MyFileDataArray[i].FileName, MyFileDataArray[i]);
    ListView1.Items[i].SubItems.Add(ProcessStates[ord(MyFileDataArray[i].ProcessState)]);
    end;
    end;

    并运行所有文件的处理
    procedure TForm21.Button2Click(Sender: TObject);
    var
    i: integer;
    begin
    for i := 0 to Length(MyFileDataArray)-1 do
    begin
    MyFileDataArray[i].ProcessState := processing;
    ListView1.Items[i].SubItems[0] := ProcessStates[ord(MyFileDataArray[i].ProcessState)];
    ListView1.Repaint; // force a visual update

    sleep(500); // simulate processing delay

    MyFileDataArray[i].ProcessState := TProcessEnum(random(2) + 2);
    ListView1.Items[i].SubItems[0] := ProcessStates[ord(MyFileDataArray[i].ProcessState)];
    ListView1.Repaint; // force a visual update
    end;
    end;

    将 ProcessState 转换为颜色的辅助函数
    function TForm21.ItemColor(ProcessState: TProcessEnum): TColor;
    begin
    case ProcessState of
    DoneSucceeded: Result := clGreen;
    Processing,
    DoneFailed: Result := clRed;
    else
    Result := clBlack;
    end;
    end;

    两者 OnCustomDrawItem()OnCustomDrawSubItem()只有以下行
    Sender.Canvas.Font.Color := ItemColor(TMyFileData(Item.Data).ProcessState);

    但请注意,您可能希望根据 State: TCustomDrawState 进一步修改背景或字体颜色。值(value)。

    关于lazarus - 在 Lazarus 中处理项目后调整 TListview 中选定项目的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59469863/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com