6

TListView の既存の列の間に列を追加しようとしています。そのため、最後に新しい列を追加し、そのインデックスを指定された値に設定して移動します。別の新しい列を追加するまで、これは機能します。

私がやったこと:最後の位置(Columns.Add)に列を追加し、最後の位置(Subitems.Add)にもサブアイテムを追加します。その後、インデックスを正しい位置に設定して列を移動します。追加される列が 1 つだけである限り、これは正常に機能します。2 番目の新しい列を追加すると、サブ項目が台無しになります。最初の列の新しいサブアイテムは、次のように最後の位置に移動されます。

0        |  1          |  new A       |  new B      | 3
Caption  |  old sub 1  |  old sub 3   |  new Sub B  | new sub A

誰かが助けてくれたらとても嬉しいです!

たとえば、ListView に送信できるコマンドまたはメッセージがあり、その列を更新または保存します --> 最初の新しい列を追加した後に使用できるサブアイテム マッピングと、それがサブアイテムであるため、2 番目の新しい列を処理できます。最初と同じ方法。

それとも、これは TListViews 列の単なるバグですか?-> サブアイテム処理または TListColumns...?

vcl フォーム アプリケーションのサンプル コード (Form1.OnCreate イベントを割り当てます):

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    listview: TListView;
    initButton: TButton;
    addColumn: TButton;
    editColumn: TEdit;
    subItemCount: Integer;
    procedure OnInitClick(Sender: TObject);
    procedure OnAddClick(Sender: TObject);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  listview := TListView.Create(self);
  with listview do
  begin
    Left := 8;
    Top := 8;
    Width := self.Width - 30;
    Height := self.Height - 100;
    Anchors := [akLeft, akTop, akRight, akBottom];
    TabOrder := 0;
    ViewStyle := vsReport;
    Parent := self;
  end;

initButton := TButton.Create(self);
with initButton do
  begin
    left := 8;
    top := listview.Top + listview.Height + 20;
    Width := 75;
    Height := 25;
    TabOrder := 1;
    Caption := 'init';
    OnClick := OnInitClick;
    Parent := self;
  end;

  editColumn := TEdit.Create(self);
  with editColumn do
  begin
    left := initButton.Left + initButton.Width + 30;
    top := listview.Top + listview.Height + 20;
    Width := 120;
    Height := 25;
    TabOrder := 2;
    Parent := self;
    Caption := '';
  end;

  addColumn := TButton.Create(self);
  with addColumn do
  begin
    left := editColumn.Left + editColumn.Width + 10;
    top := listview.Top + listview.Height + 20;
    Width := 75;
    Height := 25;
    TabOrder := 1;
    Enabled := true;
    Caption := 'add';
    OnClick := OnAddClick;
    Parent := self;
  end;

end;

procedure TForm1.OnInitClick(Sender: TObject);
var col: TListColumn;
i, j: integer;
item: TListItem;
begin
  listview.Items.Clear;
  listview.Columns.Clear;

  // add items
  for I := 0 to 2 do
  begin
    col := ListView.Columns.Add;
    col.Caption := 'column ' + IntToStr(i);
    col.Width := 80;
  end;

  // add columns
  for I := 0 to 3 do
  begin
    item := ListView.Items.Add;
    item.Caption := 'ItemCaption';

    // add subitems for each column
    for j := 0 to 1 do
    begin
      item.SubItems.Add('subitem ' + IntToStr(j+1));
    end;
  end;

  subItemCount := 5;
end;

procedure TForm1.OnAddClick(Sender: TObject);
var number: integer;
col: TListColumn;
i: Integer;
ascii: char;
begin
  listview.Columns.BeginUpdate;

  number := StrToInt(editColumn.Text);
  ascii :=  Chr(65 + number);

  // create the new column
  col := TListColumn(ListView.Columns.add());
  col.Width := 80;
  col.Caption := ascii;

  // add the new subitems
  for I := 0 to ListView.Items.Count-1 do
  begin
    ListView.Items[i].SubItems.Add('subitem ' + ascii);
  end;

  // move it to the designated position
  col.Index := number;

  listview.Columns.EndUpdate;

  Inc(subItemCount);
end;

end.

ありがとうございました!


編集: Sertac Akyuz から提案された修正は正常に機能しますが、Delphi ソースコードを変更することは私のプロジェクトの解決策ではないため、使用できません。バグが報告されています。

編集:最初の投稿に含まれていた意図しない2番目の質問を削除し、新しい質問を開きました(リンクされた質問と質問の改訂を参照)。

更新:報告されたバグは、Delphi XE2 Update 4の時点で修正済みとしてクローズされました。

4

1 に答える 1