![]() |
Re: TreeView und ListView
Wie Andreas schon sagt ist der eleganteste Weg einfach das Design (+/-, etc.) der schon vorhandenen Komponenten zu ändern.
Wenn es mit ShellCtrl nicht klappt kannst du mit FindFirst, FindNext, etc. arbeiten. Dort kannst du nämlich auch gleich angeben, ob du Ordner includen willst oder nicht. Bsp.-Quellcode zum Selbststudium:
Delphi-Quellcode:
Wenn du in der Hilfe mal nach "Dateien" suchst und den Filter auf DevStudio für Win32 setzt, danna auf "Methoden zur Ein-/Ausgabe" klickst und noch ein bissl rumsuchst, findest du eine ganze Anleitung dazu.
var
SearchRec: TSearchRec; procedure TForm1.SearchClick(Sender: TObject); begin FindFirst('c:\Program Files\MyProgram\bin\ *.*', faAnyFile, SearchRec); Label1.Caption := SearchRec.Name + ' is ' + IntToStr(SearchRec.Size) + " bytes in size'; end; procedure TForm1.AgainClick(Sender: TObject); begin if FindNext(SearchRec) = 0 then Label1.Caption := SearchRec.Name + ' is ' + IntToStr(SearchRec.Size) + ' bytes in size' else FindClose(SearchRec); end; Ansonsten wie gesagt die schon vorhandenen Komponenten anpassen. Und bei Fragen nochmal posten :) |
Re: TreeView und ListView
Hier ist die Prozedur die die Verzeichnisse ausliest. Jetzt ist die Frage, ob ich hier auch die Dateien schon suche oder ob ich dafür ne eigene Prozedur schreibe, die nur beim Klick auf den ausgegebenen Ordner ausgeführt wird.
Delphi-Quellcode:
procedure TForm2.HoleVerzeichnisse(const Pfad: String; var Tree: TTreeView;var ListView: TListView; Start: TTreeNode);
var SR: TSearchRec; begin if FindFirst(Pfad + '\*.*', faAnyFile, SR) = 0 then repeat Application.ProcessMessages; if (SR.Attr AND faDirectory = faDirectory) AND (SR.Name[1] <> '.') AND (SR.Name[1] <> '_') then begin baum := Tree.Items.Addchild(Start, SR.Name); baum.ImageIndex := 1; baum.StateIndex := 2; HoleVerzeichnisse(Pfad + '\' + SR.Name, Tree, ListView, Baum); end; until (FindNext(SR) <> 0); SysUtils.FindClose(SR); end; |
Re: TreeView und ListView
Du machst beim OnClik des treeviews eine Art "HoleDateien" mit den gleichen Parametern. Die schreibt dann die Elemente von "Pfad" (also dem aus dem Item und den Überitems zusammengesetzten String des TreeViews) wo (SR.Attr AND NOT faDirectory = faAnyFile) und schreibt die in den ListView.
|
Re: TreeView und ListView
1. Muss ich OnClick oder OnChange nehmen?
2. Wie komm ich in der Funktion an den Pfad dran? Also wie kann ich auslesen was ich angeklickt habe? |
Re: TreeView und ListView
So sieht meine Prozedur bis jetzt aus. Jedoch weis ich nicht genau wie ich denn jetzt den Namen in das Item packe.
Ihr wisst was ich meine??
Delphi-Quellcode:
procedure TForm2.HoleDateien(const Pfad: String);
var SR: TSearchRec; begin if FindFirst(Pfad + '\*.*', faAnyFile, SR) = 0 then repeat Application.ProcessMessages; if (SR.Attr OR faAnyfile = faAnyFile) AND (SR.Name[1] <> '.') AND (SR.Name[1] <> '_') then begin ListView1.Items.Add ; ListItem.Caption := (SR.Name); baum.ImageIndex := 1; baum.StateIndex := 2; HoleDateien(Pfad); end; until (FindNext(SR) <> 0); SysUtils.FindClose(SR); end; |
Re: TreeView und ListView
Hier hab ich dir mal ein uraltes Beispiel das dir auch deine +/- Anzeigt vor den Eintraegen im Treeview!
Delphi-Quellcode:
procedure Verzeichnisse_Einlesen(Tree : TTreeView; Verzeichnis : String; Eintrag : TTreeNode; Mit_Dateien : Boolean);
Var SearchRec : TSearchRec; EintragTemp : TTreeNode; List : TStringList; Buf : String; I : Integer; Begin Tree.Items.BeginUpdate; List:= TStringList.Create; If Verzeichnis[Length(Verzeichnis)] <> '\' Then Begin Verzeichnis:= Verzeichnis + '\'; End; If FindFirst(Verzeichnis + '*.*', faDirectory, SearchRec) = 0 Then Begin Repeat If (SearchRec.Attr And faDirectory = faDirectory) And (SearchRec.Name[1] <> '.') Then Begin //Eintrag ist ein Verzeichnis If (SearchRec.Attr And faDirectory > 0) Then Begin //zum aktuellen Eintrag hinzufügen Eintrag:= Tree.Items.AddChild(Eintrag, SearchRec.Name); EintragTemp:= Tree.Items.Add(Nil, Buf); EintragTemp.ImageIndex := 0; //Ummarkiert EintragTemp.SelectedIndex := 0; //Markiert EintragTemp.StateIndex := -1; //Eintrag merken EintragTemp:= Eintrag.Parent; //auf Untereinträge prüfen Verzeichnisse_Einlesen(Tree, Verzeichnis + SearchRec.Name, Eintrag, Mit_Dateien); //Eintrag wiederholen Eintrag:= EintragTemp; End Else //Eintrag ist eine Datei If Mit_Dateien Then Begin If (SearchRec.Name[1] <> '.') And (SearchRec.Name[1] <> '..') Then Begin Tree.Items.AddChild(Eintrag, SearchRec.Name); Eintrag:= Tree.Items.Add(Nil, SearchRec.Name); EintragTemp:= Tree.Items.Add(Nil, List.Strings[I]); EintragTemp.ImageIndex := 2; //Ummarkiert EintragTemp.SelectedIndex := 2; //Markiert EintragTemp.StateIndex := -1; End; End; End; Until FindNext(SearchRec) <> 0; FindClose(SearchRec); End; Tree.Items.EndUpdate; End; procedure TForm1.Button2Click(Sender: TObject); begin TreeView1.Items.Clear; Verzeichnisse_Einlesen(TreeView1, Edit2.Text, Nil, False); end; |
Re: TreeView und ListView
Ich hab es ja jetzt auch schon so, dass er mir das + und - anzeigt. Ich habe halt nur nen problem, dass er mir die Dateien aus den Ordnern in einem ListView anzeigt.
|
Re: TreeView und ListView
Ich mache das immer so:
Delphi-Quellcode:
var MyItem: TListItem;
MyItem := ListView.Items.Add; MyItem.ImageIndex := EinIndex; MyItem.Caption := 'Inhalt der 1. Spalte'; MyItem.SubItems.Add('Inhalt der 2. Spalte'); MyItem.SubItems.Add('Inhalt der 3. Spalte'); |
Re: TreeView und ListView
Ich habe das jetzt hinbekommen.
Leider kann ich im moment nur die Dateien anzeigen die sich hinter dem ersten knoten verbergen. Was muss ich denn ändern, damit der komplette Pfad mitübergeben wird? |
Re: TreeView und ListView
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz