Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.06.2010, 08:01   #1
tred
чайник
Пользователь
 
Аватар для tred
 
Регистрация: 24.06.2010
Сообщений: 44
Печаль прога виснет из-за goto

Здравствуйте, у меня прога виснет из-за этой процедуры . Если закоментировать оператор goto тогда работает.


procedure TForm1.WM_HotKeyHandler (var Message: TMessage);
var
idHotKey: integer;
fuModifiers: word;
uVirtKey: word;
label
m;
begin

idHotkey:= Message.wParam;
fuModifiers:= LOWORD(Message.lParam);
uVirtKey:= HIWORD(Message.lParam);

i f (fuModifiers = MOD_ALT) AND (uVirtKey = VK_F10) then
caption:='альт+ф10 нажата';
m:
sleep(2000);
keybd_event(Ord('K'), 0, 0, 0);
sleep(500);
keybd_event(Ord('k'), 0, KEYEVENTF_KEYUP, 0);
sleep(500);
keybd_event(Ord('K'), 0, 0, 0);
sleep(500);
keybd_event(Ord('k'), 0, KEYEVENTF_KEYUP, 0);
goto m;
inherited;
end;

Последний раз редактировалось tred; 27.06.2010 в 08:25.
tred вне форума Ответить с цитированием
Старый 27.06.2010, 08:47   #2
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Не много не понятно, что вы хотите от goto. Если там одно действие sleep(500), то как бы sleep - это зависание компьютера на некоторое время.
И ещё: объявление лэйблов, как правило, происходит до var'а.
_-Re@l-_ вне форума Ответить с цитированием
Старый 27.06.2010, 08:56   #3
tred
чайник
Пользователь
 
Аватар для tred
 
Регистрация: 24.06.2010
Сообщений: 44
По умолчанию

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
Не много не понятно, что вы хотите от goto. Если там одно действие sleep(500), то как бы sleep - это зависание компьютера на некоторое время.
И ещё: объявление лэйблов, как правило, происходит до var'а.
я хочу чтобы этот цикл повторялся до наступления какого либо события но после запуска прога не реагирует ни на какие события приходится выключать через диспетчер задач
tred вне форума Ответить с цитированием
Старый 27.06.2010, 09:10   #4
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Так используйте не лэйблы, а циклы. До наступления какого события вы хотите повторять?
_-Re@l-_ вне форума Ответить с цитированием
Старый 27.06.2010, 09:13   #5
tred
чайник
Пользователь
 
Аватар для tred
 
Регистрация: 24.06.2010
Сообщений: 44
По умолчанию

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
Так используйте не лэйблы, а циклы. До наступления какого события вы хотите повторять?
вот кнопка с отменой предыдущего цикла но она невидна после того как горячие клавиши нажаты


procedure TForm1.Button2Click(Sender: TObject);
begin
UnregisterHotKey(handle, keyid);
GlobalDeleteAtom(keyid);
caption:='ловушка отключена';

end;

убрал слип так вобще весь компьютер повис
мне кажется буфер клавиатуры переполняется, может есть какаянибудь функция для его очистки

Последний раз редактировалось tred; 27.06.2010 в 09:34.
tred вне форума Ответить с цитированием
Старый 27.06.2010, 10:15   #6
bag
Пользователь
 
Регистрация: 20.06.2008
Сообщений: 95
По умолчанию

Попробуй доработать программу, вставив в нее команду Application.ProcessMessages():
Код:
procedure TForm1.WM_HotKeyHandler (var Message: TMessage);
var
idHotKey: integer;
fuModifiers: word;
uVirtKey: word;
label
m;
begin

idHotkey:= Message.wParam;
fuModifiers:= LOWORD(Message.lParam);
uVirtKey:= HIWORD(Message.lParam);

i f (fuModifiers = MOD_ALT) AND (uVirtKey = VK_F10) then
caption:='альт+ф10 нажата';
m:
sleep(2000);
keybd_event(Ord('K'), 0, 0, 0);
sleep(500);
keybd_event(Ord('k'), 0, KEYEVENTF_KEYUP, 0);
sleep(500);
keybd_event(Ord('K'), 0, 0, 0);
sleep(500);
keybd_event(Ord('k'), 0, KEYEVENTF_KEYUP, 0);
Application.ProcessMessages();    // !!!
goto m;
inherited;
end;
Работает?
Не забывайте оставлять отзывы (кнопочка в левом нижнем углу сообщения)
bag вне форума Ответить с цитированием
Старый 27.06.2010, 10:20   #7
bag
Пользователь
 
Регистрация: 20.06.2008
Сообщений: 95
По умолчанию

Дело в том, что Windows ждет пока накопятся задачи в очереди а не выполняет их сразу, Application.ProcessMessages() заставляет выполнить все задачи которые накопились в данный момент. Более подробно смотри здесь: http://www.delphisources.ru/pages/fa...smessages.html
Не забывайте оставлять отзывы (кнопочка в левом нижнем углу сообщения)
bag вне форума Ответить с цитированием
Старый 27.06.2010, 10:26   #8
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Команда перехода (в данном случае безусловнрго) должна применяться по какому либо событию или условию, которое затем должно измениться. А здесь пример классического бесконечного зацикливания.
Как пример простенький код
Код:
label  metka;
var count: integer;
begin
  count:= 0; // нач. знач. счетчика = 0
  metka: Inc(count); // увеличиваем значение счетчика
  if count < 101 then GOTO metka; // проверяем счетчик и если значение не достигло 100 повторяем процедуру увеличения знач. счетчика
  < продолжаем выполнять код программы >
end;
Естественно, это не корректный стиль кода, так как все это можно организовать в обычном цикле While ... do.
А пример показан для правильного применения оператора Goto.
Добавлю, что оператор Goto обычно применяется, когда требуется организовать выход из большого количества вложенных циклов или вложенных условных операторов вида if ...then
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 27.06.2010, 10:34   #9
tred
чайник
Пользователь
 
Аватар для tred
 
Регистрация: 24.06.2010
Сообщений: 44
По умолчанию

всем спасибо получилось )) с оператором Application.ProcessMessages();
tred вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
На музыке виснет ноутбук. ariya Компьютерное железо 8 23.12.2009 08:26
Помогите понять почему прога виснет Asira Помощь студентам 5 21.12.2009 22:57
Виснет автофильтр Virtuoz Microsoft Office Excel 1 15.12.2009 11:46
Виснет ноут. Небесный Компьютерное железо 4 29.04.2009 00:40
logonui- виснет :_( steck Свободное общение 0 03.09.2007 16:38