Komponeten ... Vererbung ...
-
Hallo ... tja der Titel is wenig sagend ... aber mir is nichts besseres eingefallen ...
So ich möchte folgendes.
Ich habe eine Komponente von TEdit abgeleitet.class PACKAGE TIntEdit : public TEdit { private: bool IVUseMinMax; int IVMin; int IVMax; int IVValue; void __fastcall SetValue(int Val) { try { if (IVUseMinMax) if (Val < IVMin) IVValue = IVMin; else if (Val > IVMax) IVValue = IVMax; else IVValue = Val; else IVValue = Val; } catch(...) {} Text = IVValue; } void __fastcall SetMinValue(int MinVal) { if (MinVal > IVMax) IVMax = MinVal; IVMin = MinVal; } void __fastcall SetMaxValue(int MaxVal) { if (MaxVal < IVMin) IVMin = MaxVal; IVMax = MaxVal; } protected: public: __fastcall TIntEdit(TComponent* Owner); __published: __property bool UseMinMax = {read=IVUseMinMax, write=IVUseMinMax, default=0}; __property int MinValue = {read=IVMin, write=SetMinValue, default=0}; __property int MaxValue = {read=IVMax, write=SetMaxValue, default=0}; __property int Value = {read=IVValue, write=SetValue, default=0}; };Soweit funktioniert das auch ganz gut.
Jetzt möchte ich wenn die Eigenschaft Text geändert wird, dass die Funktion SetValue aufgerufen wird.
void __fastcall SetValue(int Val) { try { if (IVUseMinMax) if (Val < IVMin) IVValue = IVMin; else if (Val > IVMax) IVValue = IVMax; else IVValue = Val; else IVValue = Val; } catch(...) {} Text = IVValue; }Aber die Eigenschaft Text gibt es ja schon in TEdit.
Wie kann man das Problem lösen?
-
meine, dass die Funktion aufgerufen werden soll ... habe mich oben vertan.
void __fastcall SetValue(String Val) { try { if (IVUseMinMax) if (StrToInt(Val) < IVMin) IVValue = IVMin; else if (StrToInt(Val) > IVMax) IVValue = IVMax; else IVValue = StrToInt(Val); else IVValue = StrToInt(Val); } catch(...) {Text = IVValue;} }
-
OnChange ?
-
Das war auch mein erster Gedanke ... aber so geht es dann doch nicht im Objektinspektor ... oder?
-
Das Property überladen.
-
typedef void __fastcall (__closure *ValueChange)(TObject *Sender);
class PACKAGE TIntEdit : public TEdit
{
private:
ValueChange IVValueChange;
protected:
public:
void __fastcall ValueChanged();void __fastcall WndProc(Messages::TMessage &Message)
{
Dispatch(&Message);switch(Message.Msg)
{
case WM_KEYFIRST:
if (LOWORD(Message.WParam) == 13)
ValueChanged();
break;
}
}__fastcall TIntEdit(TComponent* Owner);
__published:
__property ValueChange OnValueChange {read=IVValueChange,write=IVValueChange};
};
[/cpp]Danke!Funktioniert!
Noch nen kleines Progblem.
Ich habe so eine Komponente entwickelt:
[cpp]Wenn ich jetzt so eine Komponete auf meiner Form zur Disignzeit - also nicht zur Laufzeit - draufziehe, kann ich meine Komponente verwenden, als würde das Programm laufen .... also den Focus geben und Zahlen eingeben etc.
Wie kann man das verhindern?