Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Ordner schnell einlesen (https://www.delphipraxis.net/17457-ordner-schnell-einlesen.html)

silentAMD 5. Mär 2004 19:47


Ordner schnell einlesen
 
hi,
wie kann man ordner schneller einlesen? momentan benutze ich dazu eine suchroutine, die bei ordner-fund ihn einfach in den treeview einliest, aber das dauert...

PLEASE HELP!

Luckie 5. Mär 2004 20:26

Re: Ordner schnell einlesen
 
Das suchen dauert wohl nicht, aber das Darstellen im Treeview. Es ist bekannt, dass die Borland Implementation nicht die schnellste ist.

MathiasSimmack 5. Mär 2004 20:36

Re: Ordner schnell einlesen
 
BeginUpdate/EndUpdate sorgen für einen kleinen Geschwindigkeitszuwachs.

SirThornberry 5. Mär 2004 20:44

Re: Ordner schnell einlesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
im Anhang ist ne kleine Komponente die Ordner rekursiv einliest

silentAMD 7. Mär 2004 10:01

Re: Ordner schnell einlesen
 
THX :-D ,

aber bei vielen programmen findet man ja auch son shelltreeview, kann man aus einem "normalen" Treeview kein shelltreeview machen (mit möglichst wenig code)?

SirThornberry 16. Mär 2004 22:30

Re: Ordner schnell einlesen
 
Das ShellTreeView müsste bei delphi schon dabei sein unter SAMPLES außer du hast es bei der Installation von Delphi nicht mit ausgewählt (abgewählt). Der Source dazu müsste dann mit im Demoverzeichnis sein. Bei Delphi7 Enterprise und Delphi6 Personal in "Demos\ShellControls" und da die Unit "ShellCtrls.pas".

silentAMD 21. Mär 2004 12:52

Re: Ordner schnell einlesen
 
@SirThornberry: ja gut, aber ich brauche eine ohne kontextmenü, ohne icons, und ohne sonstige funktionen.

ich hab mir vorgestellt, dass ich in einem onclick bzw. onchange ereignis einer treeview ein bischen code einbauen kann, das aus der "normalen" treeview eine kleine shelltreeview macht, die sich schnell einlesen lässt.

- OHNE ICONS
- OHNE KONTEXTMENÜ
- OHNE SONSTIGE FUNKTIONEN
- MIT MÖGLICHST WENIG CODE
- SCHNELL!!!


PLEASEE HELP!!!

SirThornberry 21. Mär 2004 13:15

Re: Ordner schnell einlesen
 
Der source ist doch dabei, änder den doch einfach ab

Christian Seehase 21. Mär 2004 13:16

Re: Ordner schnell einlesen
 
Moin SilentAMD,

wenn Dir Geschwindigkeit das Wichtigste ist, dann mach' es doch wie Windows:
Beim ersten Start wird nur die oberste Ebene angezeigt (z.B. die Laufwerke), und dann auf Doppelklick jeweils die Verzeichnisse der nächsten Ebene.

silentAMD 21. Mär 2004 13:26

Re: Ordner schnell einlesen
 
leider weiss ich garnicht, was ich da rauskopieren soll :( :gruebel: :pale: :oops:

@Christian Seehase: so hab ich mir das ja vorgestellt, nur hab ich keine ahnung, wie ich bei einer treeview das plus anzeigen kann, wenn ein unterordner vorhanden ist und wie man das ganze im child einliest.

Christian Seehase 21. Mär 2004 13:33

Re: Ordner schnell einlesen
 
Moin SilentAMD,

für das [+] musst Du nur die Eigenschaft HasChildren des jeweiligen Nodes auf true setzen.
Es spielt keine Rolle ob das tatsächlich der Fall ist, dass kannst Du dann, wie auch der Explorer das macht, von Fall zu Fall überprüfen, und ggf. korrigieren.

Zitat:

Zitat von silentAMD
und wie man das ganze im child einliest.

das hab' ich jetzt nicht verstanden.

silentAMD 21. Mär 2004 13:39

Re: Ordner schnell einlesen
 
na wie man das ganze in der selektierten treenode einliest (und wie weit).
ich hätte das plus nur dann gern angezeigt, wenn tatsächlich ein unterordner vorhanden ist

Christian Seehase 21. Mär 2004 14:48

Re: Ordner schnell einlesen
 
Moin SilentAMD,

Zitat:

Zitat von silentAMD
wie man das ganze in der selektierten treenode einliest (und wie weit).

Weisst Du jetzt nicht, wie man einen Treeview aufbaut, oder wo liegt das Problem?
Was meinst Du mit "wie weit"?

Zitat:

Zitat von silentAMD
ich hätte das plus nur dann gern angezeigt, wenn tatsächlich ein unterordner vorhanden ist

Dann musst Du halt, mit Hilfe von FindFirst usw., die nächste Verzeichnisebene durchgehen, und prüfen, ob noch mindestens ein Verzeichnis vorhanden ist. In Abhängigkeit vom Ergebnis dieser Prüfung, setzt Du dann die Eigenschaft HasChildren.
Das kann aber Deiner Hauptforderung nach Geschwindigkeit zuwiderlaufen.

silentAMD 21. Mär 2004 18:45

Re: Ordner schnell einlesen
 
Hi,
nach langem programmieren: hier der code:
Delphi-Quellcode:
procedure TFenster.GetDirs(const ADirectory: String; var Tree: TTreeView; Start: TTreeNode);
function ReadSubs(s: String): Boolean;
var srec: TSearchRec; found: Integer;
begin
 RESULT := FALSE;
 found := FindFirst(Slash(s)+'*.*', faDirectory, srec);
  try
   while not(RESULT) and (found=0) do begin
    if ((srec.Attr and faDirectory) <> 0) and ((srec.Name <> '.') and (srec.Name <> '..')) then
    RESULT := TRUE;
    found := FindNext(srec);
   end;
  finally
   FindClose(srec);
  end;
end;
var rec: TSearchRec;
begin
 if FindFirst(Slash(ADirectory)+'*.*', faDirectory, rec) = 0 then begin
  try
   repeat
    if ((rec.Attr and faDirectory) <> 0) and ((rec.Name <> '.') and (rec.Name <> '..')) then
     begin
      with Tree.Items.AddChild(Start, rec.Name) do
       if ReadSubs(Slash(ADirectory)+rec.Name) then
      HasChildren := True;
     end;
   until FindNext(rec) <> 0;
  finally
   FindClose(rec);
  end;
 end;
end;
Delphi-Quellcode:
function TFenster.Slash(s: String): String;
begin
 RESULT := s+'\'
end;
Delphi-Quellcode:
procedure TFenster.lDirExpanding(Sender: TObject; Node: TTreeNode;
  var AllowExpansion: Boolean);
var i: Integer;
begin
 for i := 0 to Node.Count-1 do
  Node.getFirstChild.Delete;
 GetDirs(Slash(Paren(Node, lDir)), lDir, Node);
 Node.AlphaSort(FALSE)
end;
Delphi-Quellcode:
procedure TFenster.FormCreate(Sender: TObject);
begin
 lDir.Items.BeginUpdate;
 GetDirs('C:', lDir, lDir.Items.AddChild(nil, 'C:'));
 lDir.Items.EndUpdate;
 lDir.AlphaSort(TRUE);
 lDir.Items.Item[0].Expand(FALSE);
end;


bitte helft mir, den code zu vereinfachen oder verbessern. :coder:
z.b. für ein leichteres einlesen bei schon vorhandenen einträgen (beim expandieren werden zuerst alle gelöscht, dann neu eingelesen) oder für leichteres erkennen, ob ein unterordner vorhanden ist.

PLEASE HELP!!

silentAMD 22. Mär 2004 13:00

Re: Ordner schnell einlesen
 
keine vorschläge?? :?: :?: :gruebel: :cyclops:

schade... :cry:


wenn das der beste code ist, benutz ich ihn einfach.

Alexander 22. Mär 2004 13:06

Re: Ordner schnell einlesen
 
Rück das erstmal vernünftig ein ;-)
Ich habe mir das jetzt auch nciht vernünftig angekuckt, aber du hast keine BeginUpdate/EndUpdate Blöcke benutzt. Die bringen auhc einen Geschwindigkeitsvorteil, da wie Luckie schon gesagt, dauert das ausgeben am längsten... ;-)

silentAMD 22. Mär 2004 13:16

Re: Ordner schnell einlesen
 
ich wollts eben einrücken, klappt aber nur an einigen stellen. :(

das mit begin und endupdate ergibt in der listview ein störendes blinken (wenns erst aus- dann wieder eingeblendet wird), das will ich vermeiden. :mrgreen:

aber sonst: ist der source ok???? :warn:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:35 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