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 Treeview zur Laufzeit erzeugen und OnDeletion-Event steuern (https://www.delphipraxis.net/93005-treeview-zur-laufzeit-erzeugen-und-ondeletion-event-steuern.html)

Herbie 30. Mai 2007 08:40


Treeview zur Laufzeit erzeugen und OnDeletion-Event steuern
 
Hallo,

erstelle eine Treeview-Klasse zur Laufzeit. Lese dann die Knoteneinträge aus einer INI-Datei, die Zusatzinformationen schreibe ich in eine separate Klasse, auf die dann die DATA-Eigenschaft des Knotens verweist. Nun möchte ich beim Beenden des Programms alle Klasseneinträge, auf die die DATA-Eigenschaft jedes Knotens verweist, freigeben. Leider wird die entsprechende Prozedur (DoDelete) nicht durchlaufen. Was mache ich falsch!

Meine Codezeilen:

Delphi-Quellcode:
type

  TTVExpandedEvent = procedure(Sender: TObject; Node: TTreeNode) of object;

  // Basisklasse zum Laden der Parameter aus der Ini-Datei
  // = Basisknoten / Ausgangspunkt aller Knoten
  TProjectData = class(TTreeView)
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  private
    FUserOnDeletion: TTVExpandedEvent;
    procedure DoDelete(Sender: TObject; Node: TTreeNode);
    function GetOnDeletion: TTVExpandedEvent;
    procedure SetOnDeletion(Value: TTVExpandedEvent);
    procedure TreeFromIni(Tree: TTreeView; INI: TIniFile; Section: string;
      Expand: Boolean);
    function SetClassForTreeNode(aTree: TTreeView; aIniRefList: TStringList): boolean;
  public
    function LoadParamFromINIFile(aFile: string): boolean;
    //function SaveToParamINIFile: boolean;
  published
    property OnDeletion: TTVExpandedEvent read GetOnDeletion write
      SetOnDeletion;
  end;

implementation


//******************************************************************************
//                    ****** TProjectData-Klasse *******
//******************************************************************************
constructor TProjectData.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  try
    OnDeletion := DoDelete;
  except
    on E:Exception do begin
      ShowMessage('Create - ' + classname + ' - ' + E.Message);
    end;
  end;
end;

//******************************************************************************
destructor TProjectData.Destroy;
begin
  inherited;
end;

//******************************************************************************
procedure TProjectData.DoDelete(Sender: TObject; Node: TTreeNode);
begin
  if Assigned(FUserOnDeletion) then FUserOnDeletion(Self, Node);
  if Node.Data <> nil then begin
    //TProjectNode(Node.Data).Destroy;
    TProjectNode(Node.Data).Free;
    Node.Data := nil;
  end;
end;

//******************************************************************************
function TProjectData.GetOnDeletion: TTVExpandedEvent;
begin
  Result := FUserOnDeletion;
end;

//******************************************************************************
procedure TProjectData.SetOnDeletion(Value: TTVExpandedEvent);
begin
  FUserOnDeletion := Value;
end;
Setze ich mir nun einen Breakpoint innerhalb TProjectData.Destroy und TProjectData.DoDelete, so wird nur die Prozedur Destroy durchlaufen.

Bin für jede Hilfe sehr dankbar!

Gruss
Herbie


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:06 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-2025 by Thomas Breitkreuz