Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Knoten makieren über Buttonclick event (https://www.delphipraxis.net/93254-knoten-makieren-ueber-buttonclick-event.html)

epex 3. Jun 2007 12:59


Knoten makieren über Buttonclick event
 
Hallo liebe Delphi user,
seit einiger Zeit sitze ich nun an meinem Programm und halte mich nun schon fast eine Woche an diesem Problem auf. Ich habe eine art Browser / Explorer geschaffen wo über deine ADS Datenbank HTML Seiten in eine Navbar mit TreeView eingelesen und in einem TWebBrowser angezeigt werden können.
Mein Problem besteht jetzt darin das ich oben (wie auch im Windows Explorer) einen Vor- und Zurückbutton habe. Diese besitzen ausserdem noch eine Historylist die in einem PopupMenu dargestellt wird und durch einen Dyn. Array erzeugt wird (wenn eine neue Seite aufgerufen wird). Diese Liste beschränkt sich auf maximal 10 Einträge. Soweit funktioniert die Navigation mit Vor und zurück usw auch ABER ... wenn ich auf zurück Klicke bleibt die Makierung der TreeView auf dem zuletzt angeklickten Knoten / Item stehen und ich kriege es einfach nicht hin, das die Makierung sozusagen beim Buttonclick "mit springt". Ich habs nun mitlerweile über den AbsolutIndex probiert ... nada ... und auch über die ItemId (beim klick auf item ) und dann versucht über GetNode das Item wieder anzusprechen was auch gescheitert ist. GetNode sollte ja eigentlich einen Knoten zurück liefern und somit könnte ich ja über die Select function den Knoten / das Item wieder ansprechen oder nicht ? Nur warum gibt mir GetNode keinen Knoten zurück ? Ich bin mittlerweile total Ratlos. Hatte allerdings noch einen Tip bekommen dies über einen Pointer zu realisieren nur hab ich damit noch nie gearbeitet und weiss nicht wirklich wie ich das anstellen soll. Würde mich über Hilfe freuen

mfg ePex

marabu 3. Jun 2007 13:15

Re: Knoten makieren über Buttonclick event
 
Herzlich willkommen in der Delphi-PRAXiS, epex.

Jeder Node in deiner TreeView hat zwei wesentliche Eigenschaften: Text und Data. In Text wird eingetragen, was der Benutzer sehen soll und in Data wird ein Zeiger auf die eigentlichen Daten gespeichert. Das kann die RecNo einer Query sein oder der Primary Key eines Tabelleneintrages - oder auch ein Zeiger auf eine interne Speicherstruktur, ein Objekt, einen Record ...

Deine History-Funktion kannst du auf mindestens zwei Arten implementieren: Speicherst du beim Aufbau der TreeView auch in der internen Speicherstruktur einen Zeiger auf den TreeNode, dann hast du später eine Möglichkeit diesen einfach zum selektierten Knoten zu machen. Verzichtest du auf diesen Rückverweis, dann musst du den Pfad zum Knoten aus deinen internen Daten herleiten.

Freundliche Grüße vom marabu

epex 3. Jun 2007 14:36

Re: Knoten makieren über Buttonclick event
 
Danke für die schnelle Antwort
also in meinem Datenbank Record wird schon die ID als lfdNr gespeichert ja nur kann ich nicht einfach den Knoten wegspeichern im Array oder Record und dann später wieder aufrufen über die Select function ? Das wäre ja schliesslich am einfachsten. Könntest du mir sonst ein Beispiel geben für deine "Beschreibung" ?

ePex

marabu 4. Jun 2007 07:47

Re: Knoten makieren über Buttonclick event
 
Hallo,

Zitat:

Zitat von epex
... kann ich nicht einfach den Knoten wegspeichern im Array oder Record und dann später wieder aufrufen über die Select function? ...

das ist genau der erste Weg, den ich beschrieben habe. Wenn die Query, mit der du dir die Daten für das Befüllen der TreeView besorgt hast, offen bleibt, dann hast du die Daten ja immer verfügbar. Um den jeweiligen Knoten und seinen zugehörigen Record wechselseitig miteinander zu verknüpfen kannst du eine Zwischenstruktur in Form einer assoziativen Liste einführen. Dazu kannst du eine private Form-Variable NodeMap vom Typ TStringList verwenden. Beim Befüllen der TreeView trägst du dann jeden Knoten dort ein:

Delphi-Quellcode:
// ...
tn := TreeView.Nodes.AddChildObject(Query.FieldByName('NAME').AsString, Pointer(Query.RecNo));
NodeMap.AddObject(IntToStr(Query.RecNo), tn);
// ...
Später kannst du dann über den Knoten den Record der Query identifizieren oder über die Datensatznummer des Records den zugehörigen Knoten:

Delphi-Quellcode:
var
  tn: TTreeNode;
begin
  Query.RecNo := Integer(TreeView.Selected.Data);
  with NodeMap do
    TTreeNode(Objects[IndexOf(IntToStr(Query.RecNo))]).Selected := True;
end;
Der zweite von mir beschriebene Weg ist interessant, wenn die Daten über Strings identifiziert werden, wie zum Beispiel die Namen von Dateien über einen Pfad. So kann man auf die Assoziation von Knoten und Record verzichten und kann über einen Suchalgorithmus den Knoten bei Bedarf im Baum lokalisieren. Performanter ist der erste Weg.

Freundliche Grüße

epex 8. Jun 2007 17:32

Re: Knoten makieren über Buttonclick event
 
Hiho
wollte mich nur nochmal melden nach der woche
also hab auf arbeit viel rumprobiert und rumgespielt und lass beim createn der form nun einfach alle knoten in die liste mit id wegspeichern und ruf sich dann einfach beim buttonklick über den indexof wieder ab
also genauso wie du geschrieben hast ;)
danke für deine hilfe hat gut geholfen

sry für die nichtvorhandene rechtschreibung aber bin nen bisschen in eile :D
so long epex
bis zum nächsten mal ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz