Ĺadny brzuch
Witam wszystkich.
Tworze komponent dziedziczony z TEdit umożliwiający wpisywanie tylko i wyłącznie cyfr.
TProEdit1.h
//--------------------------------------------------------------------------- #ifndef ProEdit1H #define ProEdit1H //--------------------------------------------------------------------------- #include <SysUtils.hpp> #include <Controls.hpp> #include <Classes.hpp> #include <Forms.hpp> #include <StdCtrls.hpp> //--------------------------------------------------------------------------- class PACKAGE TProEdit1 : public TEdit { private: void __fastcall WMChar(TWMKey& Msg); protected: public: __fastcall TProEdit1(TComponent* Owner); __published: BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_CHAR, TWMKey, WMChar); //wywoływanie komunikatu onkeypress END_MESSAGE_MAP(TEdit) }; //--------------------------------------------------------------------------- #endif
ProEdit1.cpp
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "ProEdit1.h" //-------------------------------------------------- #pragma package(smart_init) //--------------------------------------------------------------------------- static inline void ValidCtrCheck(TProEdit1 *) { new TProEdit1(NULL); } //--------------------------------------------------------------------------- __fastcall TProEdit1::TProEdit1(TComponent* Owner) : TEdit(Owner) { } //--------------------------------------------------------------------------- void __fastcall TProEdit1::WMChar(TWMKey& Msg) { char Key = Msg.CharCode; if (!(isdigit(Key) || Key == VK_BACK || Key == DecimalSeparator)) { Msg.CharCode = 0; } else { if ((Key == DecimalSeparator) && (this->Text.Pos(DecimalSeparator) > 0)) { Msg.CharCode = 0; } } } namespace Proedit1 { void __fastcall PACKAGE Register() { TComponentClass classes[1] = {__classid(TProEdit1)}; RegisterComponents("Moje", classes, 0); } } //---------------------------------------------------------------------------
A mój problej jest następujący:
Po wstawieniu mojego komponentu na Formę i skompilowaniu oraz naciśnięciu jakiegokolwiek znaku z klawiatury w Edicie nic sie nie zmienia.
Próbowałem też zrobić tak:
ProEdit1.cpp
this->onkeypress = Key; void __fastcall TProEdit1::Key(TObject *Sender, char &Key) { if (!(isdigit(Key) || Key == VK_BACK || Key == DecimalSeparator)) { Key = 0; } else { if ((Key == DecimalSeparator) && (this->Text.Pos(DecimalSeparator) > 0)) { Key = 0; } } }
i wszystko działało dopuki nie utworzyło sie w Projekcie zdarzenia onkeypress
Prosiłbym o małe wytłumaczenie dlaczego tak sie dzieje
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Tworze komponent dziedziczony z TEdit umożliwiający wpisywanie tylko i wyłącznie cyfr.
TProEdit1.h
//--------------------------------------------------------------------------- #ifndef ProEdit1H #define ProEdit1H //--------------------------------------------------------------------------- #include <SysUtils.hpp> #include <Controls.hpp> #include <Classes.hpp> #include <Forms.hpp> #include <StdCtrls.hpp> //--------------------------------------------------------------------------- class PACKAGE TProEdit1 : public TEdit { private: void __fastcall WMChar(TWMKey& Msg); protected: public: __fastcall TProEdit1(TComponent* Owner); __published: BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_CHAR, TWMKey, WMChar); //wywoływanie komunikatu onkeypress END_MESSAGE_MAP(TEdit) }; //--------------------------------------------------------------------------- #endif
ProEdit1.cpp
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "ProEdit1.h" //-------------------------------------------------- #pragma package(smart_init) //--------------------------------------------------------------------------- static inline void ValidCtrCheck(TProEdit1 *) { new TProEdit1(NULL); } //--------------------------------------------------------------------------- __fastcall TProEdit1::TProEdit1(TComponent* Owner) : TEdit(Owner) { } //--------------------------------------------------------------------------- void __fastcall TProEdit1::WMChar(TWMKey& Msg) { char Key = Msg.CharCode; if (!(isdigit(Key) || Key == VK_BACK || Key == DecimalSeparator)) { Msg.CharCode = 0; } else { if ((Key == DecimalSeparator) && (this->Text.Pos(DecimalSeparator) > 0)) { Msg.CharCode = 0; } } } namespace Proedit1 { void __fastcall PACKAGE Register() { TComponentClass classes[1] = {__classid(TProEdit1)}; RegisterComponents("Moje", classes, 0); } } //---------------------------------------------------------------------------
A mój problej jest następujący:
Po wstawieniu mojego komponentu na Formę i skompilowaniu oraz naciśnięciu jakiegokolwiek znaku z klawiatury w Edicie nic sie nie zmienia.
Próbowałem też zrobić tak:
ProEdit1.cpp
this->onkeypress = Key; void __fastcall TProEdit1::Key(TObject *Sender, char &Key) { if (!(isdigit(Key) || Key == VK_BACK || Key == DecimalSeparator)) { Key = 0; } else { if ((Key == DecimalSeparator) && (this->Text.Pos(DecimalSeparator) > 0)) { Key = 0; } } }
i wszystko działało dopuki nie utworzyło sie w Projekcie zdarzenia onkeypress
Prosiłbym o małe wytłumaczenie dlaczego tak sie dzieje