Eigene Komponente liefert EReadError "Eigenschaft xyz existiert nicht"
-
Hallo,
ich habe eine kleine Testkomponente, abgeleitet von TGraphicControl erzeugt.
Die Komponente besitzt 3 Eigenschaften (int, TColor, enum).
Bis hier hin funktioniert alles wunderbar.Füge ich einfach nur ein event hinhzu funktionierts auch noch.
Wird dieses event aber im Designer gesetzt, wird (zur RT natürlich) die Exception EReadError "Eigenschaft OnLineChange existiert nicht" geworfen.Ich poste mal den gesamten Source,
(das event OnLineChange mit property::stored=true war nur ein Test, kann natürlich weg)Header
//--------------------------------------------------------------------------- #ifndef LineH #define LineH //--------------------------------------------------------------------------- #include <SysUtils.hpp> #include <Classes.hpp> #include <Controls.hpp> #include <Graphics.hpp> //--------------------------------------------------------------------------- enum TLineDirection { ldLeftRight, ldUpDown, ldTopLeftBottomRight, ldTopRightBottomLeft }; //--------------------------------------------------------------------------- class PACKAGE TLine : public TGraphicControl { public: typedef void __fastcall (__closure *TOnLineChange)(TObject* sender_, int width_, TColor color_, TLineDirection dir_); private: int __fastcall GetLineWidth() const; TColor __fastcall GetLineColor() const; void __fastcall SetLineWidth(const int width_); void __fastcall SetLineColor(const TColor color_); void __fastcall SetLineDir(const TLineDirection dir_); TOnLineChange m_OnLineChange; TLineDirection m_LineDir; protected: void __fastcall Paint(); public: __fastcall TLine(TComponent* Owner); __published: __property TLineDirection Direction = { read=m_LineDir, write=m_LineDir }; __property TColor LineColor = { read=GetLineColor, write=SetLineColor }; __property int LineWidth = { read=GetLineWidth, write=SetLineWidth }; __property TOnLineChange OnLineChange = { read=m_OnLineChange, write=m_OnLineChange, stored=true }; }; //--------------------------------------------------------------------------- #endif
Impl
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Line.h" #pragma package(smart_init) //--------------------------------------------------------------------------- // ValidCtrCheck wird benutzt um sicher zu stellen, dass die kreierten // Komponenten keine pur virtuelle Funktionen enthalten. // static inline void ValidCtrCheck(TLine *) { new TLine(NULL); } //--------------------------------------------------------------------------- __fastcall TLine::TLine(TComponent* Owner) : TGraphicControl(Owner), m_OnLineChange(0), m_LineDir(ldLeftRight) { } //--------------------------------------------------------------------------- namespace Line { void __fastcall PACKAGE Register() { TComponentClass classes[1] = {__classid(TLine)}; RegisterComponents("Samples", classes, 0); } } //--------------------------------------------------------------------------- int __fastcall TLine::GetLineWidth() const { return Canvas->Pen->Width; } //--------------------------------------------------------------------------- TColor __fastcall TLine::GetLineColor() const { return Canvas->Pen->Color; } //--------------------------------------------------------------------------- void __fastcall TLine::SetLineWidth(const int width_) { if(width_ != Canvas->Pen->Width) { Canvas->Pen->Width = width_; if(m_OnLineChange) m_OnLineChange(this, Canvas->Pen->Width, Canvas->Pen->Color, m_LineDir); Invalidate(); } } //--------------------------------------------------------------------------- void __fastcall TLine::SetLineColor(const TColor color_) { if(color_ != Canvas->Pen->Color) { Canvas->Pen->Color = color_; if(m_OnLineChange) m_OnLineChange(this, Canvas->Pen->Width, Canvas->Pen->Color, m_LineDir); Invalidate(); } } //--------------------------------------------------------------------------- void __fastcall TLine::SetLineDir(const TLineDirection dir_) { if(dir_ != m_LineDir) { m_LineDir = dir_; if(m_OnLineChange) m_OnLineChange(this, Canvas->Pen->Width, Canvas->Pen->Color, m_LineDir); Invalidate(); } } //--------------------------------------------------------------------------- void __fastcall TLine::Paint() { TGraphicControl::Paint(); int start = 0; switch(m_LineDir) { case ldLeftRight: start = (Height - Canvas->Pen->Width) / 2; Canvas->MoveTo(0, start); Canvas->LineTo(Width, start); break; case ldUpDown: start = (Width - Canvas->Pen->Width) / 2; Canvas->MoveTo(start, 0); Canvas->LineTo(start, Height); break; case ldTopLeftBottomRight: Canvas->MoveTo(0, 0); Canvas->LineTo(Width, Height); break; case ldTopRightBottomLeft: Canvas->MoveTo(Width, 0); Canvas->LineTo(0, Height); break; } } //---------------------------------------------------------------------------
Danke schonmal, cPanther
Edit:
CodeGear C++ Builder 2007 R2
-
Hi,
was mir schon mal aufgefallen ist, dass im Header Zeile 33 heissen sollte
__property TLineDirection Direction = { read=m_LineDir, write=SetLineDir };
Im Konstruktor solltest du ein paar Startwerte setzen:
__fastcall TLine::TLine(TComponent* Owner) : TGraphicControl(Owner), m_OnLineChange(0), m_LineDir(ldLeftRight) { this->Height = 1; this->Width = 30; }
mfg
Peter
-
Danke für die korrekturen, hatte ich gar net gesehen ;o)
Das Problem hat sich gelöst und ich würd sagen des lag an der Fehlermeldung... viel zu ungenau!
Lag daran, das die exe das package (bpl) nicht gefunden hatte.
(Jaja, hatte natürlich gleich als erstes die Ausgabeoptionen umgestellt...)
Danke trotzdem