Bir TListView'da varolan sütunlar arasında bir sütun eklemeye çalışıyorum. Sonunda yeni sütunu ekledim ve indeksini belirlenen değere ayarlayarak taşıdım. Bu yeni bir sütun ekleyene kadar çalışır.TListView: Bir sütun eklerseniz, VCL sütunları kaybeder
Ne yaptım: Sütunu son konumda (Columns.Add) ekleyin ve alt pozisyonu da son konuma ekleyin (Subitems.Add). Daha sonra indeksi doğru konuma ayarlayarak sütunu hareket ettiririm. Bu, eklendiği yalnızca bir sütun olduğu sürece iyi çalışır. İkinci bir yeni sütun eklerken, alt öğeler bozulur. İlk sütunun yeni alt alanı son konuma taşınır, ör. bunun gibi:
0 | 1 | new A | new B | 3
Caption | old sub 1 | old sub 3 | new Sub B | new sub A
Eğer birisi size yardımcı olabilirse çok mutlu olurum!
Örneğin, ListView'e gönderebildiğim bir komut veya mesaj olabilir, böylece yeni bir sütun ekledikten sonra kullanabileceğim sütun -> Subitem eşleştirmesi ve alt aşamaları kullanabilirim. İkinci yeni sütun ilk ile aynı şekilde. Veya bu bir TListViews sütunu -> subitem kullanımı ya da TListColumns ... hatası mıdır? Bir vcl form uygulaması için
örnek kodu (Form1.OnCreate olay atamak):
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.
teşekkür ederiz!
Düzenleme: Delphi sourcecode değiştirme Projem için bir çözüm olduğu için bunu kullanamaz rağmen Sertaç Akyüz dan önerilen düzeltme, gayet iyi çalışıyor. Hata bildirildi.
Düzenleme: İlk gönderide istem dışı bulunan ikinci soruyu kaldırdı ve yeni soru açtı (Bkz. Bağlantılı soru ve Soru düzeltme).
Güncelleme: Delphi XE2 Update 4 itibariyle sabit olarak reported bug anda kapalı.
Sanırım bir yerde eksik yenileme/güncelleme var. Olduğundan emin değil. Bu, sanal mod listesi görünümlerinin parlayacağı başka bir durum gibi görünüyor. –
Ama onlar sadece .Net için mevcut, değil mi? Aynı sorunu C# .Net projesiyle aldım ve belki orada kullanabilirim. – torno
Hayır. Windows listesi görünümü sanal modunu destekler ve Delphi bunu çok güzel bir şekilde sarar. Çalışma zamanında sütunları manipüle ediyorsanız, kesinlikle gitmek için bir yoldur.Buradaki herkes sanal ağaç görünümünde size işaret ederdi ama ben kendimi yerel kontrolü severim. –