Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

нужна помощь с событием onkeydown   Найти похожие ветки 

 
serge ©   (2012-05-23 11:18) [0]

Есть компонент tmemo, в него можно вводить только числа и запятую, также надо отлавливать нажатия клавиш ctrl, shift и т.д.

процедура Memo1KeyDown имеет вид:
procedure TformSec9InputData.memoBedThicknessKeyDown(Sender: TObject;
 var Key: Word; Shift: TShiftState);
begin
   key:=OnlyNumerals(key, Shift);
   SymbolCheck(Memo1);
end;


где OnlyNumerals - функция запрета ввода символов, SymbolCheck - процедура удаления символа.

OnlyNumerals
function OnlyNumerals(key:word; Shift: TShiftState):word;
var ch: string;
begin
   ch:= GetCharFromVKey(key);
   if (Shift=[ssCtrl]) and (key=86) then
       begin
           result:=0;
       end
   else if ch="." then
       begin
           result:=0;
           ShowMessage("Разделитель между целой и дробной частью - запятая");
       end
   else
       if not (ch="0") and not (ch="1") and not (ch="2") and not (ch="3") and not (ch="4")//
          and not (ch="5") and not (ch="6") and not (ch="7") and not (ch="8") and not (ch="9")//
          and not (ord(key)=VK_BACK) and not (ord(key)=VK_DELETE) and not (ord(key)=vk_LEFT)//
          and not (ord(key)=VK_TAB) and not (ord(key)=vk_Right) and not (ch="-")//
          and not (ch=",") and not (ord(key)=vk_CONTROL) and not (ord(key)=vk_SHIFT) //
          and not (ssAlt in Shift) and not (Shift=[ssCtrl]) and not (ord(key)=vk_RETURN) then
              begin
                  result:=0;
                  ShowMessage("Введите цифры или запятую");
              end
       else
           result:=key;
end;


SymbolCheck
procedure SymbolCheck(Memo: TMemo);
var i: integer;
   s: string;
begin
   s:="";
   for i:=1 to length(Memo.Text) do
       if Memo.Text[i]="." then
               begin
                   Memo.Text:=s;
                   Memo.SelStart:=length(Memo.Text);
                   Exit;
               end
       else
           if (Memo.Text[i]<>"0") and (Memo.Text[i]<>"1") and (Memo.Text[i]<>"2") //
               and (Memo.Text[i]<>"3") and (Memo.Text[i]<>"4") and (Memo.Text[i]<>"5")//
               and (Memo.Text[i]<>"6") and (Memo.Text[i]<>"7") and (Memo.Text[i]<>"8")//
               and (Memo.Text[i]<>"9") and (Memo.Text[i]<>",") then
                   begin
                       Memo.Text:=s;
                       Memo.SelStart:=length(Memo.Text);
                       Exit;
                   end
           else
               s:=s+Memo.Text[i];
end;


Если вводить символы с клавиатуры, то все работает, неправильный символ удаляется. Если делать вставку, то ничего не работает. Заметил Такой момент: если в OnlyNumerals в условии "if (Shift=[ssCtrl]) and (key=86) then" после "result:=0;" добавить ShowMessage, то вставленный текст, если он будет содержать запрещенные символы, - удалится.

Вопрос собственно в том, почему при использовании ShowMessage в Memo1KeyDown выполняются процедуры, следующие за "key:=OnlyNumerals(key, Shift);"? Если же ShowMessage не использовать, то возникает мысль, что onkeydown игнорирует последующие команды


 
ProgRAMmer Dimonych ©   (2012-05-23 11:37) [1]

Во-первых,


> if (Memo.Text[i]<>"0") and (Memo.Text[i]<>"1") and (Memo.Text[i]<>"2")
> //
>               and (Memo.Text[i]<>"3") and (Memo.Text[i]<>"4")
> and (Memo.Text[i]<>"5")//
>               and (Memo.Text[i]<>"6") and (Memo.Text[i]<>"7")
> and (Memo.Text[i]<>"8")//
>               and (Memo.Text[i]<>"9") and (Memo.Text[i]<>",
> ") then


пишется как-то так:

if not(Memo.Text[i] in ["0".."9", ","]) then

и множество ещё константой лучше сделать.

А во-вторых, вопрос: почему бы не сделать это в OnChange, если неправильный символ всё равно только выделяется?


 
serge ©   (2012-05-23 11:39) [2]

З.Ы. memoBedThickness забыл поменять на Memo1


 
Медвежонок Пятачок ©   (2012-05-23 11:43) [3]

Ходишь, ходишь в школу,
потом - бац! - вторая смена.
И прощай любимые учителя

что насчет вот такого ввода?

1,2,3,4,5,6,7,8,9


 
serge ©   (2012-05-23 11:49) [4]

Спасибо за помощь. Я изначально зацепился за onkeydown и функцию OnlyNumerals, остальное уже потом дописывал, и про onchange даже и не думал. Еще раз спасибо за помощь



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.06 c
15-1337670031
Pcrepair
2012-05-22 11:00
2013.03.22
Правильное использование DLL


15-1328797365
Empleado
2012-02-09 18:22
2013.03.22
Billiards masters


15-1336654854
alexdn
2012-05-10 17:00
2013.03.22
Контакт


3-1276604494
Eugene1501
2010-06-15 16:21
2013.03.22
Как блокировать таблицу при помощи ADO


1-1300272526
Unknown_user
2011-03-16 13:48
2013.03.22
Ограничение скроллинга в 32767





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский