Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Items in ListView erstellen


Maisinator - Do 29.10.09 17:22
Titel: Items in ListView erstellen
Hallo,

ich habe ein Programm geschrieben, welches in eine LstView den Inhalt von bestimmten ordnern schreiben soll. Nun soll man in den Programm auch mehrere Ordner in verschiedenen ListView "überwachen" können, weshalb man dynamisch neue TabSheet und darauf eine neue ListView erzeugen kann. Das Proglem daran ist die Prozedur zum "Finden" der Dateien. Wie bekomme ich das hin, dass diese Prozedur auch von den dynamischen ListViews genutzt werden kann? Wenn ich einen eintrag in einer ListView erstellen möchte, muss ich ja immer ein vorhandene ListView auswählen. Da die weiteren aber erst zur Laufzeit erstellt werden, weiß ich nicht, wie ich auch diese mit der Funktion "ansprechen" kann.

Kann mir da jemand Helfen?

DANKE


Andreas L. - Do 29.10.09 17:31

Entweder du verwaltest die dynamischen ListViews in einer TObjectList oder du arbeitest mit FindComponent. Ersteres ist sauberer, der Zugriff auf eine ListView würde dann über


Delphi-Quelltext
1:
TListView(DeineObjectList.Items[Index])                    


gehen.


Maisinator - Do 29.10.09 17:54

Ok, versuch ich. Wenn du mir noch verräten würdest, wie ich die dynamischen ListViews in diese Objectlist eintragen kann...


elundril - Do 29.10.09 18:07

ohne objectlist je verwendet zu haben, trau ich mich wetten das diese eine methode namens add zur verfügung stellt. ;)

lg elundril


Maisinator - Do 29.10.09 18:21

Jop, hast recht...

Aber iwie will das nicht ganz so, wie ich es will...


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var
item: TListItem;
...
begin
item:= ??
with item do
begin
item.Caption:= name;
item.SubItems.Add(typ);
item.SubItems.Add((Format('%.2f',[size])) + ' MB');
end;


wie müsste es dann an der stelle von ?? aussehen? normal hab ich da immer UMain.Form1.ListView1.Items.Add stehen gehabt... kann mir jemand helfen?


Andreas L. - Do 29.10.09 18:32

Also:

1. Beim Formular eine globale Variable vom Typ TObjectList erstellen (Unit ContNrs einbinden).
2. Im FormCreate die ObjectList erstellen:

Delphi-Quelltext
1:
  DeineVar := TObjectList.Create;                    

3. In FormDestroy wieder zerstören:

Delphi-Quelltext
1:
  DeineVar.Free;                    

4. In dem Code-Teil wo du die neuen ListViews erstellst musst du nur nachdem alle Eigenschaften gesetzt wurden die ListView der Liste hinzufügen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var
  NeueListView: TListView;
begin
  NeueListView := TListView.Create(Self);
  with NeueListView do
  begin
    Parent := Self;
    //etc.
  end;
  DeineVar.Add(NeueListView):
end;


Fertig.

Was genau du jetzt mit den ListItem von obigen Post machen willst, ist mir nicht ganz klar... Vllt. zeigst du einfach mal ein bisschen Code.


Maisinator - Do 29.10.09 18:35

user profile iconAndreas L. hat folgendes geschrieben Zum zitierten Posting springen:

Was genau du jetzt mit den ListItem von obigen Post machen willst, ist mir nicht ganz klar... Vllt. zeigst du einfach mal ein bisschen Code.


Ich möchte damit einen neuen Eintrag in der entsprechenden ListView erstellen... hat man mir damals in diesem Forum so empfohlen...


Andreas L. - Do 29.10.09 18:39

Na dann:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
begin
  with TListView(DeineVar.Items[Index]).Items.Add do
  begin
   Caption := '';
   ImageIndex := 5;
   //...
  end;
end;


Maisinator - Do 29.10.09 18:59

Sorry, aber irgendwie steh ich grad voll auf'm Schlauch...

Hier mal mein ganzer Code:

Neue ListView erstellen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
procedure TForm2.ToolButton2Click(Sender: TObject);
var tabsheet: TTabSheet;
    listview: TListView;
    colums: TListColumn;
begin
  tabsheet:= TTabSheet.Create(UMain.Form1.PageControl1);
    with tabsheet do
      PageControl:= UMain.Form1.PageControl1;
      listview:= TListView.CreateParented(TabSheet.Handle);
        with listview do
          begin
            listview.Align:= alClient;
            listview.Font.Size:= 10;
            listview.Font.Name:= 'Arial';
            listview.ViewStyle:= vsReport;
            listview.ColumnClick:= false;
            listview.RowSelect:= true;
          end;
        with listview.Columns.Add do
          begin
            listview.Column[0].Caption:= 'Dateiname';
            listview.Column[0].AutoSize:= true;
          end;
        with listview.Columns.Add do
          begin
            listview.Column[1].Caption:= 'Dateityp';
            listview.Column[1].Width:= 70;
          end;
        with listview.Columns.Add do
          begin
            listview.Column[2].Caption:= 'Größe';
            listview.Column[2].Width:= 70;
          end;
      UMain.Form1.objektliste.Add(listview);
      tabsheet.InsertControl(listview);
      UMain.Form1.PageControl1.Pages[UMain.Form1.PageControl1.PageCount - 1].Caption:= LabeledEdit1.Text;
      UMain.Form1.PageControl1.SelectNextPage(true, true);
  UScribt.SearchData(LabeledEdit2.Text);
  Close;
end;

--> funktioniert!

Der eigentliche Code zum suchen der Dateien:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
procedure SearchData(path: string);
var FileInfos: TSearchRec;
    filelength: integer;
    size: double;
    typ, name: string;
    i: Integer;
begin
for i := 1 to UMain.Form1.PageControl1.PageCount do
  begin
    if FindFirst(path, 0, FileInfos) = 0 then try
      begin
        repeat
          filelength:= length(FileInfos.Name);
          name:= Copy(FileInfos.Name, 0, filelength - 5);
          typ:= Copy(FileInfos.Name, filelength - 33);
          size:= FileInfos.Size / 1024 /  1024;
            with TListView(UMain.Form1.objektliste.Items[i]).Items.Add do
              begin
                Caption:= name;
                SubItems.Add(typ);
                SubItems.Add((Format('%.2f',[size])) + ' MB');
              end;
        until FindNext(FileInfos) <> 0;
      end;
      finally
        FindClose(FileInfos);
      end;
  end;
end;

--> funktioniert nicht!

Kann mir jemand Helfen?