Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Virtual Treeview, rootnodecount setzen in Designtime (https://www.delphipraxis.net/110365-virtual-treeview-rootnodecount-setzen-designtime.html)

hermannhass 17. Mär 2008 02:27


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;

generic 17. Mär 2008 18:41

Re: Virtual Treeview, rootnodecount setzen in Designtime
 
Zitat:

Zitat von hermannhass
Delphi-Quellcode:
procedure tmytree.DoInitNode(Parent, Node: PVirtualNode; var InitStates: TVirtualNodeInitStates);
var
 ptd : Pmydata;
begin
 inherited; // <------------------------ sollte helfen, bitte auch bei der anderen überschriebenen funktion nicht vergessen
 ptd:=GetNodeData(Node);
 ptd.caption:='No:'+inttostr(node.Index);   /// Hier knallt es !!!!!!!!!!
end;


hermannhass 17. Mär 2008 18:53

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.

bluesbear 17. Mär 2008 19:05

Re: Virtual Treeview, rootnodecount setzen in Designtime
 
Zitat:

Zitat von hermannhass
es knallt weiterhin reprodizerbar.

Also reproduzierbare Fehler sind mir eigentlich die liebsten. Mittels Debugging sind die schon so gut wie tot, wenn sie mir begegnen :mrgreen:

semo 17. Mär 2008 19:29

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?!

hermannhass 17. Mär 2008 19:39

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.

bluesbear 17. Mär 2008 19:52

Re: Virtual Treeview, rootnodecount setzen in Designtime
 
Deinstalliere das als Komponente, und erzeuge die Komponente zu Laufzeit in einem Testprojekt. Da kannste besser debuggen.

hermannhass 17. Mär 2008 21:44

Re: Virtual Treeview, rootnodecount setzen in Designtime
 
Zur Laufzeit gibt es keine Fehler! Definitiv nicht!

PeterPain 17. Mär 2008 22:37

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

hermannhass 17. Mär 2008 23:40

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

generic 18. Mär 2008 08:34

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:
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;
ptd ist ein Zeiger, somit müsstest du eigendlich um an die Daten zu kommen folgendes schreiben:
Delphi-Quellcode:
ptd^.caption:='No:'+inttostr(node.Index);
Unterschied: ^ hinter dem Zeigernamen.

hermannhass 18. Mär 2008 10:13

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.

PeterPain 18. Mär 2008 11:44

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

hermannhass 19. Mär 2008 01:48

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