Results 1 to 7 of 7

Thread: TTreeView path uitlezen

  1. #1

    Unhappy TTreeView path uitlezen

    Hallo ik zit met een probleem. Al sinds gisterenavond bezig maar kom er niet uit.
    Hier is een screenshot van de TreeView items.

    Attachment 8194

    Wat ik nu wil is uitlezen van het complete path van '1993 Final'.
    Resultaat zou dan dit moeten zijn:
    \++ MP3 Music Collection\+ Top40 Dossier\1990-1999 Final\1993 Final\

    Mijn stukje code die al meerdere malen is gewijzigd maar het werkt niet.
    Code:
    function SelectFullPath(ANode: TTreeNode): string;
        begin
          Result := ANode.Text; // Correct selected item!
          if ANode = nil then Exit;
          repeat
            ANode := ANode.GetPrev;
            if (ANode <> nil) then
              Result := ANode.Text + '\' + Result;
          until ANode = nil;
        end;
    Misschien weet iemand het verlossende antwoord?
    Dat zou heel fijn zijn want ik weet het echt niet.

    Groetjes.

  2. #2
    Wat werkt er niet aan? Geeft het de verkeerde waarde? Een foutmelding? Ontploft het?

    Ik zie dat je GetPrev gebruikt, maar bij 'pad' denk ik dat je de bovenliggende wil. Dat zou Parent zijn. Prev en Next zijn om door een lijst van nodes heen te lopen.


    Overigens, dit pad is dan nog redelijk te construeren o.b.v. de nodes, maar soortgelijke meta-data is wellicht net zo makkelijk op te slaan in een apart objectje waar je naar verwijsst in ANode.Data.
    Last edited by GolezTrol; 27-Oct-21 at 12:25.
    1+1=b

  3. #3
    Ik had inderdaad met GetPrev de vorige node wat dan een verkeerd path gaf. Was het even vergeten te melden.
    Maar .Parent werkt geweldig, bedankt daarvoor.

    Code:
      function SelectFullPath(ANode: TTreeNode): string;
      begin
        Result := ANode.Text; // Correct selected item!
        if ANode = nil then Exit;
        repeat
          ANode := ANode.Parent;
          if (ANode <> nil) then
            Result := ANode.Text + '\' + Result;
        until ANode = nil;
      end;
    Wat betreft ANode.Data dat lijkt mij wel wat als eventuele uitbreiding.

    Ik weet genoeg tenzij er nog tips zijn. Eerste keer dat ik met die TTreeNode werkt.

    Bedankt

  4. #4
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Dan zal ik toch meteen met TNode.data aan de slag gaan. Dan sla je meteen de fullpath op en kan je met een klick van de muis meteen de juiste gegevens ophalen.

    @goleztrol
    TNode.data is een mooie tool voor data, maar rechtstreeks een string in een datanode plaatsen is mij nooit gelukt. Met een integer wel, maar een voor een string maak ik altijd een object aan en koppel deze aan de TNode.data. Voordeel hiervan is dat je meer info voor het desbetreffende item kan opslaan.
    Delphi is great. Lazarus is more powerfull

  5. #5
    Is er misschien een klein voorbeeld voor TNode.Data te vinden?
    Had al iets verzonden met gewone pointers maar of dat zo elegant is.

    Code:
    type
      PItemRecord = ^TItemRecord;
      TItemRecord = record
        FullPath: Widestring;
      end;
    
    procedure TfrmCustomQuickSelect.GetDirectories(Tree: TTreeView; Directory: string; Item: TTreeNode; IncludeFiles: Boolean);
    var
      SearchRec: TSearchRec;
      ItemTemp: TTreeNode;
    begin
      if Directory[Length(Directory)] <> '\' then
        Directory := Directory + '\';
    
      if FindFirst(Directory + '*.*', faDirectory, SearchRec) = 0 then
      begin
        repeat
          if (SearchRec.Attr and faDirectory = faDirectory) and (SearchRec.Name[1] <> '.') then
          begin
            if (SearchRec.Attr and faDirectory > 0) then
            begin
              Item := Tree.Items.AddChild(Item, SearchRec.Name);
              New(pData);
              pData^.FullPath := (Directory + SearchRec.Name);
              Item.Data := pData; // PChar(Directory + SearchRec.Name);
            end;
            ItemTemp := Item.Parent;
            GetDirectories(Tree, Directory + SearchRec.Name, Item, IncludeFiles);
            Item := ItemTemp;
          end
          else if IncludeFiles then
            if SearchRec.Name[1] <> '.' then
              Tree.Items.AddChild(Item, SearchRec.Name);
        until FindNext(SearchRec) <> 0;
        FindClose(SearchRec);
      end;
    end;
    
    Caption := PItemRecord(Node.Data)^.FullPath;
    
    // Geloof deze dan ook nodig is...
    procedure TfrmCustomQuickSelect.TreeDirectoryListDeletion(Sender: TObject; Node: TTreeNode);
    begin
      Dispose(PItemRecord(Node.Data));
    end;

  6. #6
    Een beetje low level, maar dat kan prima. Je kan ook een object maken

    TJeData = class
    end;

    Maar heel veel maakt het uiteindelijk niet uit. Je zal nog steeds een typecast nodig hebben om het te gebruiken, en zal het nog steeds vrij moeten geven als het niet meer nodig is. Het voordeel van records en classes is dat je er allerlei data in op kan slaan. Als je alleen een int nodig zou hebben, zou je die rechtreeks kunnen casten, zoals jkuiper zegt, maar je mist dan de mogelijkheid om het nog verder uit te breiden.

    Quote Originally Posted by jkuiper View Post
    .. rechtstreeks een string in een datanode plaatsen is mij nooit gelukt. ... voor een string maak ik altijd een object aan ..
    Ja, volgens mij zei ik dat ook
    1+1=b

  7. #7
    Alles is duidelijk

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •