Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Nuzna pomosch s TEdit

1.9K
08 ноября 2004 года
Underworld
68 / / 29.03.2004
Delo v tom cto mne nuzno ctoby v TEdit mozno byloby vvesti tolko cyfry. Skolko iskal nige ne nasol ni flazka ni kakova property, kotorym ukazyvajetsia cto edit prinimajet tolko cyfry.
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
368
08 ноября 2004 года
rostyslav
629 / / 13.07.2004
Нужно определить обработчик OnKeyPress у TEdit
 
Код:
void __fastcall TfmForm1::EditKeyPress(TObject *Sender, char &Key)
{
  if(((Key>'9')||(Key<'0'))&&(Key!=8 ))Key = 0;
}
1.9K
08 ноября 2004 года
Underworld
68 / / 29.03.2004
Цитата:
Originally posted by rostyslav
Нужно определить обработчик OnKeyPress у TEdit
 
Код:
void __fastcall TfmForm1::EditKeyPress(TObject *Sender, char &Key)
{
  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.

368
08 ноября 2004 года
rostyslav
629 / / 13.07.2004
8 это VK_BACK

Мимоходом, в OnKeyPress попадает и VK_RETURN(13)
8.7K
08 ноября 2004 года
Satan Corpse
8 / / 04.11.2004
:angel:
Хе-хе-хе!
А 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(...)
{
}
}

243
09 ноября 2004 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Satan Corpse
: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;
}

З.Ы. Хотя конечно по идее не должны они работать.

368
09 ноября 2004 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by Satan Corpse
:angel:
Хе-хе-хе!
А VK_LEFT, VK_RIGHT... ???
А Буфер Обмена?
Если конешно лень потратить 15минут на написание компоненты, то на OnChange рубиш ето!

VK_LEFT, VK_RIGHT попадает в OnKeyUp

На счет Clipboard я забыл, его нужно обработать в OnKeyUp и OnKeyDown

Код:
#include <clipbrd.hpp>
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;
       }
     }
  }
}
Если в TEdit введены одни буквы, то твой код TEdit->Text оставляет без изменений.
8.7K
10 ноября 2004 года
Satan Corpse
8 / / 04.11.2004
:angel:
Код:
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(...)
  {
  }
 }

Если я не ошыбаюсь (а я не ошибаюсь).
Етот карявый кусок, не нуждаетса в левых переверках...
И из Clipboard пашет (по рагульски)...и не надо переписивать всякие KeyDown...
KeyDown - ето полнейшая лажа! (Я уже молчу про "goto")...
368
10 ноября 2004 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by Satan Corpse

Если я не ошыбаюсь (а я не ошибаюсь).
Етот карявый кусок, не нуждаетса в левых переверках...


Установи на форму компонент TEdit, подключи к событию OnChange свой код и попробуй ввести "я не ошибаюсь".

Если ты действительно не ошибаешься, то поле TEdit останется пустым.

После этого набери напр. 345R67

Курсор переходит на начало текста при вводе неправильного символа.

8.7K
12 ноября 2004 года
Satan Corpse
8 / / 04.11.2004
С такими кусками легче компоненту написать...
:angel:
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог