Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

нужна помощь с событием 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 4.559 c
9-1192415932
Баклан
2007-10-15 06:38
2013.03.22
Где бы накачать интересных уровней для сокобана?


6-1261756160
Kain
2009-12-25 18:49
2013.03.22
Реализация мультиплексирования


2-1337336308
leklerk
2012-05-18 14:18
2013.03.22
Проверка, работает ли компьютер


15-1338665541
Rouse_
2012-06-02 23:32
2013.03.22
Ребят, а что за фильм?


2-1338391814
Serge Petrov
2012-05-30 19:30
2013.03.22
TWebBrowser и обновление элемента веб-страницы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский