Parent übergeben!



  • Hallo!
    Ich habe ein kleines Problem!

    Ich habe mir eine eigene Komponente erstellt. Diese heißt TELAButton und ist von TImage abgeleitet.
    Ich möchte jetzt also ein Bild haben, und in dem Vordergrund soll ein Label stehen.
    Daher versuche ich im Konstruktor von TELAButton ein Label "Beschriftung" zu erzeugen:

    __fastcall TELAButton::TELAButton(TComponent* Owner)
    	: TImage(Owner)
    {
     Stretch = true;
     Picture->LoadFromFile("grau_normal.bmp");
     Beschriftung->Parent = this;
     Beschriftung->Left = 2;
     Beschriftung->Top = 5;
     Beschriftung->Caption = "Gong 1";
     Beschriftung->Show();
    }
    

    Wie kann ich dem Label jetzt "sagen", dass TELAButton sein Parent sein soll?



  • Diese Zeile hier macht das doch schon

    Beschriftung->Parent = this;
    

    Wo kommt das Label "beschriftung" eigentlich her?
    Wäre es nicht vernünftig, es zum Member von TELAButton zu machen und dann in dessen Konstruktor zu erstellen?



  • ja also die klassenvereinbarung ist so (steht in TELAButton1.h):

    class PACKAGE TELAButton : public TImage
    {
    private:
    protected:
    public:
    	 TLabel *Beschriftung;
    	__fastcall TELAButton(TComponent* Owner);
    	 void __fastcall Status_setzen(String Farbe, String Typ);
    	__published:
    };
    

    und im header der Unit1 deklariere ich ELAButton1:

    class TForm2 : public TForm
    {
    __published:	// IDE-managed Components
    	void __fastcall FormCreate(TObject *Sender);
    private:	// User declarations
     TELAButton* ELAButton1;
    public:		// User declarations
    	__fastcall TForm2(TComponent* Owner);
    };
    

    Und wenn ich das mit

    Beschriftung->Parent = this
    

    mache, dann kommt immer die Meldung:

    Cannot convert TELAButon* const to TWinControl
    


  • Hallo

    Die Fehlermeldung sagt doch schon alles aus : TImage und damit dein TELAButon ist nicht von TWinControl abgeleitet, deshalb kann es nicht als Parent verwendet werden. Du kannst aber immernoch den Parent von Image nehmen :

    // In einer Methode von TELAButton
    Beschriftung->Parent = Parent
    

    Nachteil : Alle Positionsangaben für Beschriftung beziehen sich nun auf den Parent von TELAButton, nicht auf TELAButton selber.
    Ja TImage eignet sich als Container für andere Komponenten. Eventuell solltest du deine Struktur nochmal überdenken.

    bis bald
    akari



  • Hm das gibt dann an genau dieser Stelle eine Access Violation!

    Wie kann ich es denn anders lösen, dass ich ein Bild habe, in dessen Vordergrund ein Label steht?



  • Hallo

    Die Exception hat nichts mit dem Parent selber zu tun, sondern damit das du auf ungültigen Speicher zugreifst. Über den genauen Grund können hier hier nur raten, aber zum Beispiel ist in deinem Quellcodeausszug nirgends zu sehen, das du eine Instanz für Beschriftung erstellst.

    bis bald
    akari



  • Oh das hatte ich ganz vergessen im Konstruktor von ELAButton!

    Jetzt kommt keine Access Violation mehr, aber wie kann ich jetzt TELAButton als Parent übergeben?



  • Hallo

    Hab ich doch schon gesagt : Gar nicht.

    bis bald
    akari



  • achso...

    Kann ich es denn irgendwie machen, dass ich das Label so auf dem TELAButton habe, dass es so ist, wie wenn ich eine Komponente auf ein Panel absetze? ALso dass das Label dann davon abhängig ist?



  • Hallo

    Nur indem du dein TELAButton nicht von TImage ableitest, sondern von TPanel.
    In dem TPanel erstellst du sowohl ein TImage (Align = alClient) und dein TLabel (als zweites, damit es über dem Image liegt, mit Parent = Panel).
    Nun kannst du das Label positionieren in Bezug zu dem Panel. Und da das Image im Hintergrund immer das gesamte Panel ausfüllt, ist das Label gleichzeitig auch zum Image ausgerichtet.

    bis bald
    akari



  • Alles klar!
    Vielen Dank!
    Sollte es neue Probleme geben melde ich mich noch mal!!
    Danke!!!

    Tim


Anmelden zum Antworten