Tech-Ecke / Delphi Inhalt / TShellListView + TShellComboBox + TShellTreeView

 

     TShellListView + TShellComboBox + TShellTreeView

 

   Grundlegendes

Die TshellListView und die TshellComboBox, sowie auch die TShellTreeView sind, sich ergänzende Komponenten um Dateien und deren  Verzeichnisstrukturen anzuzeigen. Jede Komponente für sich betrachte, ist zwar alleine auch funktionsfähig, jedoch macht es Sinn zu einer TShellListView mindestens eine TShellComboBox oder gleich eine TShellTreeView zu setzten.

Verlinkung der Komponenten:

Damit die einzelnen Komponenten auch aufeinander reagieren, müssen sie im Objektinspektor/Ereignisse bei Linkage miteinander Verknüpft werden. z.B.:  Bei der TShellListView1, dort bei TShellComboBox, beispielsweise die TShellCombobox1 angeben...

Setzen des Root-Verzeichnisses

Damit die Komponenten wissen, von wo ausgehend sie navigiert werden sollen, muss man im Objektinspektor/Eigenschaften bei Root ein Verzeichnis angeben z.B. C:\ (für alle Komponenten), wenn man vom Arbeitsplatz aus starten möchte dann rfMyComputer eintragen.

Hat man dies erledigt, so kann man sich mittels diesen Komponenten bereits, wie beim Windows Explorer durch die Verzeichnisse klicken.

   Pfad bzw. Dateipfad auslesen ( var Pfad: String;)

  // mit ShellListView 
 Pfad := ShellListView1.Folders[ShellListView1.ItemIndex].PathName;  
// Dateipfad

// mit ShellTreeView
 Pfad := ShellTreeView1.SelectedFolder.PathName;  // nur Pfad

 

   TShellTreeView aktualisieren (komplett über Root-Node -> Item[0])

  ShellTreeView1.Refresh(ShellTreeView1.Items[0]);
 

   Aktuelles Verzeichnis von TShellComboBox auslesen  ( var Pfad: String;)

   Pfad := ShellComboBox1.Path
 

 

   Verzeichnis während der Laufzeit setzen:

   ShellListView1.Path := ('C:\');
 

Root-Verzeichnis setzten - Die ShellListView enthält nur die Struktur die sich hinter dem angegebenen Verzeichnis befindet

   ShellListView1.Root := ('C:\');
 

Wenn die ShellListView1 z.B. mit der ShellComboBox1 verknüpft ist, so wird die ShellComboBox1 auch den neu gesetzten Pfad anzeigen.

   Filter auf TShellListView anwenden

Möchte man in der ShellListView nur Dateien eines bestimmten Typs anzeigen, so bedient man sich dem OnAddFolder Ereignis. Also im Objektinspektor/Ereignisse hinter OnAddFolder folgenden Quellcode hinterlegen.

   var
     einfuegen: Boolean;
  
begin
     einfuegen := false;
    
if Pos('.jpg', AnsiLowerCase(AFolder.DisplayName)) > 0 then einfuegen := true;
    
if Pos('.gif', AnsiLowerCase(AFolder.DisplayName)) > 0 then einfuegen := true;
    
if Pos('.bmp', AnsiLowerCase(AFolder.DisplayName)) > 0 then einfuegen := true;
    
if Pos('.', AnsiLowerCase(AFolder.DisplayName)) = 0 then einfuegen := true;   // damit auch Ordner angezeigt werden
    
if einfuegen = false then CanAdd := false;
  
end;
 

   UpFolder-Button (eine Ebene höher springen) für TShellListView

Das Beispiel bezieht sich auf die ShellListView1 in Kombination mit ShellComboBox1. Dazu einen Button auf das Form ziehen und hinter OnClick folgenden Code hinterlegen:

   var
     Pfad: String;

   begin
     if ShellComboBox1.Path = ('Arbeitsplatz') then exit;   // Arbeitsplatz ist Sprachenabhängig (siehe Text unten)
     Pfad := ShellComboBox1.Path;
     ShellListView1.Root := Pfad;
    
if pos('\',Pfad) = 0 then begin ShellListView1.Root := ('rfMyComputer'); exit; end;
    
if length(Pfad) = 3 then begin ShellListView1.Root := ('rfMyComputer'); exit; end;
    
repeat
        Pfad := copy(Pfad,
0,length(Pfad)-1);
    
until copy(Pfad,length(Pfad),length(Pfad)) = ('\');
     Pfad := copy(Pfad,
0,length(Pfad)-1);
    
if copy(Pfad,length(Pfad),length(Pfad)) = (':') then begin Pfad := Pfad + ('\'); ShellListView1.Root := Pfad; exit; end;
    
if DirectoryExists(Pfad) = false then begin ShellListView1.Root := ('rfMyComputer'); exit; end
    
else ShellListView1.Root := Pfad;
  
end;
 

Gelangt man bei der Navigation bis zur Root des entsprechenden Laufwerks, so wird beim nächsten Klick auf den UpFolder-Button der Arbeitsplatz angezeigt. Bei einem weiteren Klick soll nichts passieren, hierfür ist vierte Zeile im Quellcode verantwortlich. Leider funktioniert das so nur bei Rechnern mit deutschsprachigem Windows. Soll es auch mit anderssprachigen Windowsversionen funktionieren, so muss man die Bezeichnung des Arbeitsplatzes für die entsprechende Sprache ermitteln.
Hierfür gibt es ein recht simples Verfahren. Als erstes setzt man bei allen verlinkten Shell-Komponenten, im Objektinspektor/Eigenschaften Root auf
rfMyComputer. Dann deklariert man eine globale Variable namens Arbeitsplatz (siehe hier). Zum Schluss fügt man, für das Form, auf dem sich die ShellComboBox1 befindet, im Objektinspektor/Ereignisse bei OnCreate folgenden Code hinzu:

   Arbeitsplatz := ShellComboBox1.Path;
 

Damit wird der Name von Arbeitsplatz, gleich wie er auch immer in den einzelnen Sprachen benannt wird, in die Variable Arbeitsplatz geschrieben und kann somit in dem oben gezeigten Quellcode benutzt werden. Dementsprechend wäre dann die Zeile 4 in:

   if ShellComboBox1.Path = (Arbeitsplatz) then exit;
 

zu ändern.

 

Die Option Drucken funktioniert erst ab Netscape V4.0 bzw. I-Explorer 5.0 !

[letzte Aktualisierung 01.11.2008]