![]() |
TTreeNode.Data verwenden
Ich versuche gerade, ein TStrings-Objekt in der Data-Eigenschaft eines TTreeNode zu speichern. Der Sinn ist, dass beim Selektieren des TreeNodes im TTreeView das TStrings-Objekt in einer Listbox angezeigt werden soll. Die Daten sollen erst ins TreeNode geschrieben werden, nachdem es erstellt wurde, also scheidet AddObject aus. Was ich jetzt versucht habe, ist abzufragen, ob bereits Datenn zu dem TreeNode gehören. Wenn nein, werden die Daten dem TreeNode zugeordnet, wenn ja, werden diese Daten in der Listbox dargestellt. Leider hab ich letzteres noch nicht hingekriegt, und ersteres kann ich aus dem selben Grund schlecht überprüfen.
Folgenden Code hab ich:
Delphi-Quellcode:
procedure TMainForm.files_ausgabeChange(Sender: TObject; Node: TTreeNode);
var UsedFunctions: TStringList; type PStrings = ^TStrings; begin //nur anfangen, falls Element auf der letzten Ebene if not Node.HasChildren then begin //falls keine Daten gespeichert sind if Node.Data = nil then begin //GetUsedFunctions liefert TStringList-Wert UsedFunctions := GetUsedFunctions(Node.Parent.Text,Node.Text,DefFunctionsList); Node.Data := @UsedFunctions; //used_ausgabe ist eine ListBox used_ausgabe.Items.AddStrings(UsedFunctions); end //die Daten sollen ausgelesen werden -> hier haperts else used_ausgabe.Items.AddStrings(TStrings(Node.Data^).Strings); //<-- end else used_ausgabe.Clear; end; |
Moin Chewie,
hier mal ein Muster (Treeview, ListView mit einer Spalte, Style=vsReport)
Delphi-Quellcode:
procedure TfrmMAIN.TreeView1Click(Sender: TObject);
function GetUsedFunctions : TStringList; begin Result := TStringList.Create; Result.Add('Zeile1'); Result.Add('Zeile2'); end; var i : integer; begin if TreeView1.Selected = nil then exit; if TreeView1.Selected.HasChildren then exit; if TreeView1.Selected.Data = nil then begin TreeView1.Selected.Data := GetUsedFunctions; end; ListView1.Items.BeginUpdate; try ListView1.Items.Clear; for i := 0 to TStrings(TreeView1.Selected.Data).Count-1 do begin ListView1.Items.Add; ListView1.Items[ListView1.Items.Count-1].Caption := TStrings(TreeView1.Selected.Data)[i]; end; finally ListView1.Items.EndUpdate; end; end; |
Autsch. Ich meinte TListbox, nicht TListView :oops: .
Macht aber nix, ich denke, ich kann damit was anfangen. Danke. |
Moin Chewie,
wieso Du :oops: :?: Wenn dann ich :oops: :mrgreen: Du hattest ja auch ListBox geschrieben. Dann eben statt der for Schleife
Delphi-Quellcode:
und natürlich ListView1 gegen ListBox1 getauscht.
ListBox1.Items.AddStrings(TStrings(TreeView1.Selected.Data));
|
Wow :D
Das iss ja lustig. Na ja, ich hatte deine Antwort gelesen und da du da Listview geschrieben hast, dachte ich, ich hätte auch Listview geschrieben. Aber was solls. Was ich nur nicht so ganz versteh, ist dass es funktioniert, wenn ich über die Selected-Eigenschaft von dem TreeView gehe, so wie du es geschrieben hast. Wenn ich aber, so wie ich es vorhatte, über die Node-Variable in der onChange-Prozedur gehe, krieg ich nen Compilierfehler. |
Moin Chewie,
also wenn ich das so mache geht's auch:
Delphi-Quellcode:
Welchen Compilierfehler bekommst Du denn?
procedure TfrmMAIN.TreeView1Change(Sender: TObject; Node: TTreeNode);
function GetUsedFunctions : TStringList; begin Result := TStringList.Create; Result.Add('Zeile1'); Result.Add('Zeile2'); end; var i : integer; begin if Node = nil then exit; if Node.HasChildren then exit; if Node.Data = nil then begin Node.Data := GetUsedFunctions; end; ListBox1.Items.BeginUpdate; try ListBox1.Items.Clear; ListBox1.Items.AddStrings(TStrings(Node.Data)); finally ListBox1.Items.EndUpdate; end; end; Ich vermute mal, dass es am ^ liegt. Das .Strings kannst Du übrigens auch weglassen. Was Du allerdings nicht weglassen darfst: Die über Data zugänglichen Stringlisten müssen auch wieder freigegeben werden. |
Tja. Läufts einnmal, läufts immer. Ich weiß nicht mehr genau, was ich vorhin geschrieben habe, aber jeztzt geht es auch, wenn ich Node anstelle von TreeView.Selected benutze. Sei's drum.
Resourcen gebb ich natürlich auch wieder frei. Ich in der Doku gelesen, dass man das wieder freigeben muss :wink: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz