Autor Beitrag
Knuffikoeln
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: So 23.02.03 16:29 
Hi zusammen.

ich hab da nen kleines Problem.

Folgendes bringtm ich zu verzeweiflung:

Ich will gerne ähnlich wie in einem treeview Dateien darstellen ,der Benutzer soll ordner und dateien auswählen können und diese dann verschieben können in eine andere "Liste"

Habe mir TreeView eben mal angeguckt aber werd nicht so ganz schlau daraus ,wollt nur mal fragen ob jemand was anderes kennt was dem Nahe kommt.

Gruß Jörg

P.S. Habe schon eine Funktion die mir eine Stringliste mit den Dateinamen und so gibt.
derDoc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 623

Win Vista Prof
D2007 Prof
BeitragVerfasst: So 23.02.03 20:50 
Du willst also irgendwas machen, was ähnlich dem TreeView ist? Was soll deine Variante denn können? Vielleicht kannst du ja eine neue Komponente von TTreeView ableiten.

_________________
MfG derDoc
There are only 10 types of people: those who understand binary and those who don't.
Knuffikoeln Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: So 23.02.03 21:18 
ok, also folgendes soll meine "Komponente" können :)

Soll ähnlich wie nen TreeView sein, der Benutzer soll einzelne Dateien/ordner auswhälen können und diese in eine andere "Liste" beamen. Also auf gut Deutsch ne Art Dateiauswahl.


Zu den Dateien gehört nicht nur der Name, sondern auch Größe, getrennte angabe von Dateiname und Pfad, eventl noch weiter, auch vom user selbst zu definierende Daten.


Ich denke gerade mehr udn mehr drüber nach, ic hglaub nen treeview ist garnicht so ungeeignet :)
kiwicht
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1021

Win 7, MacOS
Delphi x, VBA, PHP, ...
BeitragVerfasst: Mo 24.02.03 08:35 
Hallöchen....

auf der Suche nach so etwas bin ich auch schon seit geraumer Zeit. Mit TreeView dürftest du eigentlich schon sehr weit kommen. Ansonsten sind die meisten der nützlichen vergleichbaren 3rdParty-Plug Ins leider Shareware:
Kannst ja mal nach folgenden googeln, mit denen hab ich mich erstmal angefreundet:
-EldoS^
-Ortus Shell Components
-JAM Software

Ich würd ja auch direkte Links posten, aber die hab ich nicht mehr im Kopf, viele davon sind von Torry´s Delphi Page.
Wenn du noch andere gute (Freeware ;) ) Komponenten findest, kannst du die ja ma posten, würd mich freuen

mfg
KiWicht
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 24.02.03 08:55 
Aus meiner Schatzkiste:
ausblenden volle Höhe 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:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
{ Ich schreibe jetzt mal über die Möglichkeit, Verzeichnisbäume in ein TreeView einzulesen.
Damit lässt sich z.B. ein Verzeichnisbaum besser in eine Programmoberfläche integrieren, als ein
'SelectDirectory' - Fenster. 
Hier erst mal für die Ungeduldigen die Prozedur, weiter unten
findet ihr noch eine 'übersichtlichere', falls ihr nur
Verzeichnisse einlesen wollt'.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
code: }
procedure TForm1.Einlesen(Tree : TTreeView; Verzeichnis : String; Eintrag : TTreeNode; Mit_Dateien : Boolean);
Var
SearchRec   : TSearchRec;
EintragTemp : TTreeNode;
begin
  Tree.Items.BeginUpdate;
  If Verzeichnis[length(Verzeichnis)]<>'\' then
    Verzeichnis:=Verzeichnis+'\';
  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
              //zum aktuellen Eintrag hinzufügen
              Eintrag := Tree.Items.AddChild(Eintrag, SearchRec.Name);
            //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
            If SearchRec.Name[1] <> '.' then
              Tree.Items.AddChild(Eintrag, SearchRec.Name);
      until FindNext(SearchRec)<>0;
      FindClose(SearchRec);
    end;
    Tree.Items.EndUpdate;
