Einzelnen Beitrag anzeigen

Herbie

Registriert seit: 23. Jul 2004
Ort: Augsburg
14 Beiträge
 
Delphi 6 Enterprise
 
#1

Treeview zur Laufzeit erzeugen und OnDeletion-Event steuern

  Alt 30. Mai 2007, 08:40
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
Jan Herbert
  Mit Zitat antworten Zitat