Eigenschaftsänderungen abfangen / überschreiben



  • Konstruktor is gut. Ohne Inherited!



  • Wo ist denn hier ein Zeiger namens TPanel???



  • Original erstellt von Eßer:
    Wo ist denn hier ein Zeiger namens TPanel???

    Ja eben! Das hatte er aber geschrieben (spool). Ich ging davon aus, dass er anstatt von "TPanel->MouseDown" meinte: "this->OnMouseDown". Sowas passiert, wenn man schnell tippen will und sowieso meint, das, was man da schreibt, sei Unsinn.



  • Dann gibts aber this->MouseDown trotzdem. 😉



  • Hab ich das je angezweifelt?



  • Original erstellt von WebFritzi:
    **Ich hatte mir eigentlich gedacht, dass er weiß, dass es

    TPanel->MouseDown
    

    garnicht gibt.**



  • Öhm... den Unterschied zwischen TPanel und this kennst du aber, oder?



  • Achso, du meinst, dass es TPanel nicht gibt.

    Ich dachte, du meinst, dass es this->MouseDown nicht gibt und bin davon ausgegangen, dass du spools TPanel-Fehler übernommen hast.

    BTW: Ich kann dir nicht sagen, ob es einen Unterschied zwischen TPanel und this gibt, weil TPanel nirgends definiert ist. 😉 🕶



  • Ich dachte, du meinst, dass es this->MouseDown nicht gibt

    Hab ich nirgends gesagt.



  • Stimmt. Ich dachte ja auch, du meintest TPanel == this.

    Drücke ich mich so unklar aus?



  • Äh, ja. Und ich mich wohl auch... 😃



  • Egal wie, es funktioniert nicht !
    Ich kriegs nicht zum Laufen. Anbei nochmal der derzeitige Code
    Header Datei:

    //---------------------------------------------------------------------------
    
    #ifndef ExtendedImageH
    #define ExtendedImageH
    
    #define Rand 2
    //---------------------------------------------------------------------------
    #include <SysUtils.hpp>
    #include <Controls.hpp>
    #include <Classes.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    // #include <jpeg.hpp>
    
    typedef void __fastcall (__closure *MyMouseDown)
    (TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y);
    
    //---------------------------------------------------------------------------
    class PACKAGE TExtendedImage : public TPanel
    {
    private:
            // Ereigniss
            MyMouseDown          IVMyOnClick;
    
            // Private Variablen / Objekte
            TImage*              F_Bild;
    
            int                  F_CmLeft;
            int                  F_CmTop;
            int                  F_CmWidth;
            int                  F_CmHeight;
    
            //*******************************************************************
            //   Zugriffsmethoden für die Eigenschaften
            //*******************************************************************
            // Setzt die neuen linken Koordinaten in Cm
            void __fastcall setCmLeft( int i_Left );
            // Setzt / Liest die neuen linken Koordinaten
            void __fastcall setLeft( int i_Left );
            int __fastcall getLeft();
            // Setzt / Liest die neuen oberen Koordinaten
            void __fastcall setTop( int i_Top );
            int __fastcall getTop();
            // Setzt / Liest die neue Breite
            void __fastcall setWidth( int i_Width );
            int __fastcall getWidth();
    
    protected:
    
    public:
            virtual __fastcall TExtendedImage(TComponent* Owner);
            virtual __fastcall ~TExtendedImage();
    
            DYNAMIC void __fastcall MouseDown(TMouseButton Button,
                    Classes::TShiftState Shift, int X, int Y);
    
    __published:
    
            __property int CmLeft = { read = F_CmLeft, write = setCmLeft };
    
            __property int Left  =  {read = getLeft,   write = setLeft    };
            __property int Top   =  {read = getTop,    write = setTop     };
            __property int Width =  {read = getWidth,  write = setWidth   };
    
    };
    //---------------------------------------------------------------------------
    #endif
    

    CPP Datei

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "ExtendedImage.h"
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
    // ValidCtrCheck wird benutzt, um sicherzustellen, daß die erzeugten Komponenten
    // keine rein virtuellen Funktionen besitzen.
    static inline void ValidCtrCheck(TExtendedImage *)
    {
            new TExtendedImage(NULL);
    }
    //---------------------------------------------------------------------------
    __fastcall TExtendedImage::TExtendedImage(TComponent* Owner)
            : TPanel(Owner)
    {   // Dem Panel keine Beschriftung zuweisen
        inherited::Caption = " ";
        // TImage auf dem TPanel erzeugen
        F_Bild = new TImage(this);
        // Übergeordnetes Control setzen
        F_Bild->Parent = this;
        // Setzt die Eigenschaften Left, Top, Width und Height
        // des TImage gleichzeitig
        F_Bild->SetBounds(Rand, Rand, (inherited::Width) - ( Rand * 2 ), (inherited::Height) - ( Rand * 2 ));
        // Temporär mal ein Bild zuweisen
        F_Bild->Picture->LoadFromFile("D:\\Programme\\ahead\\nero\\cdextra.jpg");
        // Das Image neu zeichnen
        F_Bild->Repaint();
    
        //**************************************
        // Da tut sich gar nix                 *
        //**************************************
        F_Bild->OnMouseDown = this->OnMouseDown;
    }
    //---------------------------------------------------------------------------
    __fastcall TExtendedImage::~TExtendedImage()
    {
     delete F_Bild;
    }
    //---------------------------------------------------------------------------
    void __fastcall TExtendedImage::MouseDown(TMouseButton Button,
                    Classes::TShiftState Shift, int X, int Y)
    {// Ereigniss an die Originalprozedur weiterleiten
     inherited::MouseDown(Button, Shift, X, Y);
     // Ereigniss dieses Controls auslösen
     if(IVMyOnClick) IVMyOnClick(this, Button, Shift, X, Y);
     AnsiString Msg = "MouseDown aus dem Control";
     ShowMessage( Msg );
    }
    //***************************************************************************
    //  Die linken Koordinaten des TPanel (inherited) setzen
    //***************************************************************************
    void __fastcall TExtendedImage::setLeft( int i_Left )
    {
       inherited::Left = i_Left;
    }
    //***************************************************************************
    //  Die linken Koordinaten des TPanel (inherited) zurückliefern
    //***************************************************************************
    int __fastcall TExtendedImage::getLeft()
    {
       return inherited::Left;
    }
    
    //***************************************************************************
    //  Die oberen Koordinaten des TPanel (inherited) setzen
    //***************************************************************************
    void __fastcall TExtendedImage::setTop( int i_Top )
    {
       inherited::Top = i_Top;
    }
    //***************************************************************************
    //  Die oberen Koordinaten des TPanel (inherited) zurückliefern
    //***************************************************************************
    int __fastcall TExtendedImage::getTop()
    {
       return inherited::Top;
    }
    
    //***************************************************************************
    //  Die Breite des TPanel (inherited) setzen
    //***************************************************************************
    void __fastcall TExtendedImage::setWidth( int i_Width )
    {
       inherited::Width = i_Width;
       // Das TImage der geänderten Größe anpassen
       F_Bild->Left = Rand;
       F_Bild->Width = inherited::Width - (Rand * 2);
       F_Bild->Invalidate();
       F_Bild->Update();
    }
    //***************************************************************************
    //  Die Breite des TPanel (inherited) zurückliefern
    //***************************************************************************
    int __fastcall TExtendedImage::getWidth()
    {
       return inherited::Width;
    }
    // Für später
    //---------------------------------------------------------------------------
    void __fastcall TExtendedImage::setCmLeft( int i_CmLeft )
    {
     F_CmLeft = i_CmLeft;
    }
    //---------------------------------------------------------------------------
    namespace Extendedimage
    {
            void __fastcall PACKAGE Register()
            {
                     TComponentClass classes[1] = {__classid(TExtendedImage)};
                     RegisterComponents("Components", classes, 0);
            }
    }
    //---------------------------------------------------------------------------
    


  • Natürlich tut sich da nix, denn du hast ja IVMyOnClick garnicht gesetzt. Was willst du überhaupt erreichen? Ich dachte, du willst, dass das OnClick des Panels ausgelöst wird, wenn man auf das Image klickt. Wozu beutzt du denn noch TPanel::MouseDown? Ist doch unnötig. Die Zeile, die ich dir gegeben habe, reicht völlig aus. Wenn du dann im Objekt-Inspektor deiner Kompo ein neues OnMouseDown zuweist, dann wird das auch aufgerufen, wenn du auf die Kompo klickst.



  • jep, ich möchte erreichen, das das OnMouseDown Ereigniss des TPanel ausgelöst wird, wenn auf das Image geklick wird (MouseDown).

    Welche Zeile von dir meinst du?
    Post doch bitte mal den Quellcodeabschnitt mit deiner Änderung drin.

    [ Dieser Beitrag wurde am 21.01.2003 um 22:27 Uhr von spool editiert. ]



  • Man, welche Zeile Code hatte ich in diesem Thread wohl ernsthaft gepostet?! Denk mal nach, hmm?



  • Tut mich sorry, aber mir ist im Moment nicht mehr nach Denken. Meine Birne qualmt. Ich hör wohl jetzt besser auf.

    Trotzdem Danke. Falls du dich nicht doch noch erbarmst, knie ich mich morgen nochmal rein. Im Moment seh ich wahrscheinlich den Wald vor lauter Bäumen nicht.



  • F_Bild->OnMouseDown = OnMouseDown;

    Die Zeile meinte ich. Und das war's dann auch schon.



  • Das funktioniert so nicht !!!!!!!!
    Wo muß ich denn noch IVMyOnClick setzen ?

    [ Dieser Beitrag wurde am 21.01.2003 um 22:46 Uhr von spool editiert. ]



  • Ich sagte doch: Das war's schon! Du brauchst den Pointer nicht! Lösche ihn. Erstelle deine Komponente, setz sie auf dein Formular und tippe in die Ereignisbehandlung von OnMouseDown irgendwas. Genau das wird passieren, wenn du auf deine Kompo (also das Image) klickst.



  • Und ich sagte schon, es funktioniert so nicht.

    Habs heute nochmal getestet. Es geht nicht (BCB 5 Enterprise).
    Wenn ich in den Bereich des Panels klicke, der nicht vom Imgae bedeckt ist, klappt alles wunderbar, ich krieg ne Meldung aus der Applikation und aus dem Control. Klicke ich aber auf das Image, passiert gar nix.


Anmelden zum Antworten