Image1 an eigene Funktion übergeben



  • Hallo, ich würde gerne über meine eigenen Funktion auf die VCL Komponenten zugreifen.
    Ich habe das hier mal mit der Image Komponente versucht allerdings weiß ich nicht wie man es richtig macht.
    Die Compiler Fehlermeldung hilft mir da jetzt auch nicht so weiter da ich nicht weiß wie man die Komponente richtig übergibt. Ich dachte ich könnte die Komponente an die Funktion übergeben und von dort dann auf die verschiedenen Methoden zugreifen. Aber das war wohl nix ...

    [bcc32c Fehler] Unit1.cpp(29): no member named 'Visible' in 'System::TObject'

    void foo( TObject *Sender)
    {
    	Sender->Visible = false;
    }
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    	foo( Image1 );
    


  • Versuchs mal so:

    void foo( TObject *Sender)
    {
        TImage* img = dynamic_cast<TImage*>(Sender)
        img ...   // hier dann das was auch immer du mit dem Image machen möchtest ...
    }
    

    Edit: Auch wenn ich hier ( fast )fertigen Code poste ist das nur Hilfe zur Selbsthilfe. Ich würde dir dringend raten das hier gepostete dann noch mal zu vertiefen.



  • Oder so:

    void foo( TImage* Sender)
    {
    	Sender->Visible = false;
    }
    


  • Warum überhaupt hierfür eine freie Funktion und keine Klassenfunktion?
    Wenn die Funktion genereller sein soll, dann TControl*als Parameter verwenden (solange keine TImage-spezifischen Eigenschaften benutzt werden).

    PS: @Smitty, bei deinem Code müßte noch mittels if (img) auf erfolgreiches Casten geprüft werden.

    PPS: Und Sender würde ich als Parameternamen (außer eben bei Ereignissen) vermeiden!



  • @Th69 sagte in Image1 an eigene Funktion übergeben:

    ...
    PS: @Smitty, bei deinem Code müßte noch mittels if (img) auf erfolgreiches Casten geprüft werden.
    ...
    Und wo bleibt dann der Lerneffekt, wenns nicht richtig knallt und raucht 😉



  • @Bassmaster sagte in Image1 an eigene Funktion übergeben:

    Zum einen nutze ich bei Casts, die immer funktionieren müssen ( sonst Bug ), generell Assertions ( ist aber Geschmackssache), zum anderen solltest du dir überlegen, was du mit dem Image-Objekt machen willst. Wenn du nur dessen Funktionen aufrufen willst, kannst du das direkt als Referenz übergeben (sogar als Const-Referenz wenn möglich) und nur wenn du mit dem Pointer selber was machen musst (lagern, übergeben), dann als Pointer.

    void doSomeThingWithImage(  TImage &image )
    {
          image.doStuff();
    }
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
        auto my_image_obj = dynamic_cast<TImage*> ( Sender );
        assert( my_image_obj ); // Nur benutzen wenn diese Funktion hier nur mit TImage-Objekten aufgerufen wird
        doSomeThingWithImage( *my_image_obj );
    }
    


  • @It0101: Du meinst zwar das richtige, aber dein gezeigtes Beispiel wird immer eine Assertion geben, denn TForm::FormCreate ist ja ein VCL-Ereignis und es wird immer die Form-Instanz als Sender übergeben (Image1 im Originalpost ist ja ein Member dieser TForm1-Klasse).



  • @Th69 sagte in Image1 an eigene Funktion übergeben:

    @It0101: Du meinst zwar das richtige, aber dein gezeigtes Beispiel wird immer eine Assertion geben, denn TForm::FormCreate ist ja ein VCL-Ereignis und es wird immer die Form-Instanz als Sender übergeben (Image1 im Originalpost ist ja ein Member dieser TForm1-Klasse).

    Achso ok. Naja ich bin aus der VCL schon ne Weile raus 😉


Log in to reply