Тема: Потоки
Показать сообщение отдельно
  #7  
Старый 29.11.2007, 20:46
Аватар для AXS
AXS AXS вне форума
Новичок
 
Регистрация: 26.11.2006
Адрес: РК г. Талдыкорган
Сообщения: 67
Репутация: 15
По умолчанию

Не хотел плодить темы поэтому пишу сюда (вопрос похож).
В общем есть функция и в ней два, а может и более раз, требуется обработать сообщение (действие) пользователя. Короче надо чтоб юзер нажал клавишу и в зависимости от того какую клавишу он нажал делать дальнейший расчёт. Вот примерно так я реализовал:

Глобальные переменные (кажется так называются...)
Код:
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
    //Обрабатываем клавишу 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 секунды прога вываливается под бряком (но не всегда!). Короче чудеса да и только... Вот я и задумался об альтернативе такому приёму. Самому пока ничего в голову не пришло, может у кого то есть соображения по этому поводу?
Ответить с цитированием