// Es werden die Ordner eines Baumes in ein Treeview eingelesen. Dazu setzt man
// zunächst eine Imageliste auf das Formular und füllt diese mit den hier
// aufgeführten (od. ähnl.) Symbolen. Ich benutze Icons in der Größe 16 x 16.
// Voraussetzung:
//
Treeview.Images := NameDerImageListe und TreeView.ReadOnly := True

0 1 2 3 4 5 6

// Getestet mit D4 unter NT4

var merkpfad: string; 
 
procedure findordner(tv: TTreeView; pfad: string; tn: TTreenode); 
var sr: TWin32FindData; 
  h: THandle; 
begin 
  h := FindFirstFile(PChar(pfad + '*.*'), sr); 
  if h <> INVALID_HANDLE_VALUE then repeat 
      if (sr.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY > 0) 
        and (string(sr.cFileName) <> '.') and (string(sr.cFileName) <> '..') 
        then begin 
        tn := tv.Items.addchild(tn, sr.cFileName); 
        tn.imageindex := 5; 
        tn.selectedindex := 6; 
        findordner(tv, pfad + sr.cFileName + '\', tn); 
        tn := tn.parent; 
      end; 
    until Findnextfile(h, sr) = false; 
  windows.FindClose(h); 
end; 
 
procedure baum(tv: TTreeView; pfad: string); 
var ttn: TTreeNode; 
  fnam: string; 
begin 
  screen.cursor := crhourglass; 
  merkpfad := pfad; 
  if ansilastchar(merkpfad) = '\' then delete(merkpfad, length(merkpfad), 1); 
  tv.Items.BeginUpdate; 
  tv.Items.Clear; 
  if ansilastchar(pfad) <> '\' then pfad := pfad + '\'; 
  if DirectoryExists(pfad) then begin 
    fnam := copy(pfad, 1, length(pfad) - 1); 
    fnam := copy(fnam, lastdelimiter('\', fnam) + 1, max_path); 
    ttn := tv.Items.Add(nil, fnam); 
    if (length(pfad) = 3) and (pfad[2] = ':') then begin 
      case getdrivetype(pchar(pfad)) of 
        DRIVE_REMOVABLE: ttn.imageindex := 0; 
        DRIVE_FIXED: ttn.imageindex := 1; 
        DRIVE_CDROM: ttn.imageindex := 2; 
        DRIVE_REMOTE: ttn.imageindex := 3; 
        DRIVE_RAMDISK: ttn.imageindex := 4; 
      end; 
      ttn.selectedindex := ttn.imageindex; 
    end else begin 
      ttn.imageindex := 5; 
      ttn.selectedindex := 6; 
    end; 
    findordner(tv, pfad, ttn); 
    tv.alphasort; 
    tv.Items[0].expand(false); 
    tv.selected := tv.Items[0]; 
  end; 
  tv.Items.EndUpdate; 
  tv.setfocus; 
  screen.cursor := crdefault; 
end; 
 
//---------------- Beispielaufrufe --------------- 
 
// Beim Ändern einer Drivecombobox wird das entsprechende 
// Laufwerk eingelesen 
procedure TForm2.DriveComboBox1Change(Sender: TObject); 
begin 
  baum(TreeView1, DriveComboBox1.drive + ':\'); 
end; 
 
// Das Windows-Verzeichnis wird eingelesen 
procedure TForm2.Button1Click(Sender: TObject); 
var s: string; 
begin 
  setlength(s, max_path); 
  setlength(s, getwindowsdirectory(pchar(s), max_path)); 
  baum(treeview1, s); 
end; 
 
//-------------------------------------------------- 
 
// Beim Anklicken eines Ordners zeigt Label1 den 
// kompletten Pfad an 
function findPfad(Node: TTreeNode): string; 
begin 
  if Node = nil then result := '' 
  else begin 
    if Node.Parent <> nil then 
      result := findPfad(Node.Parent) + '\' + Node.Text 
    else result := merkpfad; 
  end; 
end; 
 
procedure TForm2.TreeView1Change(Sender: TObject; Node: TTreeNode); 
begin 
  label1.caption := findpfad(TreeView1.selected); 
end;

// evtl. die Länge des Labels kürzen; siehe dazu:
// lange Dateinamen kürzen


Zugriffe seit 6.9.2001 auf Delphi-Ecke