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 gemachtIch 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.