Главная страница
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.48 MB
Время: 0.047 c
4-1245173597
Макс РВС
2009-06-16 21:33
2013.03.22
Отключение хард диска по букве


15-1340818768
Дмитрий С
2012-06-27 21:39
2013.03.22
Как сделать, чтобы никто не курил :)


15-1344846779
AV
2012-08-13 12:32
2013.03.22
C каких пор стали писать "от" в заявляниях?


15-1333531744
AV
2012-04-04 13:29
2013.03.22
сохранность данных, кто как?


2-1342633944
Nilman
2012-07-18 21:52
2013.03.22
Фон StringGrid вне ячеек