Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:49 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz