Eigenschaftsänderungen abfangen / überschreiben
-
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); } } //---------------------------------------------------------------------------
-
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.