Klassen im VCL-Stil müssen mit dem Operator new erstellt werden
-
PVirtualNode AddProjectStructure( TCustomVirtualStringTree AProjectTree, PVirtualNode ANode, TTreeData ARecord ) { PVirtualNode Result = AProjectTree.AddChild( ANode, NULL ); void* GND = AProjectTree.GetNodeData( Result ); PTreeData Data = reinterpret_cast<PTreeData>( GND ); AProjectTree.ValidateNode( Result, false ); Data->Caption = ARecord.Caption; return Result; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { TTreeData TreeData; ProjectTree->NodeDataSize = sizeof( TTreeData ); ProjectTree->BeginUpdate( ); for( int i = 0; i < 100; i ++ ) { TreeData.Caption = "Node-Nummer: " + IntToStr( i ); AddProjectStructure( ProjectTree, NULL, TreeData ); } ProjectTree->EndUpdate( ); }
Fehler: Klassen im VCL-Stil müssen mit dem Operator new erstellt werden bei folgender Zeile: AddProjectStructure( ProjectTree, NULL, TreeData );
==> Was muss ich wie ändern?
-
TTreeData TreeData = new TTreeData;
[ Dieser Beitrag wurde am 29.12.2002 um 18:12 Uhr von YLIREBUS editiert. ]
-
@YLIREBUS: Wenn du schon Code postest, dann wenigstens richtigen! Außerdem ist das nicht alles, was Michael ändern muss.
@Michael: Das sind C++-Grundlagen! Lies mal ein Buch/Tutorial.
-
tip: es fehlt was am ende...
ist aber eher bcb - als c++ - spezifisch...jeder fängt mal klein an, oder? find den fehler zudem net gravierend, eher im gegenteil, halte es für einen fehler, den man machen muß.
jetzt müßt nur noch jemand erklären, warum man bei den vcl - klassen zwingend das new und das, was noch fehlt braucht, oder?
-
Das hängt entweder damit zusammen, dass die VCL in ObjectPascal geschrieben wurde (Wüsste aber auch nicht genau, wieso - kann kein ObjectPascal) oder Borland hatte andere Gründe.
Natürlich ist das C++-spezifisch. Jemand, der den Operator new kennt, weiß sofort, was gemeint ist.
-
ich meinte, daß instanzen der vcl - klassen zwingend mit new gebildet werden, ist vcl -, also bcb - spezifisch. grundsätzlich sind new und ...... natürlich c++, klar.
-
PVirtualNode AddProjectStructure( TCustomVirtualStringTree AProjectTree, PVirtualNode ANode, TTreeData ARecord ) { PVirtualNode Result = AProjectTree.AddChild( ANode, NULL ); void* GND = AProjectTree.GetNodeData( Result ); PTreeData Data = reinterpret_cast<PTreeData>( GND ); AProjectTree.ValidateNode( Result, false ); Data->Caption = ARecord.Caption; return Result; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { TTreeData* TreeData = new TTreeData; ProjectTree->NodeDataSize = sizeof( TTreeData ); ProjectTree->BeginUpdate( ); for( int i = 0; i < 100; i ++ ) { TreeData->Caption = "Node-Nummer: " + IntToStr( i ); AddProjectStructure( ProjectTree, NULL, *TreeData ); } ProjectTree->EndUpdate( ); }
Was mach ich denn jetzt noch falsch? Der Fehler ist nachwievor beim Funktionsaufruf!
-
Bitte.... etwas mehr mit Hirn und Logik... Konstruktoren sind Funktionen wie jede andere auch. Hast du in C/C++ jemals klammerlose Funktionsaufrufe gesehen?
-junix
<edit>Ausserdem wurde ja in der Kritik an YRLEBUS' Schnellschusspfannenfertiglösung ja erwähnt, dass der code nicht ganz richtig ist (-;</edit>
[ Dieser Beitrag wurde am 29.12.2002 um 20:59 Uhr von junix editiert. ]
-
// Hast du in C/C++ jemals klammerlose Funktionsaufrufe gesehen?
Nein, nie. Und ich finde in meinem Code beim besten Willen auch keine klammerlosen Funktionsaufrufe. Und die laut BCB fehlerhafte Zeile AddProjectStructure( ProjectTree, NULL, *TreeData ); ist eine Funktion MIT Klammern. Befreit mich bitte von meinem Blackout!
-
hi,
mach aus deinem parameter ARecord einen zeiger, dann kannst du auch beim
aufruf das * weglassen und es sollte funktionieren..
-
Nein, mein aktueller Code ist jetzt folgender, und alle Tipps halfen nichts, denn der Fehler ist an gleich und an der gleichen Stelle.
PVirtualNode AddProjectStructure( TCustomVirtualStringTree AProjectTree, PVirtualNode ANode, TTreeData* ARecord ) { PVirtualNode Result = AProjectTree.AddChild( ANode, NULL ); void* GND = AProjectTree.GetNodeData( Result ); PTreeData Data = reinterpret_cast<PTreeData>( GND ); AProjectTree.ValidateNode( Result, false ); Data->Caption = ARecord->Caption; return Result; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { TTreeData* TreeData = new TTreeData( ); ProjectTree->NodeDataSize = sizeof( TTreeData ); ProjectTree->BeginUpdate( ); TreeData->Caption = "Node-Nummer: 1"; AddProjectStructure( ProjectTree, NULL, *TreeData ); ProjectTree->EndUpdate( ); }
-
dann solltest du aber auch, wie gesagt, beim aufruf von AddProjectStructure das * vor TreeData weglassen..
also so:void __fastcall TForm1::Button2Click(TObject *Sender) { TTreeData* TreeData = new TTreeData( ); ProjectTree->NodeDataSize = sizeof( TTreeData ); ProjectTree->BeginUpdate( ); TreeData->Caption = "Node-Nummer: 1"; AddProjectStructure( ProjectTree, NULL, TreeData ); ProjectTree->EndUpdate( ); }
-
Das kann doch nicht wahr sein!
Seit wann soll der übergebene Parameter kein Pointer haben, der erhaltene Parameter dann aber wieder ein Pointer? Laut dir wird ein TreeData übergeben, und ein *TreeData erwartet. So geht das also nicht. Egal wie ich TreeData mit Pointer oder ohne Pointer belege oder egal, welche Eurer Ideen ich nehme; JEDE HAT DEN SELBEN FEHLER AN DER SELBEN STELLE!
@MAURO: Dann hilf doch bitte; du siehst, ich bin nicht mehr der einzige, der bei der ganzen Sache etwas missversteht. Lucksus kann genauso wenig helfen und junix' Aussagen von klammerlose Funktion konnte ich im Code nicht wiederfinden. Dein Tipp war ja, Mauro, dass der Fehler am Ende ist. Hilf nun bitte konkret!
-
*hüstel* ich meinte nur, daß man noch deleten muß am ende, hab den code gar net angeschaut ansonsten... sorry...
-
deleten hat nichts mit dem fehler zu tun *arrg* !
Irgendwie komm ich mir ver*****t vor? Erst bin ich blöd ( "jeder fängt mal an") und dann kommen solche intelligeten Tipps, die garnix damit zu tun haben, und schließlich wisst Ihr's selbst nichtmehr!
Frustrierend !
-
sorry, ich geb auch offen zu, daß ich deinen code net versteh.
das mit dem "jeder fängt mal klein an" sollte net arrogant rüberkommen. ich dachte, daß der einzige fehler der war, daß new und eben auch delete fehlen und du vielleicht noch nicht viel erfahrung mit dem bcb hast (weil eben die vcl - klassen das benötigen).
ich zieh mich jetzt aus dem posting zurück, hab keine gute figur gemacht...
m.
-
Hinweis: Das Problem besteht nach wie vor.
-
Mach mal alles zu Pointern. Ich vermute insbesondere, dass der Fehler an der Rückgabe (PVirtualNode) der ersten Funktion liegt. Mach das mal zu PVirtualNode*.
-
Hallo Michael,
soweit ich verstanden habe, möchtest Du die Data-Struktur des VT über die function 'AddProjectStructure' an Deine aktuelle Node hängen oder? *gggg* Gutes Tutorial oder, allerdings leider für Delphi. Ehrlich gesagt habe ich da auch lang rumgebastelt bis ich dann draufgekommen bin. Ändere mal in der Funktionsdeklaration
PVirtualNode AddProjectStructure( TCustomVirtualStringTree AProjectTree, PVirtualNode ANode, TTreeData ARecord )
die TCustomVirtualStringTree-Deklaration wie folgt ab
[cpp] PVirtualNode AddProjectStructure( TCustomVirtualStringTree ***** AProjectTree,
PVirtualNode ANode,
TTreeData ARecord )[/ [/cpp]Danach sollte es gehen. In Deiner aktuellen Version der Funktion versucht BCB immer einen neuen VST zu erstellen und da nun mal VCL's nur mit new erstellt werden können, meckert er natürlich. Du willst aber bloß einen Pointer auf Deinen ProjectTree weitergeben, damit die Funktion damit arbeiten kann.
Hoffe ich konnte Dir helfen
Udo
-
Ach, habe ich doch glatt noch vergessen: Und mach aus jedem AProjectTree. ein AProjectTree-> innerhalb der Routine.
Tschau
[ Dieser Beitrag wurde am 31.12.2002 um 01:46 Uhr von Darkheart editiert. ]