Nuzna pomosch s TEdit
Proboval delat cerez funkcyju OnKeyPress:
void __fastcall TDlg_Adjust::m_E_StHourKeyPress(TObject *Sender, char &Key)
{
if (isdigit(Key))
{
// znacit cyfra;
}
}
a kak sdelat tak ctoby kogda prixodit liuboje znacenije krome cyfry, eta funkcyja ne srabatyvala. Vrode: esli cyfra to dopuskajem ee k editu, esli net, to ostavliajem edit takim kakoj on est'?
Edit="1"
keyPress = '1';
vsio normalno posle fuknciji edit = "11"
Edit="1"
keyPress = 'a'
dolzno ostatsia edit = "1", a polucajetsia vsio ravno edit= "1a"
est mozet kakoj legkij sposob, ili vsiotaki nuzno budet rassmatrivat string po odnomu char'u v funkcyje OnChange?
Podskozyte pozaluista
Za ranee blagodaren
{
if(((Key>'9')||(Key<'0'))&&(Key!=8 ))Key = 0;
}
Нужно определить обработчик OnKeyPress у TEdit
{
if(((Key>'9')||(Key<'0'))&&(Key!=8 ))Key = 0;
}
Spasibo pomoglo :)
P.S. ne ocen ponial pocemu ty 8 vydelil, ja peredelal ciut pod sebia:
if (!isdigit(Key) && Key != VK_BACK)
{
Key = 0;
}
esli ne cyfry i ne BackSpace, togda ne delat nicevo.
Мимоходом, в OnKeyPress попадает и VK_RETURN(13)
Хе-хе-хе!
А VK_LEFT, VK_RIGHT... ???
А Буфер Обмена?
Если конешно лень потратить 15минут на написание компоненты, то на OnChange рубиш ето!
AnsiString pText=AnsiString(dynamic_cast<TEdit *>(Sender)->Text);
char *c = pText.c_str();
for (int n=pText.Length();n>0;n--)
{
try {StrToInt(c[n-1]);}
catch(...) {pText.Delete(n,1);}
}
if (pText!="")
{
try
{
dynamic_cast<TEdit *>(Sender)->Text=pText;
}
catch(...)
{
}
}
:angel:
Хе-хе-хе!
А VK_LEFT, VK_RIGHT... ???
А Буфер Обмена?
Не знаю как у вас, а у меня прекрасно работают перечисленные клавиши VK_LEFT, VK_RIGHT, Ctrl+Ins, Shift+Ins и при такой постановке:
bool control_vvoda(int key)
{
if((key<'0'|| key>'9') && key!=VK_BACK)return 0;
return 1;
}
З.Ы. Хотя конечно по идее не должны они работать.
:angel:
Хе-хе-хе!
А VK_LEFT, VK_RIGHT... ???
А Буфер Обмена?
Если конешно лень потратить 15минут на написание компоненты, то на OnChange рубиш ето!
VK_LEFT, VK_RIGHT попадает в OnKeyUp
На счет Clipboard я забыл, его нужно обработать в OnKeyUp и OnKeyDown
void __fastcall TfmForm1::me_hxKeyUp(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if(Shift.Contains(ssShift))
{
if(Key==VK_INSERT)goto paste;
if(Key==VK_DELETE)goto cut;
}
else
{
if(Shift.Contains(ssCtrl))
{
switch(Key)
{
case 'C':
case VK_INSERT:
((TEdit *)Sender)->CopyToClipboard();
Key = 0;
break;
case 'V':
paste:
if (Clipboard()->HasFormat(CF_TEXT))
{
try
{
AnsiString s = IntToStr(StrToInt(Clipboard()->AsText));
if(s==Clipboard()->AsText)((TEdit *)Sender)->PasteFromClipboard();
}
catch(...)
{
}
}
Key = 0;
break;
case 'X':
cut:
((TEdit *)Sender)->CutToClipboard();
Key = 0;
}
}
}
}
//------------------------------------------------
void __fastcall TfmForm1::me_hxKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if(Key==VK_INSERT&&Shift.Contains(ssShift))
{
if (Clipboard()->HasFormat(CF_TEXT))
{
try
{
AnsiString s = IntToStr(StrToInt(Clipboard()->AsText));
if(s!=Clipboard()->AsText)Key = 0;
}
catch(...)
{
Key = 0;
}
}
}
}
char *c = pText.c_str();
for (int n=pText.Length();n>0;n--)
{
try {StrToInt(c[n-1]);}
catch(...) {pText.Delete(n,1);}
}
if (pText!="")
{
try
{
dynamic_cast<TEdit *>(Sender)->Text=pText;
}
catch(...)
{
}
}
Если я не ошыбаюсь (а я не ошибаюсь).
Етот карявый кусок, не нуждаетса в левых переверках...
И из Clipboard пашет (по рагульски)...и не надо переписивать всякие KeyDown...
KeyDown - ето полнейшая лажа! (Я уже молчу про "goto")...
Если я не ошыбаюсь (а я не ошибаюсь).
Етот карявый кусок, не нуждаетса в левых переверках...
Установи на форму компонент TEdit, подключи к событию OnChange свой код и попробуй ввести "я не ошибаюсь".
Если ты действительно не ошибаешься, то поле TEdit останется пустым.
После этого набери напр. 345R67
Курсор переходит на начало текста при вводе неправильного символа.
:angel: