Sto tentando di aggiungere una colonna tra le colonne esistenti in un TListView. Per questo aggiungo la nuova colonna alla fine e la sposto impostando il suo indice sul valore designato. Funziona, fino all'aggiunta di un'altra nuova colonna.TListView: VCL perde l'ordine delle colonne se si aggiunge una colonna
Cosa ho fatto: Aggiungere la colonna nell'ultima posizione (Colonne.Aggiunte) e aggiungere anche il sottotitolo nell'ultima posizione (Sottitems.Add). Successivamente sposto la colonna impostando l'indice nella posizione corretta. Questo funziona bene finché è solo una colonna che viene aggiunta. Quando si aggiunge una seconda nuova colonna, i sottotemi si rovinano. Il nuovo sottoelemento della prima colonna viene spostato nell'ultima posizione, ad es. così:
0 | 1 | new A | new B | 3
Caption | old sub 1 | old sub 3 | new Sub B | new sub A
Sarei molto felice se qualcuno potesse aiutare!
Ad esempio, c'è forse un comando o un messaggio che posso inviare a ListView in modo che aggiorni o salvi la colonna Colonna -> Mappatura sottotemia che potrei usare dopo aver aggiunto la prima nuova colonna e le sue sotto-voci in modo da poter gestire il seconda nuova colonna allo stesso modo della prima.
Oppure si tratta solo di un bug della colonna TListViews -> gestione di sottotitoli o TListColumns ...?
codice di esempio per un'applicazione forme VCL (assegnare l'evento 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.
Grazie!
Edit: La correzione suggerita da Sertac Akyuz funziona bene, anche se non posso usarlo perché cambiare il codice sorgente Delphi non è una soluzione per il mio progetto. Bug è segnalato.
Modifica: Rimossa la seconda domanda non voluta inclusa nel primo post e aperta una nuova domanda (vedi domanda collegata e domanda-revisione).
Aggiornamento: Il reported bug è ora chiuso fisso come di Delphi XE2 Update 4.
Suppongo che ci sia un aggiornamento/aggiornamento mancante da qualche parte. Non sono sicuro di cosa sia. Detto questo, questo suona come un altro caso in cui le visualizzazioni della lista delle modalità virtuali brillerebbero. –
Ma sono disponibili solo per .Net, no? Ho lo stesso problema con il progetto C# .Net equivalente e forse posso usarlo lì. – torno
No. La visualizzazione elenco di Windows supporta la modalità virtuale e Delphi lo avvolge molto bene. Se stai manipolando le colonne in fase di esecuzione è sicuramente la strada da percorrere.Tutti gli altri qui ti indicherebbero alla visualizzazione ad albero virtuale, ma a me piace il controllo nativo. –