Announcement

Collapse
No announcement yet.

TreeView

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TreeView

    Hallo,<br>
    ich möchte einen TreeView nutzen, um durch Doppelklick z.B.Reports in<br>der Vorschau anzuzeigen (QuickReport). Das klappt, wenn ich TreeView <br>doppelklicke.
    Dies möchte ich jedoch erreichen, wenn ich den Knoten öffne und dann auf die Untereinträge doppelklicke.<br>
    Wie kann ich dies erreichen? Muß ich den TreeNodes Items zuweisen?<br>
    Mit der Onlinehilfe komme ich nicht weiter. <br>Toll wäre auch ein kleines Beispiel. <br>
    Info: ich arbeite mit D 4 Prof.<br>
    Danke im voaus.<br>
    Klaus

  • #2
    Hallo Klaus,
    ich finde es schade, dass bis jetzt noch niemand auf Deine Frage geantwortet hat, denn das würde mich auch mal interessieren. Die Onlinehilfe ist in dieser Hinsicht wirklich nicht sehr hilfreich. Aber was nicht ist, kann ja noch werden.
    Gruß Elk

    Comment


    • #3
      Hallo Klaus,<br>
      <br>
      ich hoffe mal, dass Du mit diesem Beispiel etwas anfangen kannst.<br>
      Im Prinzip ist das ganze ein Viewer für ein paar Dateitypen, die meist<br>
      reine Textdateien (oder RTF ohne Grafik) sind.<br>
      Die eigentlich gesuchte Funktionalität, soweit ich sie richtig verstanden<br>
      habe macht zwar den mit Abstand kleinsten Teil aus, aber dafür läuft das<br>
      ganze auch. Ist getestet (zumindest mit D5pro SP1).<br>
      Ich hoffe mal, dass die Unterschiede nicht zu gravierend sind.<br>
      Sollte ich Deine Frage missverstanden haben, kannst Du sie ja noch mal<br>
      präzisieren.<br>
      Um es Lauffähig zu machen, musst Du einen TTreeView (Align = alLeft),<br>
      dann einen TSplitter, und anschliessend ein TRichEdit (Align = alClient,<br>
      ScrollBars = ssBoth) auf einem Formular plazieren.<br>
      Dann das Projekt unter beliebigem Namen speichern, und die Unit1 als<br>
      Unit MAIN. Anschliessend gesamten Inhalt von MAIN durch den folgenden<br>
      Source Code austauschen.<br>
      Dann noch im Objektinspektor die Ereignisse OnCreate für Form1,<br>
      sowie OnDblClick und OnExpanding für TreeView1 doppelclicken.<br>
      Speichern, compilieren, fertig.<br>
      Sollte funktionieren.<br>
      <br>
      Sicherheitshalber hab' ich mal überausführlich kommentiert, denn eventuell<br>
      liest das ja auch jemand mit weniger Vorwissen.<br>
      Wahrscheinlich ist ein grosser Teil davon für Dich ja überflüssig.<br>
      <br>
      <br>
      <pre>
      // Verwendet wurden
      // ein TTreeView mit Align = alLeft
      // ein TSplitter
      // ein TRichEdit mit ScrollBars = ssBoth und Align = alClient
      // Alle Einstellungen im Objectinspector
      // Benutzt werden die Ereignisse
      // Form1.OnCreate;
      // TreeView1.OnDblClick
      // TreeView1.OnExpanding

      unit MAIN;

      interface

      uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ComCtrls, ExtCtrls;

      type
      TForm1 = class(TForm)
      TreeView1: TTreeView;
      Splitter1: TSplitter;
      RichEdit1: TRichEdit;
      procedure FormCreate(Sender: TObject);
      procedure TreeView1Expanding(Sender: TObject; Node: TTreeNode;
      var AllowExpansion: Boolean);
      procedure TreeView1DblClick(Sender: TObject);
      private
      { Private-Deklarationen }
      public
      { Public-Deklarationen }
      end;

      // Pointer um TStringList ressourcenschonend als Parameter nutzen zu können
      Type
      PTStringlist = ^TStringList;

      var
      Form1: TForm1;

      // Kommentare bei den Routinen
      Function GetFullPath(Const ptnNode : TTreeNode) : String;
      Procedure GetDirectories(Const psPath : String;
      Const pslResult : PTStringList);
      Procedure GetFiles(Const psPath : String;
      Const pslResult : PTStringList);

      implementation

      {$R *.DFM}

      // Hier den Treeview initialisieren
      procedure TForm1.FormCreate(Sender: TObject);

      Var
      sDriveList : String; // Puffer für die Laufwerke des Rechners
      lIndex : LongInt; // Schleifenvariable

      Begin
      // Platz für Laufwerksbuchstaben reservieren
      // Maximal 26 Laufwerksbuchstaben zzgl :\ und abschliessendem chr(0)
      // plus gesamt abschliessendem chr(0) = 105 Zeichen
      sDriveList := StringOfChar(#00,105);
      // Auf dem Rechner verfügbare Laufwerke holen
      GetLogicalDriveStrings(105,PChar(sDriveList));
      // Überzählige Zeichen entfernen, aber ein chr(0) dazu, damit div wieder stimmt
      sDriveList := Trim(sDriveList)+#00;
      // Jedes Laufwerk das auf dem Rechner vorhanden ist eintragen
      for lIndex := 1 to (Length(sDriveList) div 4) do
      Begin
      With TreeView1 do
      Begin
      // Und Laufwerksbuchstaben eintragen
      Items.Add(nil,Copy(sDriveList,((lIndex-1) shl 2)+1,2));
      // Vorsorglich einmal das Plus vor den Eintrag
      Items[Items.Count-1].HasChildren := True;
      end;
      end;
      end;

      // Datei auf die Doppelt geclickt wurde anzeigen
      procedure TForm1.TreeView1DblClick(Sender: TObject);

      Const
      // Liste von Extensions die meist Textfiles (oder RTF sind)
      // MUSS auf Leerstelle enden, sonst

      Comment


      • #4
        // MUSS auf Leerstelle enden, sonst wird die letzte Extension nicht erkannt
        _sValidExtensions = '.TXT .BAT .CMD .HTM .HTML .PAS .DPR .JS .VBS .CSS .RTF .CGI .INF ';

        Var
        tnNode : TTreeNode; // Arbeitsvariable
        sFilePath : String; // Pfad der Datei (Vollständig)

        begin
        // Ausgewählten Node holen
        tnNode := (Sender as TTreeView).Selected;
        // Wenn gültig
        if tnNode <> nil then
        Begin
        // Pfad ermitteln
        sFilePath := GetFullPath(tnNode);
        // Ist es eine Datei?
        if FileExists(sFilePath) then
        Begin
        //Ja. Ist die Extension erlaubt?
        if Pos(AnsiUpperCase(ExtractFileExt(sFilePath))+' ',_sValidExtensions) > 0 then
        Begin
        // Dann Datei anzeigen
        RichEdit1.Lines.LoadFromFile(sFilePath);
        end;
        end;
        end;
        end;

        // Treeview1.OnExpanding
        procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode;
        var AllowExpansion: Boolean);
        Var
        sDirectory : String; // Ausgewählter Pfad
        slContent : TStringList; // Liste für Directories und Files
        tnNode : TTreeNode; // Arbeitsvariable
        lIndex : LongInt; // Schleifenzähler

        begin
        // Ausgewählten Node holen
        tnNode := (Sender as TTreeView).Selected;
        // Wenn gültig
        if tnNode <> nil then
        Begin
        // Pfad holen
        sDirectory := GetFullPath(tnNode);
        // Liste initialisieren
        slContent := TStringList.Create;
        // Erstmal die enthaltenen Directories auslesen
        GetDirectories(sDirectory,@slContent);
        // Bisherigen Inhalt des Nodes löschen (Mehrfache Einträge verhindern)
        tnNode.DeleteChildren;
        // Directories hinzufügen
        for lIndex := 0 to slContent.Count - 1 do
        Begin
        // Neues Child hinzufügen und gleichzeitig dessen Child auf True (könnte zumindest sein)
        tnNode.Owner.AddChild(tnNode,slContent[lIndex]).HasChildren := True;
        end;
        // Jetzt noch die Dateien hinzufügen
        GetFiles(sDirectory,@slContent);
        for lIndex := 0 to slContent.Count - 1 do
        Begin
        // Dateien können kein Child haben deshalb hier False
        tnNode.Owner.AddChild(tnNode,slContent[lIndex]).HasChildren := False;
        end;
        // Liste wieder freigeben
        slContent.Free;
        end;
        end;

        // Vollständigen Pfad des angegebenen Nodes ermitteln
        Function GetFullPath(Const ptnNode : TTreeNode) : String;

        Var
        tnNode : TTreeNode; // Arbeitsvariable

        Begin
        tnNode := ptnNode.Parent; // Parent Node holen
        Result := ptnNode.Text; // Result initialisieren
        // Solange Parent vorhanden
        While tnNode <> nil do
        Begin
        // dessen Text davor
        Result := tnNode.Text + '\'+ Result;
        tnNode := tnNode.Parent;
        end;
        end;

        // Liste der Directories holen
        Procedure GetDirectories(Const psPath : String; // Directories in diesem Pfad
        Const pslResult : PTStringList); // und hier sollen sie rein

        Var
        srSearch : TSearchRec;
        lResult : LongInt; // Ergebnis für FindFirst usw.

        Begin
        // Ergebnisliste löschen
        pslResult^.Clear;
        // und ersten Eintrag lesen
        lResult := FindFirst(psPath + '\*.*',faAnyFile,srSearch);
        While (lResult = 0) do
        Begin
        Application.ProcessMessages;
        if (srSearch.Name <> '.') // Nicht den Eintrag für das eigene Verzeichnis
        and
        (srSearch.Name <> '..') // oder das übergeornete
        and
        ((srSearch.Attr and faDirectory) = faDirectory) then // aber ein Directory soll es sein
        Begin
        // Bedingungen erfüllt, dann speichern
        pslResult^.Add(srSearch.Name);
        end;
        // Und nächsten Eintrag suchen
        lResult := FindNext(srSearch);
        end;
        // Ressourcen wieder freigeben
        FindClose(srSearch);
        // Zu guter letzt noch sortieren
        pslResult^.Sort;
        end;

        // Analog zu GetDirectories bis auf (siehe unten)
        Procedure GetFiles(Const psPath : String;
        Const pslResult : PTSt

        Comment


        • #5
          <pre>
          // MUSS auf Leerstelle enden, sonst wird die letzte Extension nicht erkannt
          _sValidExtensions = '.TXT .BAT .CMD .HTM .HTML .PAS .DPR .JS .VBS .CSS .RTF .CGI .INF ';

          Var
          tnNode : TTreeNode; // Arbeitsvariable
          sFilePath : String; // Pfad der Datei (Vollständig)

          begin
          // Ausgewählten Node holen
          tnNode := (Sender as TTreeView).Selected;
          // Wenn gültig
          if tnNode <> nil then
          Begin
          // Pfad ermitteln
          sFilePath := GetFullPath(tnNode);
          // Ist es eine Datei?
          if FileExists(sFilePath) then
          Begin
          //Ja. Ist die Extension erlaubt?
          if Pos(AnsiUpperCase(ExtractFileExt(sFilePath))+' ',_sValidExtensions) > 0 then
          Begin
          // Dann Datei anzeigen
          RichEdit1.Lines.LoadFromFile(sFilePath);
          end;
          end;
          end;
          end;

          // Treeview1.OnExpanding
          procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode;
          var AllowExpansion: Boolean);
          Var
          sDirectory : String; // Ausgewählter Pfad
          slContent : TStringList; // Liste für Directories und Files
          tnNode : TTreeNode; // Arbeitsvariable
          lIndex : LongInt; // Schleifenzähler

          begin
          // Ausgewählten Node holen
          tnNode := (Sender as TTreeView).Selected;
          // Wenn gültig
          if tnNode <> nil then
          Begin
          // Pfad holen
          sDirectory := GetFullPath(tnNode);
          // Liste initialisieren
          slContent := TStringList.Create;
          // Erstmal die enthaltenen Directories auslesen
          GetDirectories(sDirectory,@slContent);
          // Bisherigen Inhalt des Nodes löschen (Mehrfache Einträge verhindern)
          tnNode.DeleteChildren;
          // Directories hinzufügen
          for lIndex := 0 to slContent.Count - 1 do
          Begin
          // Neues Child hinzufügen und gleichzeitig dessen Child auf True (könnte zumindest sein)
          tnNode.Owner.AddChild(tnNode,slContent[lIndex]).HasChildren := True;
          end;
          // Jetzt noch die Dateien hinzufügen
          GetFiles(sDirectory,@slContent);
          for lIndex := 0 to slContent.Count - 1 do
          Begin
          // Dateien können kein Child haben deshalb hier False
          tnNode.Owner.AddChild(tnNode,slContent[lIndex]).HasChildren := False;
          end;
          // Liste wieder freigeben
          slContent.Free;
          end;
          end;

          // Vollständigen Pfad des angegebenen Nodes ermitteln
          Function GetFullPath(Const ptnNode : TTreeNode) : String;

          Var
          tnNode : TTreeNode; // Arbeitsvariable

          Begin
          tnNode := ptnNode.Parent; // Parent Node holen
          Result := ptnNode.Text; // Result initialisieren
          // Solange Parent vorhanden
          While tnNode <> nil do
          Begin
          // dessen Text davor
          Result := tnNode.Text + '\'+ Result;
          tnNode := tnNode.Parent;
          end;
          end;

          // Liste der Directories holen
          Procedure GetDirectories(Const psPath : String; // Directories in diesem Pfad
          Const pslResult : PTStringList); // und hier sollen sie rein

          Var
          srSearch : TSearchRec;
          lResult : LongInt; // Ergebnis für FindFirst usw.

          Begin
          // Ergebnisliste löschen
          pslResult^.Clear;
          // und ersten Eintrag lesen
          lResult := FindFirst(psPath + '\*.*',faAnyFile,srSearch);
          While (lResult = 0) do
          Begin
          Application.ProcessMessages;
          if (srSearch.Name <> '.') // Nicht den Eintrag für das eigene Verzeichnis
          and
          (srSearch.Name <> '..') // oder das übergeornete
          and
          ((srSearch.Attr and faDirectory) = faDirectory) then // aber ein Directory soll es sein
          Begin
          // Bedingungen erfüllt, dann speichern
          pslResult^.Add(srSearch.Name);
          end;
          // Und nächsten Eintrag suchen
          lResult := FindNext(srSearch);
          end;
          // Ressourcen wieder freigeben
          FindClose(srSearch);
          // Zu guter letzt noch sortieren
          pslResult^.Sort;
          end;

          // Analog zu GetDirectories bis auf (siehe unten)
          Procedure GetFiles(Const psPath : String;
          Const pslResu

          Comment


          • #6
            <pre>
            // Analog zu GetDirectories bis auf (siehe unten)
            Procedure GetFiles(Const psPath : String;
            Const pslResult : PTStringList);

            Var
            srSearch : TSearchRec;
            lResult : LongInt;

            Begin
            pslResult^.Clear;
            lResult := FindFirst(psPath + '\*.*',faAnyFile,srSearch);
            While (lResult = 0) do
            Begin
            Application.ProcessMessages;
            if (srSearch.Name <> '.')
            and
            (srSearch.Name <> '..')
            and
            ((srSearch.Attr and faDirectory) <> faDirectory) then // Jetzt darf es kein Directory sein
            Begin
            pslResult^.Add(srSearch.Name);
            end;
            lResult := FindNext(srSearch);
            end;
            FindClose(srSearch);
            pslResult^.Sort;
            end;

            end.
            </pre>
            <br>
            <br>
            Viel Spass denn noch.<br>
            <br>
            Ciao<br>
            Chris<br>
            <br>
            PS: Sorry, ist länger geworden als gedacht (: <br>
            Beim 'zusammenbauen' bitte auf die Nahtstellen achten.<br&gt

            Comment

            Working...
            X