4

実行時に既存の列の間に新しい列を追加すると、サブアイテムのインデックスは想定とは異なります。

たとえば、2 番目と 3 番目の列の間に新しい列を追加すると、列/サブ項目は次のようになります。

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 プロパティは既に使用されています。

Delphi XE と XE2 を使用していますが、Delphi 7 以降と互換性がある必要があります。

4

1 に答える 1

3

インデックスの位置を保存する必要はありません。いつでもリスト ビュー コントロール自体に列の元の位置を問い合わせることができます。

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 番目の列) のサブアイテムを更新する場合、元の位置は '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;


既存の列を並べ替えるだけでなく、列を追加する場合、これは他の質問のバグを修正している場合にのみ機能することに注意してください(そうでない場合は、列の並べ替えと列の両方を提供しますとにかく機能を追加することはまったく不可能です)。


デフォルトの動作が本来あるべきものであるかどうかに関して、列「名前」、「サイズ」、「日付」を持つファイル情報を表示しているリストビューがあるとします。開発者は、ユーザーが「サイズ」列をどこに配置したかを心配する必要はありません。情報を「SubItems[0]」に配置するだけです。さらに、ユーザーが「名前」列をドラッグすると、アイテムからサブアイテムに降格します。

アイテム/サブアイテムがそれぞれの列に従うことを期待するのは論理的だと思います..

于 2011-11-30T16:38:52.970 に答える