Не хотел плодить темы поэтому пишу сюда (вопрос похож).
В общем есть функция и в ней два, а может и более раз, требуется обработать сообщение (действие) пользователя. Короче надо чтоб юзер нажал клавишу и в зависимости от того какую клавишу он нажал делать дальнейший расчёт. Вот примерно так я реализовал:
Глобальные переменные (кажется так называются...)
Код:
//. . .
var
a, b : Integer;
WaitClick : Boolean;
//. . .
Обработка клавиатуры
Код:
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;
Функция
Код:
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
//Обрабатываем клавишу Up
end;
if a = 2 then
begin
//Обрабатываем клавишу Down
end;
//. . .
// Второй раз требуется узнать какую клавишу нажал юзер
StatusBar1.SimpleText:='Нажмите клавишу "Left" или "Right"';
WaitClick:=true;
repeat
Application.ProcessMessages;
until b <> 0;
StatusBar1.SimpleText:='';
if b = 1 then
begin
//Обрабатываем клавишу Left
end;
if b = 2 then
begin
//Обрабатываем клавишу Right
end;
//. . .
end;
Вроде всё лучше некуда, но проблема в том, что когда ожидается уже второе нажатие программа выскакивает в ПЕРВОМ цикле. Я трассировал код и после прохождения первого цикла я ставил бряк на
until a <> 0; и запускал прогу. Через 1-2 секунды прога вываливается под бряком (но не всегда!). Короче чудеса да и только... Вот я и задумался об альтернативе такому приёму. Самому пока ничего в голову не пришло, может у кого то есть соображения по этому поводу?