end;
{ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Aufruf z.B. mit: }
// TreeView1.Items.Clear;
Verzeichnisse_Einlesen(TreeView1, 'C:\', nil, false);
oder wenn zum Beispiel 'C:\' als oberster 'Knoten' im TreeView stehen soll, dann:
var
TN : TTreeNode;
....
....
// TreeView1.Items.Clear;
TN := nil;
TN := TreeView1.Items.AddFirst(TN, 'C:\');
Verzeichnisse_Einlesen(TreeView1, 'C:\', TN, false);
das gleiche geht natürlich auch z.B. mit 'D:\' oder anderen Laufwerksbuchstaben,
man kann auch nur beispielsweise einen Ordner durchsuchen lassen, wie im folgenden
Beispiel 'Eigene Dateien':
var
TN : TTreeNode;
....
// TreeView1.Items.Clear;
TN := nil;
TN := TreeView1.Items.AddFirst(TN, 'C:\Eigene Dateien');
Verzeichnisse_Einlesen(TreeView1, 'C:\Eigene Dateien', TN, false); 
{ Wenn ihr es jetzt schon ausprobiert hat, werdet ihr sicherlich merken, dass das Einlesen
recht lange dauert, so kann man die oben genannte Prozedur auch geringfügig verbessern
und vor allem übersichtlicher machen.:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
code: }
procedure TForm1.Verzeichnisse_Einlesen(Tree : TTreeView; Verzeichnis : String; Eintrag : TTreeNode);
Var
SearchRec   : TSearchRec;
EintragTemp : TTreeNode;
begin
  Tree.Items.BeginUpdate;
  If Verzeichnis[length(Verzeichnis)]<>'\' then
    Verzeichnis:=Verzeichnis+'\';
  If FindFirst(Verzeichnis + '*.*', faDirectory, SearchRec)=0 then
    repeat
      If (SearchRec.Attr and faDirectory > 0)
         and (SearchRec.Name[1] <> '.') then
        begin
          Eintrag := Tree.Items.AddChild(Eintrag, SearchRec.Name);
          EintragTemp := Eintrag.Parent;
          Verzeichnisse_Einlesen(Tree,Verzeichnis + SearchRec.Name,Eintrag);
          Eintrag := EintragTemp;
        end;
    until FindNext(SearchRec)<>0;
  FindClose(SearchRec);
  Tree.Items.EndUpdate;
end;
{ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Diese Prozedur kann nur zum Verzeichnisse einlesen verwendet werden.
Die Kommentare habe ich jetzt gelöscht, die stehen ja schon in der oberen Prozedur.
Sie wirken sich jedoch nicht auf die Geschwindigkeit aus, da sie der Compiler wegoptimiert.
Da das Ergebnis im TreeView optisch nicht soviel hergibt, weil keine Bildchen angezeigt werden, kann
man eine TImageList erstellen und dort das gewünschte Ordner-Symbol eintragen. Dann im OI beim TreeView
bei 'Images' noch auf den DropDown-Pfeil klicken, und die ImageList auswählen.
Und schon ist etwas Farbe im Spiel. 
Erklärung zur Prozedur:
Falls es doch noch welche geben sollte, die eine kleine Erklärung haben wollen, beschreibe ich mal die Prozedur,
in diesem Fall die kürzere der Beiden.
Das ganze basiert auf den Funktionen
FindFirst (sucht in einem verzeichnis nach dem ersten Vorkommen einer Datei mit den angegebenen Attributen)
FindNext (sucht nach dem nächsten Eintrag, der mit den Attributen von FindFirst übereinstimmt)
FindClose (beendet eine Suche und gibt den Speicher frei)
wenn ihr weitere Informationen darüber haben wollt', dann sucht mal in der Hilfe-Datei unter diesen Begriffen.
Wenn ein Verzeichnis gefunden wird ( If (SearchRec.Attr and faDirectory > 0) then ), dann wird dieses Verzeichnis
ins Treeview eingetragen, und die Prozedur nochmal aufgerufen. Es handelt sich jedoch dabei nich um dieselbe
Prozedur, sondern um die gleiche mit dem gleichen Namen. Dieser Aufruf hat den Zweck, auch nach Unterordnern zu
suchen und diese einzutragen. Das ganze nennt man rekursives Aufrufen, vielleicht kann man sich das ja mal merken.
So, da ich hier nicht behaupten will, dass ich das alles alleine 'rausgefunden habe, sage ich euch die Quelle, von
der ich das hier habe und zwar ist das Pics-Software <www.pics-software.de>
Also, wenn ihr noch Fragen oder irgendwas zu bemerken habt, dann mailt mir mal. Meine Email-Adresse findet ihr unter }

Autor unbekannt.