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 TTreeNode.Data verwenden (https://www.delphipraxis.net/4367-ttreenode-data-verwenden.html)

Chewie 26. Apr 2003 11:59


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;

Christian Seehase 26. Apr 2003 12:36

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;

Chewie 26. Apr 2003 13:28

Autsch. Ich meinte TListbox, nicht TListView :oops: .
Macht aber nix, ich denke, ich kann damit was anfangen. Danke.

Christian Seehase 26. Apr 2003 14:39

Moin Chewie,

wieso Du :oops: :?:

Wenn dann ich :oops: :mrgreen:

Du hattest ja auch ListBox geschrieben.

Dann eben statt der for Schleife

Delphi-Quellcode:
    ListBox1.Items.AddStrings(TStrings(TreeView1.Selected.Data));
und natürlich ListView1 gegen ListBox1 getauscht.

Chewie 26. Apr 2003 14:55

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.

Christian Seehase 26. Apr 2003 15:48

Moin Chewie,

also wenn ich das so mache geht's auch:

Delphi-Quellcode:
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;
Welchen Compilierfehler bekommst Du denn?
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.

Chewie 26. Apr 2003 20:54

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