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?


Anmelden zum Antworten