Ereignisse von Controls überschreiben



  • Nachdem mich Webfritzi auf die Idee gebracht hat, für mein Problem eine neue Kompo anstatt einer Klasse zu schreiben,, hab ich nu ein neues Problem.
    Basis meines Controls ist ein TImage. Innerhalb des Controls möchte ich das Ereigniss MouseDown überschreiben. Ich hab schon viel rumprobiert, kriegs aber nicht hin, vor allem die Übergabeparameter an das Originalereigniss. Wie mach ich das denn ?
    Hat da jeman ein kleines Beispiel ?



  • Wo liegt denn genau dein Problem? Zeig am besten mal was Code.



  • Header Datei

    //---------------------------------------------------------------------------
    
    #ifndef ExtImageH
    #define ExtImageH
    //---------------------------------------------------------------------------
    #include <SysUtils.hpp>
    #include <Controls.hpp>
    #include <Classes.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    
    typedef void __fastcall (__closure *MyMouseDown)
    (TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y);
          //---------------------------------------------------------------------------
    class PACKAGE TExtImage : public TImage
    {
    private:
            MyMouseDown IVMyOnClick;
    
    protected:
    
    public:
            virtual __fastcall TExtImage(TComponent* Owner);
            virtual __fastcall ~TExtImage();
            // Damit sollte das alte MouseDown Ereigniss aus TImage überschrieben
            // sein 
            DYNAMIC void __fastcall MouseDown(TMouseButton Button,
                         Classes::TShiftState Shift, int X, int Y);
    
    __published:
            __property MyMouseDown OnMouseDown =
            {read=IVMyOnClick,write=IVMyOnClick};
    };
    //---------------------------------------------------------------------------
    #endif
    

    CPP Datei

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "ExtImage.h"
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
    // ValidCtrCheck wird benutzt, um sicherzustellen, daß die erzeugten Komponenten
    // keine rein virtuellen Funktionen besitzen.
    static inline void ValidCtrCheck(TExtImage *)
    {
            new TExtImage(NULL);
    }
    //---------------------------------------------------------------------------
    __fastcall TExtImage::TExtImage(TComponent* Owner)
            : TImage(Owner)
    {
    }
    //---------------------------------------------------------------------------
    __fastcall TExtImage::~TExtImage()
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TExtImage::MouseDown(TMouseButton Button,
                    Classes::TShiftState Shift, int X, int Y)
    {
     // Dei Meldung kommt, wenn ich auf das ExtImage in einem Projekt klicke
     ShowMessage("Im Control");
     // Die "Weiterleitung" an die Originalklasse. Ist die so richtig ???
     TImage::MouseDown(Button, Shift, X, Y);
    }
    //---------------------------------------------------------------------------
    namespace Extimage
    {
            void __fastcall PACKAGE Register()
            {
                     TComponentClass classes[1] = {__classid(TExtImage)};
                     RegisterComponents("Components", classes, 0);
            }
    }
    //---------------------------------------------------------------------------
    

    Wenn ich das TExtImage in einem Projekt verwende und in die Ereignissbehandlunroutine für OnMouseDown ein ShowMessage eingebe, passiert nix, es kommt lediglich die Meldung aus dem Control, die ich oben eingefügt habe. 😕



  • Hi,

    FAQ you 😉



  • Hi
    FAQ

    du musst noch das Ereignis auslösen.

    //---------------------------------------------------------------------------
    void __fastcall TExtImage::MouseDown(TMouseButton Button,
                    Classes::TShiftState Shift, int X, int Y)
    {
     // Dei Meldung kommt, wenn ich auf das ExtImage in einem Projekt klicke
     ShowMessage("Im Control");
     // Die "Weiterleitung" an die Originalklasse. Ist die so richtig ???
     // ja !
    
     TImage::MouseDown(Button, Shift, X, Y);
     if(IVMyOnClick) IVMyOnClick(this,Button,Shift,X,Y);
          }
    


  • Nu gehts,

    Thx


Anmelden zum Antworten