Форум: "Начинающим";
Текущий архив: 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 - процедура удаления символа.
OnlyNumeralsfunction 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;
SymbolCheckprocedure 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.078 c