Не хотел плодить темы поэтому пишу сюда (вопрос похож).
В общем есть функция и в ней два, а может и более раз, требуется обработать сообщение (действие) пользователя. Короче надо чтоб юзер нажал клавишу и в зависимости от того какую клавишу он нажал делать дальнейший расчёт. Вот примерно так я реализовал:
Глобальные переменные (кажется так называются...)
Код:
1 2 3 4 5 6 7 | var
a, b : Integer ;
WaitClick : Boolean ;
|
Обработка клавиатуры
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | procedure TForm1 . FormKeyUp(Sender: TObject; var Key: Word ;
Shift: TShiftState);
begin
if WaitClick then
begin
case Key of
VK_UP: a:= 1 ;
VK_DOWN: a:= 2 ;
VK_LEFT: b:= 1 ;
VK_RIGHT: b:= 2 ;
end ;
if (a <> 0 ) or (b <> 0 ) then
WaitClick:= false ;
end ;
end ;
|
Функция
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | function TForm1 . MyFunc(x, y : Integer ):TRect;
begin
a:= 0 ;
b:= 0 ;
WaitClick:= false ;
StatusBar1 . SimpleText:= 'Нажмите клавишу "Up" или "Down"' ;
WaitClick:= true ;
repeat
Application . ProcessMessages;
until a <> 0 ;
StatusBar1 . SimpleText:= '' ;
if a = 1 then
begin
end ;
if a = 2 then
begin
end ;
StatusBar1 . SimpleText:= 'Нажмите клавишу "Left" или "Right"' ;
WaitClick:= true ;
repeat
Application . ProcessMessages;
until b <> 0 ;
StatusBar1 . SimpleText:= '' ;
if b = 1 then
begin
end ;
if b = 2 then
begin
end ;
end ;
|
Вроде всё лучше некуда, но проблема в том, что когда ожидается уже второе нажатие программа выскакивает в ПЕРВОМ цикле. Я трассировал код и после прохождения первого цикла я ставил бряк на
until a <> 0; и запускал прогу. Через 1-2 секунды прога вываливается под бряком (но не всегда!). Короче чудеса да и только... Вот я и задумался об альтернативе такому приёму. Самому пока ничего в голову не пришло, может у кого то есть соображения по этому поводу?