[BCB2006] E2459 VCL style class construction->error den ich nicht kenn
-
hai
hatte bisher noch nie diesen fehler.
[C++ Error] MainForm.cpp(97): E2459 VCL style classes must be constructed using operator newerhielt ich beim compilieren des folgenden codes:
class TForm1 : public TForm { __published: // IDE-managed Components TPaintBox *PaintBox1; //... void __fastcall TForm1::Timer1Timer(TObject *Sender) { //... foo->paint( PaintBox1 ); //<-- Paint erwartet &TPaintBox als Parameter //... }muss ich diese doch mit PaintBox1 = new TPaintBox im Konstruktor erstellen? dachte die vcl-componenten werden beim Form1::OnCreate() Ereigniss automatisch konstruiert, weil die buttons und so das ja auch nicht brauchen

kann mir jemand helfen??danke im voraus
greez
-
hmm wenn ich die paint() funktion ändere und die PaintBOx als zeiger (TPaintBox1*) übergebe funzts..

aber in all den schlauen büchern steht doch, dass man wenn möglich referenzen und nicht zeiger übergeben soll.

-
Mit
TPaintBox *PaintBox1;
legst du keine Paintbox an, sondern nur einen Zeiger. Eine Paintbox wird es erst, wenn du irgendwo noch hinschreibst
PaintBox1=new TPaintBox(..);
Dann hast du eine Paintbox. Ein geeigneter Ort um das hinzuschreiben ist der Konstruktor um die Box zu löschen ist der Destruktor (anlegen!) ein guter Ort.
Damit die Paintbox nun auf dem Bildschirm erscheint braucht sie mindestens eine Position und ein Elternobjekt.
http://www.marquardtnet.info/cecke/quickies.1/1_quicky_21.html
-
eine PaintBox ist doch ne Komponente, die sollte (wenn sie per Drag'n'Drop auf das Formular gelegt wurde) automatisch von der Anwendung erzeugt werden (also keine new nötig). wenn sie von Hand in die Klasse eingetragen wurde, hat sie auch nix im published-Teil zu suchen, sondern gehört nach private oder protected und die obigen Aussagen treffen zu.
-
Malermeister schrieb:
... aber in all den schlauen büchern steht doch, dass man wenn möglich referenzen und nicht zeiger übergeben soll.
Die Betonung liegt hier auf wenn möglich. VCL-Objekte müssen als Pointer erzeugt und verwendet werden. Das liegt daran, dass die VCL in Pascal geschrieben ist und da funktioniert Polymorphie nur über Zeiger. Es gibt dort zwar etwas ähnliches wie Referenzen (var), dies kann aber nicht so eingesetzt werden wie bei C++.
-
Sunday schrieb:
eine PaintBox ist doch ne Komponente, die sollte (wenn sie per Drag'n'Drop auf das Formular gelegt wurde) automatisch von der Anwendung erzeugt werden (also keine new nötig). wenn sie von Hand in die Klasse eingetragen wurde, hat sie auch nix im published-Teil zu suchen, sondern gehört nach private oder protected und die obigen Aussagen treffen zu.
eben das wunderte mich ja, hab sie als drag and drop element auf die form gezogen, also die definitions-zeile nicht selbst geschrieben.
auch funktioniert die konstruktion mit new gar nicht, jedenfalls nicht mit Form1 als Owner.Braunstein schrieb:
...Das liegt daran, dass die VCL in Pascal geschrieben ist und da funktioniert Polymorphie nur über Zeiger...
ok das macht sinn. die pointerübergabe klappt tadellos.
vielen dank für eure hilfe.
-
foo->paint( PaintBox1 ); //<-- Paint erwartet &TPaintBox als Parameterdann muss der Code so lauten
foo->paint( *PaintBox1 ); //<-- Paint erwartet &TPaintBox als Parameter
-
ne geht eben ned
[C++ Error] MainForm.cpp(26): E2034 Cannot convert 'TPaintBox' to 'TPaintBox *'
-
Bitte bleibt bei VCL-Klassen bei Pointern und lasst das mit den Referenzen. Das stiftet hier nur Verwirrung.