Hallo zusammen,
ich bin frustriert und hoffe auf Hilfe von der Community.
Vom VirtualTreeView aka VT (von Dipl.-Ing. Mike Lischke) habe ich eine eigene Komponente abgeleitet. Hierbei verwalte ich meine Objekte in einer Baumstruktur ausserhalb von VT und weise diesem nach Erzeugung zu.
Wenn es bei dem einem Mal bleibt ist alles OK. Sobald ich meinen Objekt-Baum leere (z.B. N.DeleteChildren) und erneut zuweise, gibt es manchmal in der
IDE eine '
Access Violation'-Fehlermeldung und 'Dr. Watson' zur Laufzeit.
== System und Software ==
Delphi 5.0 + Update Pack 1
Windows NT 4.000.1381 + SP 6
== Code-Auszug ==
Delphi-Quellcode:
TMyNode = (TPersistent)
private
FChildren: TList
FParent: TMyNode;
..
procedure SetParent(Value: TMyNode);
protected
function GetChild(i: Integer): TMyNode;
public
...
property Parent: TMyNode read FParent write SetParent;
property Children[i: Integer]: TMyNode read GetChild;
...
end;
TMyVT = class(TVirtualStringTree)
private
FRoot: TMyNode;
procedure SetRoot(Value: TMyNode);
...
public
...
property Root: TMyNode read FRoot write SetRoot;
...
end;
//==
procedure TMyVT.SetRoot(const Value: TMyNode);
begin
FRoot := Value;
if Assigned(FRoot) then
begin
Clear; // -> bzw. RootNodeCount = 0;
RootNodeCount := FRoot.ChildCount;
if RootNodeCount > 0 then
begin
ValidateNode(GetFirst, False);
end;
end else
RootNodeCount := 0;
end;
//==
//== (siehe MVCDemo aus dem Paket 'VirtualTrees')
procedure TBizObjViewerAbs.SetFactory(Value: TBizObjFactory);
begin
if FFactory = Value then
Exit;
{ If we already have a list, break the link to it. }
if Assigned(FFactory) then
FFactory.Viewer := nil;
{ Now make a link to the new structure: }
FFactory := Value;
if Assigned(FFactory) then
begin
FFactory.Viewer := Self;
RootNodeCount := FFactory.Root.ChildCount;
if FFactory.Root.ChildCount > 0 then
ValidateNode(GetFirst, False);
//--
if FAutoSelectFirstVisible then
SelectFirstVisible;
end else
RootNodeCount:=0;
end;
end;
//--
== Methoden-Aufrufe ==
1: die Children von 'Root' bzw. 'Tree.Root' löschen, neu füllen und zuweisen
2: erneute Erzeugung eines neuen Objekt-Baum und die Zuweisung
[1]
Beispiel:
Delphi-Quellcode:
FPropertyRoot.DeleteChildren;
GenPropertyTree(FPropertRoot, Instance)
MyVT.Root = FPropertyRoot;
bzw.
Delphi-Quellcode:
FPropertyTree.Viewer := nil;
FPropertyTree.Root.DeleteChildren;
GenPropertyTree(FPropertyTree.Root, Instance)
MyVT.Tree = FPropertyTree;
[2]
Z.B.
Delphi-Quellcode:
FPropertyRoot := TPropertyFilter.Create;
FPropertyTree := TPropertyTree.Create;
+ die Zuweisung
Vermutung:
Irgendwie versucht das Programm auf 'tote' Objekt-Referenzen zuzugreifen, Obwohl die Objekte ordentlich freigegeben werden (MyNode.DeleteChildren).
Ich bekomme bzw. provoziere folgende Fehlermeldung, wenn ich das Programm-Fenster minimiere, wieder herstelle und anschließend ein paar Klicks betätige. Es passiert auch manchmal, wenn zwischen den laufenden Programmen bzw. neu gestartete gewechselt wird.
=== Debug-Dialog -> 'Dr. Watson' zur Laufzeit auf anderen Maschinen
Die Anweisung "0x004ea7b1" verweist auf Speicher in "0x0000021f".
Der Vorgang "read" konnte nicht auf dem Speicher durchgeführt werden.
Klicken Sie auf "OK", um die Anwendung zu beenden.
Klicken Sie auf "Abbrechen", um die Anwendung zu debuggen.
=== Event-Monitor
Die Open-Prozedur für den Dienst "Appn" in der
DLL "pcs_perf.dll" ist
fehlgeschlagen. Die Systemleistungsdaten für diesen Dienst werden nicht
verfügbar sein. Der zurückgegebene Status-Code ist DWORD 0.
------------------------------------------------------------------------
Ich kann mit diesen Fehlermeldungen nur sehr wenig anfangen
Hat jemand eine Idee, um was für einen fatalen Fehler es sich hier handelt ?
Ich bin verzweifelt und würde mich auf jeden Hinweis zur Lösung des Problems
Danke im Voraus,
Jean-Marie
[edit=Luckie]Delphi-Tags eingefügt. beim nächsten mal bitte selber machen. Danke. Mfg, Luckie[/edit]