Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi TListView:在运行期间在现有列之间添加新列后的子项顺序_Delphi_Runtime_Subitem - Fatal编程技术网

Delphi TListView:在运行期间在现有列之间添加新列后的子项顺序

Delphi TListView:在运行期间在现有列之间添加新列后的子项顺序,delphi,runtime,subitem,Delphi,Runtime,Subitem,如果在运行时在现有列之间添加新列,则子项索引与我假设的不同 e、 g.在第二列和第三列之间添加新列后,列/子项如下所示: colums[0] | colums[1] | (new) columns[2] | columns[3] caption | subitems[0] | subitems[2] | subitems[1] 但我认为: colums[0] | colums[1] | (new) columns[2] | columns[3] capt

如果在运行时在现有列之间添加新列,则子项索引与我假设的不同

e、 g.在第二列和第三列之间添加新列后,列/子项如下所示:

colums[0] |  colums[1]   |  (new) columns[2] |  columns[3]
caption   |  subitems[0] |  subitems[2]      |  subitems[1]
但我认为:

colums[0] |  colums[1]   |  (new) columns[2] |  columns[3]
caption   |  subitems[0] |  subitems[1]      |  subitem[2]
我需要能够在某些条件下动态更新子项的内容。这就是为什么我想依赖于这样一个假设,即column.Index=X的列的子项位于Item.SubItems[X-1]

你认为这是默认和指定的行为吗?如果是的话,您会建议如何根据列更新子项。一种可能是保存属于最近添加的列的子项索引

注意:Columns.Tag-property已在使用中


我使用的是Delphi XE和XE2,但我需要与Delphi 7及更高版本兼容。

您不需要保存索引位置,您可以随时要求列表视图控件本身显示列的原始位置:

procedure TForm1.Button1Click(Sender: TObject);
var
  ColumnOrder: array of Integer;
begin
  SetLength(ColumnOrder, ListView1.Columns.Count);
  ListView_GetColumnOrderArray(ListView1.Handle, ListView1.Columns.Count,
                               PInteger(ColumnOrder));

对于问题中的示例,
ColumnOrder
数组将保持(0,1,3,2)。如果我们想更新新插入列的子项(左起第三列),则其原始位置为“3”。代码示例:

var
  ColumnOrder: array of Integer;    
  SubIndex: Integer;
begin
  SetLength(ColumnOrder, ListView1.Columns.Count);
  ListView_GetColumnOrderArray(ListView1.Handle, ListView1.Columns.Count,
                               PInteger(ColumnOrder));

  SubIndex := ColumnOrder[2];    // We want to update 3rd column from left
                                 // (visually -> SubItems[1])

  // Test if the index is not 0, otherwise it holds an *item*,
  // not a subitem (the first column can change position too).
  if SubIndex > 0 then begin     
    Dec(SubIndex);               // VCL subitems are 0 based
    ListView1.Items[1].SubItems[SubIndex] := 'updated!';
  end;

请注意,如果您正在添加列,而不仅仅是对现有列重新排序,那么只有在您对中的错误进行了修复后,此功能才会起作用(如果您没有进行修复,则仍然无法同时提供列重新排序和列添加功能)


关于默认行为是否正确,假设您有一个列表视图,其中显示的文件信息包含“name”、“size”、“date”列。作为开发人员,您不应该担心用户可能会将“size”列放在哪里,只需将信息放在“SubItems[0]”中即可。此外,如果用户拖动“name”列,它会从一个项降级为一个子项吗


我认为,期望项目/子项目在其各自的列后面是合乎逻辑的。

同一作者的确切副本。不完全是。。。也许你没有读过讨论。。。这只是一个小摘录,并不是另一个线程中描述的bug的一部分。我仍然会使用虚拟列表视图来完成这项工作。我仍然相信,这比试图让列表视图存储所有内容更容易、更安全。间接性是你在这里的朋友。看看你在这个问题和最后一个问题中考虑的变化,我发现很难相信虚拟模式是更高风险的选择!我看不出“如果您添加一列,VCL如何放松列的顺序”与“如何在重新排序的列下定位子项”完全相同。添加一个新的专栏正是OP面对这个问题的方式,只是洗牌现有的专栏,他也会遇到同样的问题。这非常好!正是我想要的。非常感谢。和:无法在应用中移动/删除列0:)