Другие языки программирования и технологии

В Делфи7. Загвоздка с меседжбоксами!

Оба Меседжбокса в процедурах таймеров (2 таймера) сначала при движении мыши выскакивает первый меседж, после если нажимается ОК, таймер первого меседжа выкл., 2й таймер вкл. и соответсвенно выскакивает 2й меседж, но как сделать чтобы не несколько раз клацать на кнопку ОК, а с первого клика условие выполнялось привожу листинг 1го таймера: procedure TForm1.Timer1Timer(Sender: TObject); var foo: TPoint; foo1: TPoint; Xfoo: string; Yfoo: string; Xfoo1: string; Yfoo1: string; X : string; q :integer; begin GetCursorPos(foo); Xfoo := IntToStr(foo.X); Yfoo := IntToStr(foo.Y); sleep(1); GetCursorPos(foo1); While (foo.X<>foo1.X) or (foo.Y<>foo1.Y) do begin X:='Ìûøü áûëà ïåðåäâèíóòà â ïîëîæåíèå X= '+ Xfoo +';'+' Y= '+ Yfoo +';'+ ' óñòàíîâèòü äðàéâåð äëÿ íîâîé êîíôèãóðàöèè? (ïîòðåáóåòñÿ ïåðåçàïóñê)'; if Application.MessageBox(PChar(x),'Ñèñòåìíîå ñîîáùåíèå WINDOWS' ,MB_OKCANCEL+MB_ICONEXCLAMATION)= IDOK then q:=1; repeat Application.MessageBox(PChar(x),'Ñèñòåìíîå ñîîáùåíèå WINDOWS' ,MB_OKCANCEL+MB_ICONEXCLAMATION) until q=1; if q=1 then begin Timer1.Enabled:=False; Timer2.Enabled:=True; end; end; end; и еще как сделать чтобы окна меседжей были всегда сверху (просто меседж без апликэйшен не идет)?
Это че ваще? О_о
ты как минимум два раза жмешь на кнопку) ) вместо repeat используй wile тогда один будет.. . попробуй нажать на отмену и она наверно зациклится в твоем исполнении =))
условие в цикл перенеси под repeat тогда все ровно будет!)) )
MB_APPLMODAL, MB_SYSTEMMODAL, MB_TASKMODALа вот тебе флаги для "сверху"
Дмитрий Карандей
Дмитрий Карандей
952
Лучший ответ
Таймеры не для этого. Здесь лучше пару потоков использовать. Но это немножко сложнее. Нужно понять, как работает синхронизация в винде и под дельфи в частности, что такое события, семафоры, мьютексы, критические секции.. . Непонятна цель всего этого кода. Лучше б вкратце описал, что хочешь напрограммить.
Сергей Краус
Сергей Краус
40 192
Короче, нужно, чтобы не выводилось несколько месседжэв подряд? Просто заведи булеву переменную (скажем, b), изначально в проге присвой ей true, тело обработчика первого таймера засунь в конструкцию if b then begin ...end;, непосредственно перед ShowMessage мессэджа напиши b := false, а непосредственно после того же самого ShowMessage напиши b := true;. Тогда пока показан мессэдж первым таймером, этот таймер, по сути, работать не будет (в обработчике ничего не будет выполняться, пока мессэдж не будет закрыт пользователем) .

А вообще код жутко страшный и непонятный, отслеживать передвижение мыши в таймере - не очень хорошая идея, Александр Ильин +1.
Короче тебе нужно чтобы при достижении определенной точки указателя мыши выводился один MessageBox и после нажатия на кнопку ОК просто запускался второй таймер и все. Так я понял?

ЗЫ: и пожалуйста поменяй кодировку.... что ты там в Мessage выводишь за сообщение. Не могу определить