![]() |
Virtual Treeview, rootnodecount setzen in Designtime
Hallo
Ich benutze den Virtual Treeview(TVirtualStringTree) und habe folgendes Problem Ich habe eine Ableitung des TVirtualStringTree mit onInit und onfree routine. Wenn ich Rootnodecount in Designtimer mit dem Objectinspectore verändere, bekomme ich eine Exception. "Zugriffverletzung ... in Modul rtl100.bpl" Das tritt nur auf, wenn ich ich doinitnode benutze und auf den User-Speicher zugreife. Läuft das Speichermanagement nicht zur Designtime? Vielen Dank für eine Antwort Hermann
Delphi-Quellcode:
uses
Classes,VirtualTrees,sysutils; type Pmydata = ^tmydata; tmydata = record caption : string; end; tmytree = class(TVirtualStringTree) private { Private-Deklarationen } protected { Protected-Deklarationen } procedure DoGetText(Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var Text: WideString); override; procedure DoFreeNode(Node: PVirtualNode); override; procedure DoInitNode(Parent, Node: PVirtualNode; var InitStates: TVirtualNodeInitStates); override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; { Public-Deklarationen } published { Published-Deklarationen } end; procedure Register; implementation procedure Register; begin RegisterComponents('Neu', [tmytree]); end; constructor tmytree.create(aowner:tcomponent); begin inherited create(aowner); NodeDataSize :=sizeof(tmydata); end; destructor tmytree.destroy; begin inherited destroy; end; procedure tmytree.DoGetText(Node:PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var Text: WideString); var ptd : Pmydata; begin ptd:=getNodeData(Node); Text:=ptd.caption; end; procedure tmytree.doFreenode(Node: PVirtualNode); var ptd : Pmydata; begin ptd:=GetNodeData(Node); Finalize(ptd^); end; procedure tmytree.DoInitNode(Parent, Node: PVirtualNode; var InitStates: TVirtualNodeInitStates); var ptd : Pmydata; begin ptd:=GetNodeData(Node); ptd.caption:='No:'+inttostr(node.Index); /// Hier knallt es !!!!!!!!!! end; |
Re: Virtual Treeview, rootnodecount setzen in Designtime
Zitat:
|
Re: Virtual Treeview, rootnodecount setzen in Designtime
Danke, aber hilft nicht.
im inherited werden ja sowieso nur die oninit/onfree ereignisse aufgerufen, die nil sind. es knallt weiterhin reprodizerbar. |
Re: Virtual Treeview, rootnodecount setzen in Designtime
Zitat:
|
Re: Virtual Treeview, rootnodecount setzen in Designtime
Wieso musst du denn unbedingt eine ableitung vom VirtualStringTree erstellen?
Den Code, den du im DoInit deiner Ableitung aufrufst kannst du doch im OnInit eines Standard VirtualStringTrees packen?! |
Re: Virtual Treeview, rootnodecount setzen in Designtime
Der Fehler tritt auch mit oninit auf, wenn dieser in der Komponente selber ausgewertert wird.
Ich leite mir eine Art "Virtual StringGrid" ab. Meine Doinit oder auch oninit muss in der abgeleiteten Komponente sein und nicht in einer Form. scheinbar geht die Speicherverwaltung mit GetNodeData nicht im Designmodus. in der Runtime läuft es einwandfrei. |
Re: Virtual Treeview, rootnodecount setzen in Designtime
Deinstalliere das als Komponente, und erzeuge die Komponente zu Laufzeit in einem Testprojekt. Da kannste besser debuggen.
|
Re: Virtual Treeview, rootnodecount setzen in Designtime
Zur Laufzeit gibt es keine Fehler! Definitiv nicht!
|
Re: Virtual Treeview, rootnodecount setzen in Designtime
Tritt der fehler nicht mehr auf, wenn du den Delphi-internen Speichermananger nutzt? (kannst du per Compiler-direktive umschalten)
gruss |
Re: Virtual Treeview, rootnodecount setzen in Designtime
Jetzt steh ich auf dem Schlauf...
Wo kann ich den ein/ausschalten. Habe Delphi 2007. Gruß von den Kanaren Hermann |
Re: Virtual Treeview, rootnodecount setzen in Designtime
Stimmt auffallend mit dem inherited.
Ich hätte doch mal in den Source schauen sollen ;-) Eine Kleinigkeit ist mir noch aufgefallen.
Delphi-Quellcode:
ptd ist ein Zeiger, somit müsstest du eigendlich um an die Daten zu kommen folgendes schreiben:
procedure tmytree.DoInitNode(Parent, Node: PVirtualNode; var InitStates: TVirtualNodeInitStates);
var ptd : Pmydata; begin ptd:=GetNodeData(Node); ptd.caption:='No:'+inttostr(node.Index); /// Hier knallt es !!!!!!!!!! end;
Delphi-Quellcode:
Unterschied: ^ hinter dem Zeigernamen.
ptd^.caption:='No:'+inttostr(node.Index);
|
Re: Virtual Treeview, rootnodecount setzen in Designtime
Mit dem Zeiger und dem ^ ist klar. Aber der Compiler weiss dass.
in dem Fall ist p^. und p. dasselbe, ausser dass er keine Warnungen (^ist unsicher) ausgibt. daran liegt es nicht. |
Re: Virtual Treeview, rootnodecount setzen in Designtime
{$define UseLocalMemoryManager} ist es (in der VTConfig.inc). Allerdings seh ich gerade, dass die Option standardmässig nicht gesetzt ist, war also vermutlich nen schuss in den Ofen.
gruss |
Re: Virtual Treeview, rootnodecount setzen in Designtime
hmm, daran liegt es auf jeden Fall.
habe mir nun einen eigenen Memorymabager mit einer Objectlist geschrieben, die Node und speicher kombiniert. Läuft auch unheimlich schnell PS: Und DANKE für Eure Antworten |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:48 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