gpt4 book ai didi

delphi - TListView 自动将图像列表中的图像附加到我的 TListView 的第一列。我该如何摆脱这种行为?

转载 作者:行者123 更新时间:2023-12-01 18:09:54 31 4
gpt4 key购买 nike

我正在使用 Embarcadero 的 C++ Builder XE8。我有一个 ListView 并动态添加列及其项目。我需要一个图像列表,因为我想使用 (ListItem->SubItemImages[0] = i;) 将图像添加到第二列,即 (ListItem->SubItemImages[0] = i;)

似乎通过添加此图像列表,C++ Builder 默认情况下认为主列也需要图像,因此它默认将图像列表的第 0 个元素附加到该列中的所有项目。我不希望这种情况发生。相反,在“ID”列下,我只需要 ID,不需要任何图像。我怎样才能做到这一点?

Screenshot showing whats going on

我的代码:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
const string firstName[] = {"Snowball", "Scavies", "Tinkerbell", "Fido", "Garfield", "Kobe"};
const string lastName[] = {"M", "E", "O", "W", "W", "W"};
TListColumn *NewColumn;
TListItem *ListItem;
TListView *ListView = ListView1;

ListView->SmallImages = ImageList1;

ListView->ViewStyle = vsReport;
NewColumn = ListView->Columns->Add();
NewColumn->Caption = "ID";
NewColumn = ListView->Columns->Add();
NewColumn->Caption = "Node";
NewColumn = ListView->Columns->Add();
NewColumn->Caption = "First";
for (int i = 0; i < sizeof( firstName ) / sizeof( firstName[0] ); i++)
{
char buffer[3];
itoa(i,buffer,10);
ListItem = ListView->Items->Add();
ListItem->Caption = buffer;
ListItem->SubItems->Add(firstName[i].c_str());
ListItem->SubItems->Add(lastName[i].c_str());
ListItem->SubItemImages[0] = i;
//ListItem->ImageIndex = NULL;
}
}

最佳答案

当您将项目添加到关联有 ImageList 的 ListView 时,它会假设您的意图是将这些图像用于项目本身,因此添加的每个项目都将被分配一个默认的>ImageIndex0(图像列表中的第一个图像)。

要从项目本身中删除图像,您只需将默认的 ImageIndex0 替换为 -1,表示“无图像”。

ListItem->ImageIndex = -1; 
ListItem->SubItemImages[0] = i;

正如评论中所指出的,这涉及不绘制项目标题旁边的图像(第 0 列),但 ListView 仍将为这些图像留出空间,即使不绘制任何图像:

Space left for non-existent images

有两种方法可以避免这种情况:

  1. 不要将图像列表与 ListView 关联,并使用自定义绘图来绘制任何需要图像的子项。

  2. 将第 0 列的列宽设置为 0,以有效隐藏该列并将第一个子项目视为项目标题。

每种方法都有权衡。

第一个需要增加自定义绘图的复杂性。第二个更简单,但意味着您需要在 ListView 上启用 RowSelect 行为。否则,子项目无法用于选择列表中的项目,并且不会使用任何选择突出显示进行绘制。

这也意味着在任何事件处理等中,您必须记住将 Subitem[0] 视为特殊情况(项目“标题”):

ListView->RowSelect = true;

// ..

NewColumn = ListView->Columns->Add();
NewColumn->Caption = "Not Used";
NewColumn->Width = 0;
NewColumn = ListView->Columns->Add();
NewColumn->Caption = "ID";

// ..

// No need to set ListItem->Caption since it is hidden

ListItem->SubItems->Add(buffer); // subitem[0] = 'the item'
ListItem->SubItems->Add(firstName[i].c_str());
ListItem->SubItems->Add(lastName[i].c_str());
ListItem->SubItemImages[1] = i;

一些好奇的用户也有可能调整列[0]的大小并发现您隐藏的 secret 。 :)

关于delphi - TListView 自动将图像列表中的图像附加到我的 TListView 的第一列。我该如何摆脱这种行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43332488/

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