Главная страница
    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
Время: 0.055 c
15-1342297802
Юрий
2012-07-15 00:30
2013.03.22
С днем рождения ! 15 июля 2012 воскресенье


2-1330341115
agent17
2012-02-27 15:11
2013.03.22
TDateTime


2-1339496022
Разведка
2012-06-12 14:13
2013.03.22
Как приравнять тип из Си к типу Delphi?


2-1336248923
rodionov-uv
2012-05-06 00:15
2013.03.22
Документ Word и Delphi


15-1334950195
Брррр!
2012-04-20 23:29
2013.03.22
Компиляция ассемблера





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