ComboBox: Unpassender Fehler bei Add



  • Hallo!

    Ich habe meiner eigenen Klasse TPanel vererbt. Auf diesem Panel sollen ComboBoxen angezeigt werden. Beim Item->Add() gibt es immer den folgenden Fehler:

    Im Projekt Project1.exe ist eine Exception der Klasse EInalidOperation aufgetreten. Meldung: ‚Element hat kein übergeordnetes Fenster’. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzten.

    Was ist da falsch? Wer kennt sich aus? Wer kann helfen?

    Der Code:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall MyPanel::MyPanel(TComponent* Owner)
               : TPanel(Owner)
    {
       Combo = new TComboBox(this);
       Combo->Parent = this;
       Combo->SetBounds(10,10,170,20);
       Combo->Items->Add("ASDF");
       Combo->Show();
    }
    
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    Panel1 = new MyPanel(this);
    Panel1->SetBounds(10,10,200,200);
    Panel1->Parent = this;
    Panel1->Show();
    
    }
    

    h-Datei:

    #ifndef Unit1H
    //---------------------------------------------------------------------------
    
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class MyPanel : public TPanel
    {
    public:
     __fastcall MyPanel(TComponent* Owner);
     TComboBox *Combo;
     };
    
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
    private:	// Anwender-Deklarationen
    public:		// Anwender-Deklarationen
            __fastcall TForm1(TComponent* Owner);
            MyPanel *Panel1;
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    


  • Hm,... probier' mal einen Tausch: Erzeug erst das TPanel, dann die TComboBox. Vielleicht hilft's... (zumindest eim Einordnen...)...



  • Bowser schrieb:

    Hm,... probier' mal einen Tausch: Erzeug erst das TPanel, dann die TComboBox. Vielleicht hilft's... (zumindest eim Einordnen...)...

    Darf/Soll ich die Combo nicht im Konstruktor der Klasse erzeugen oder wie meinst Du das?

    Eigentlich/Logisch müßte der Code ja funktionieren... 😕



  • Bronks,
    vertausch mal die hier:

    Panel1->SetBounds(10,10,200,200); 
    Panel1->Parent = this;
    


  • Ahh... Danke für den Tip. Das hat leider nichts geändert und der Fehler ist immernoch der gleiche.

    Aus Neugier/Verzweiflung hab ich den versuch in Java nachgebaut. Das gesamte Konzept funktioniert dort, also muß im Cpp der Fehler irgendwo im Detail begraben sein. Aber in welchem?



  • den Fehler kenne ich. Es passirt immer, wenn du im Konstruktor der Komponente irgendwelche Aktionen mit den "Unterkomponenten" machst, die die Eigenschaft Parent benötigen. Ich vermute, dass es daran liegt, dass Parent (sprich 'this' hier) im Konstruktor der Klasse noch nicht (oder nicht vollständig)initialisiert ist (erst wenn Konstruktor abgearbeitet ist).

    ich hatte damals das irgendwie umgangen. werde heute abend mal suchen, vielleicht finde ich die kompo noch.



  • Hast Du's schon mal mit Owner anstatt this probiert?
    Ansonsten würde mir noch einfallen, die Methode TComponent::Loaded()
    zu überschreiben und dort die Initialisierung vorzunehmen.

    protected:
      virtual void __fastcall Loaded(void);
    

    Gruß,

    Alexander



  • Xqgene schrieb:

    den Fehler kenne ich. Es passirt immer, wenn du im Konstruktor der Komponente irgendwelche Aktionen mit den "Unterkomponenten" machst, die die Eigenschaft Parent benötigen.

    Das ist 'ne Idee. Dann könnte es vielleicht helfen, wenn Du die betreffenden Initialisierungen in das OnCreate-Ereignis von TMyPanel verlagerst.


Log in to reply