dynamische erstellte Form ... error
-
Dankeschön

-
eine Frage habe ich aber noch ... warum geht aber das:?
__fastcall TServoGroup(TComponent *AOwner) : TForm(AOwner, 1) {}Ich habe übrigends dass jetzt im Ereigniss OnButtonClick ... der fehler kommt trotzdem.
class TServoGroup : public TForm { public: __fastcall TServoGroup(TComponent *AOwner) : TForm(AOwner) { [...] //bis hier kommt er nichtmehr ... nachdem der Konstruktor vin TForm außgeführt wird, stürzt das Prog ab } }; TServoGroup *ServoGroup; void __fastcall TForm1::Button1Click(TObject *Sender) { ServoGroup = new TServoGroup(Form1); [...]warum macht das Sinn?
class TServoGroup : public TForm { public: __fastcall TServoGroup(TComponent *AOwner) : TForm(AOwner) { ServoGroup = new TServoGroup(this); } private: TServoGroup *ServoGroup; };
-
Hallo
Thoms schrieb:
eine Frage habe ich aber noch ... warum geht aber das:?
__fastcall TServoGroup(TComponent *AOwner) : TForm(AOwner, 1) {}TForm hat noch einen zweiten Konstruktor
BCB-Hilfe schrieb:
Übergeben Sie eine Komponente und eine Ganzzahl, um beim Erzeugen des Foormulars das Streaming-System zu umgehen, das die Eigenschaften und die Nachkommen des Formulars aus einer .DFM-Datei lädt. Der zweite Parameter (Dummy) dient nur zur Unterscheidung dieser Syntax von der ersten. Dieser Konstruktor wird selten für Formularobjekte eingesetzt. Bei dieser Syntax müssen Sie eine externe .DFM-Datei einlesen, um die visuellen Komponenten an ihre Klassen zu binden.
Allerdings nichts worüber du dir Gedanken machen müßtest. Las die 1 einfach weg.
Ich habe übrigends dass jetzt im Ereigniss OnButtonClick ... der fehler kommt trotzdem.
class TServoGroup : public TForm { public: __fastcall TServoGroup(TComponent *AOwner) : TForm(AOwner) { [...] //bis hier kommt er nichtmehr ... nachdem der Konstruktor vin TForm außgeführt wird, stürzt das Prog ab } }; TServoGroup *ServoGroup; void __fastcall TForm1::Button1Click(TObject *Sender) { ServoGroup = new TServoGroup(Form1); [...]Weil Button1Click (wenn überhaupt) erst nach dem Erstellen der Forminstanz aufgerufen wird. Greifst du vorher auf die Membervariable ServoGroup zurück erzeugst du undefiniertes Verhalten beim Zugriff auf uninitialisierten Speicher.
warum macht das Sinn?
class TServoGroup : public TForm { public: __fastcall TServoGroup(TComponent *AOwner) : TForm(AOwner) { ServoGroup = new TServoGroup(this); } private: TServoGroup *ServoGroup; };Weil es logisch ist das beim Erstellen der Form auch alle Komponenten darauf erstellt werden. Sollen Komponenten erst nachträglich bei Benutzeraktionen erstellt werden must du schon etwas mehr Logik einbauen, beginnend damit das du im Konstruktor ServoGroup auf NULL setzt. Dann kannst und must du bei späteren Zugriffen auf ServoGroup immer auf NULL prüfen.
/Edit : Und so wie dein Codeauszug aussieht hast du ServoGroup immer noch als globale Variable! Pack das endlich in die Klasse rein.
bis bald
akari
-
Tut mir leid! Aber ich verstehe es noch immer nicht ... trotzdem habe ich es ausprobiert.
class TServoGroup : public TForm { public: __fastcall TServoGroup(TComponent *AOwner) : TForm(AOwner) { ServoGroup = new TServoGroup(this); } private: TServoGroup *ServoGroup; };Der Konstruktor ruft sich aber immerwieder (bis ins unendliche) selber auf ...
-
Hallo
Ja du must natürlich das Form anders nennen als deine neue Komponente (Über den Objektinspektor)
class TServoForm : public TForm { public: __fastcall TServoForm(TComponent *AOwner) : TForm(AOwner) { ServoGroup = new TServoGroup(this); } private: TServoGroup *ServoGroup; };bis bald
akari
-
Okay! Jetzt versteh ich warum das Sinn macht ... Ich dachte die Ganze Zeit, da werden 2 Formen erstellt ... dabei wird ja die Klasse Abkeleitet ... dadurch wird keine 2. Form erstellt ... jedoch der unschöne stückweise aufbau der Komponenten auf der Form verschwindet

Vielen Dank!
-
Ich verzweifle nochmal ...
class TServoGroup : public TForm { public: TCSpinEdit *Servo; __fastcall TServoGroup(TComponent *AOwner) : TForm(AOwner) { Servo = new TCSpinEdit(AOwner); Servo->Parent = (TWinControl*)AOwner; Servo->Value = 0; Servo->EditorEnabled = 0; Servo->Hint = "Servo#"; Servo->ShowHint = 1; Servo->AutoSize = 1; Servo->Increment = 1; Servo->MinValue = 0; Servo->MaxValue = 15; Servo->Ctl3D = 1; Servo->ReadOnly = 0; Servo->Enabled = 1; Servo->Visible = 1; } }; class TServoForm : public TForm { public: __fastcall TServoForm(TComponent *AOwner) : TForm(AOwner) { ServoGroup = new TServoGroup(this); ServoGroup->Parent = this; } private: TServoGroup *ServoGroup; }; TServoForm *ServoForm; void __fastcall TForm1::Button1Click(TObject *Sender) { ServoForm= new TServoForm(Form1); }Er sagt immer noch:Ressource TServoGroup not found
-
... TServoForm not found
-
Hallo
class TServoGroup : public TFormWeil dein Form immer noch TServoGroup und nicht TServoForm heißt!
bis bald
akari
-
Ich versteh NULL ... kannst du mir nicht mal bitte nen kleines beispiel schreiben, wo wenn ich aufm Button drücke in der MainForm eine neue Form mit einem Button drin erstellt wird?
Wäre sehr lieb!