Eigenschaftsänderungen abfangen / überschreiben



  • Ich versuch mir ne neue Komponente zu schreiben.

    Nun muß ich aber, wenn die Komponente in der IDE oder zur Laufzeit vergrößert wird, andere Controls ebenfalls anpassen.
    Es liegt hier ein TImage auf einem TPanel. Die Komponente wurde von TPanel abgeleitet, das TImage wird im Konstruktor dynamisch erzeugt. Wenn ich nun in der IDE oder zur Laufzeit die Größe des TPanel ändere, muß ich ja innerhalb der Komponente auch die Größe des TImage anpassen.
    Wie mach ich das ??

    Finde leider kein Beispiel dazu. 😕



  • TImage::Align



  • Tja, danke für die Antwort, aber es gibt da noch andere Sachen, die ich abfangen muß, wenn die Größe geändert wird. Wie überschreibe ich denn die Originalmethode, so daß ich feststellen kann, wann die Größe oder die Positon geändert wird (z.B. in der IDE durch Verschieben mit der Maus)-



  • Hi,

    wie machsat du es denn.

    Ich möchte auch nicht immer Komplettlösungen auf den Bildschirm schmeißen.

    Du kannst einfach die alte Eigenschaft überschreiben und kannst immer noch darauf zugreifen über:

    TImage::Left=FLeft; // nur ein Beispiel

    gib doch mal ein wenig deiner geistigen Ergüsse rüber...



  • So wie ichs jetzt hab (immer noch mein ExtendedImage) , werden die aktuellen Werte nicht im Objektinspektor angezeigt und wenn ich da den Wert links ändere knallt der Builder weg.
    Header - Datei

    //---------------------------------------------------------------------------
    #ifndef ExtendedImageH
    #define ExtendedImageH
    //---------------------------------------------------------------------------
    #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 TExtendedImage : public TPanel
    {
    private:
            // Ereigniss
            MyMouseDown          IVMyOnClick;
    
            // Private Variablen / Objekte
            TImage*              F_Bild;
    
            int                  F_Left;
            int                  F_Top;
            int                  F_Width;
            int                  F_Height;
    
            // Setzt die neuen linken Koordinaten
            void __fastcall setLeft( int i_Left );
            int __fastcall getLeft();
    
    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 Left = { read = getLeft, write = setLeft };
    
    };
    //---------------------------------------------------------------------------
    #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 = "";
       inherited::Left = 100;
       // 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(2, 2, (this->Width) - 4, (this->Height) - 4);
       // Temporär mal ein Bild zuweisen
       F_Bild->Picture->LoadFromFile("D:\\Programme\\ahead\\nero\\cdextra.jpg");
       // Das Image neu zeichnen
       F_Bild->Repaint();
    }
    //---------------------------------------------------------------------------
    __fastcall TExtendedImage::~TExtendedImage()
    {
       delete F_Bild;
    }
    //---------------------------------------------------------------------------
    void __fastcall TExtendedImage::MouseDown(TMouseButton Button,
                    Classes::TShiftState Shift, int X, int Y)
    {
       ShowMessage( Msg );
    }
    //---------------------------------------------------------------------------
    void __fastcall TExtendedImage::setLeft( int i_Left )
    {
       F_Left = i_Left;
       inherited::Left = F_Left;
    }
    //---------------------------------------------------------------------------
    int __fastcall TExtendedImage::getLeft()
    {
       F_Left = Left;
       return F_Left;
    }
    //---------------------------------------------------------------------------
    namespace Extendedimage
    {
            void __fastcall PACKAGE Register()
            {
                     TComponentClass classes[1] = {__classid(TExtendedImage)};
                     RegisterComponents("Components", classes, 0);
            }
    }
    


  • Hi,

    //---------------------------------------------------------------------------
    int __fastcall TExtendedImage::getLeft()
    {
       F_Left = Left; // die Abfrage der Eigenschaft Left ruft diese Methode wieder auf. Ist also Rekursive
                     // Deshalb macht dir der Builder einen Satz nach 
       return F_Left;
    }
    // besser  ( ungetestet)
    //---------------------------------------------------------------------------
    int __fastcall TExtendedImage::getLeft()
    {
       F_Left = inherited::Left; // so ist besser
        // hier ein Ereignis ( zB. OnLeftChange) auslösen
       return F_Left;
    }
    

    wobei man sagen muss, das du dir die zusätzlichen Variabelen für Left usw. sparen kannst. Du hast ja die Vorgänger.

    PS: Ungetestet

    [ Dieser Beitrag wurde am 20.01.2003 um 21:09 Uhr von AndreasW editiert. ]

    [ Dieser Beitrag wurde am 20.01.2003 um 21:21 Uhr von AndreasW editiert. ]



  • Beitrag hat sich schon erledigt: Denkfehler

    [ Dieser Beitrag wurde am 20.01.2003 um 21:20 Uhr von spool editiert. ]



  • jep, hab den obrigen Beitrag noch mal editiert
    😉



  • Hallo???? Eßer hat die Antwort auf die einfache Frage bereits gegeben! Du solltest mehr auf die Antworten geben, die an dich gerichtet sind, spool. Eine Zeile Code, und du bist fertig.



  • tja,

    und du hast auch nicht gelesen

    für die Antwort, aber es gibt da noch andere Sachen, die ich abfangen muß, wenn die Größe geändert wird. Wie überschreibe ich denn die Originalmethode, so daß ich



  • OK, er will also abfangen, wann die Größe des Panels geändert wird und die Werte speichern. Gut gut. Verstanden. Sorry. Einwand: Ich hab das auch mal versucht, aber da stand dann 2 mal "Left" im Objekt-Inspektor. D.h. inherited::Left ist noch da. Ich würde lieber von TCustomPanel ableiten. Da ist Left garnicht erst __published. Oder andere Möglichkeit: Windows-Botschaften wie WM_SIZE und WM_SIZING abfangen. Zu schade auch, dass es in TWinControl keine Routine für OnResize gibt. Sonst könnte man einfach das überschreiben.



  • D.h. inherited::Left ist noch da

    hm, muss normalrweise gehen. Hast bestimmt nen Fehler gemacht 😉



  • Original erstellt von AndreasW:
    hm, muss normalrweise gehen. Hast bestimmt nen Fehler gemacht 😉

    Ich mache keine Fehler. 😉



  • *G*



  • Also es funktioniert, wie Andreas es beschrieben hat.

    Aber nu hab ich das nächste Problem:
    Da das Image ja nun fast komplett das TPanel verdeckt, wird ja nun für das TImage das MouseDown Ereigniss ausgelöst. Wie leite ich das denn an meine Ereignissprozedur weiter ??

    Sowas nachdem Motto: F_Bild->OnMouseDown = TPanel->MouseDown
    So gehts natürlich nicht, das weiß ichauch, aber schön wärs halt.



  • Original erstellt von spool:
    Sowas nachdem Motto: F_Bild->OnMouseDown = TPanel->MouseDown
    So gehts natürlich nicht, ...

    Wieso sollte das nicht gehen? Klar geht das! Ist doch alles __published.



  • Nö, WebFritzi. geht wirklich nicht. Denn OnMouseDown erwartet andere Parameter als MouseDown. 😉

    @spool: Schreib dir halt ne Methode für F_Bild->OnMouseDown und ruf darin MouseDown auf.



  • Blödsinn:

    Image->OnMouseDown = OnMouseDown;
    

    Klar geht das!



  • Eben. OnMouseDown klappt. MouseDown aber nciht. 😉

    Denn: Bei OnMouseDown gibts den Parameter Sender und bei MouseDown nicht.

    [ Dieser Beitrag wurde am 21.01.2003 um 21:18 Uhr von Eßer editiert. ]



  • Ich hatte mir eigentlich gedacht, dass er weiß, dass es

    TPanel->MouseDown
    

    garnicht gibt.


Anmelden zum Antworten