Eigenschaftsänderungen abfangen / überschreiben
-
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.
-
Klar gibts das. Als Erbe von TControl hat TPanel auch ne (protected) Methode namens MouseDown.
-
Hallo??? TPanel->MouseDown NICHT!!! TPanel::MouseDown vielleicht aber nicht mit "->"!
-
Image->OnMouseDown = OnMouseDown;
Wo schreib ich das denn hin ?? In den Konstruktor von TExtendedImage ??
Oder heißt das Richtig Image->OnMouseDown = inherited::OnMouseDown ???muß ich gleich mal am Schlepptop ausprobieren. Hab das Projekt grad nicht hier an der Kiste.
-
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 esTPanel->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); } } //---------------------------------------------------------------------------