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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 28.08.2013, 13:19   #1
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
Вопрос Запутался в цикле

Код:
procedure TForm3.Button1Click(Sender: TObject);
//переменные
...
//проверки
...

Infinity1:=True;
Timer1.Enabled:=True;
Interval:=StrToInt(Edit2.Text);
//Timer1.Interval:=(Interval*1000)*60;
 Timer1.Interval:=5000; // пока так для теста

while (Infinity1) do
begin
  for ii1 := 0 to 2 do
    begin
      SetCursorPos(Point_advanced[ii1].X, Point_advanced[ii1].Y);
      mouse_event(MOUSEEVENTF_LEFTDOWN,Point_advanced[ii1].X,Point_advanced[ii1].Y,0,0);
      mouse_event(MOUSEEVENTF_LEFTUP,Point_advanced[ii1].X,Point_advanced[ii1].Y,0,0);
      Sleep(Speed1);
      Application.ProcessMessages;
      if StopCircle then exit;
      if memo2.Lines.count=4 then begin proverka:=true; end;
      if (stopminicircle) and (proverka = false) then begin break; end;
      if (stopminicircle) and (proverka = true) then begin exit; end;
    end;
    iRepeats1 := iRepeats1 + 1;
    if (stopminicircle) and (proverka = false) then break;
end;


stopminicircle := false;
Timer1.Enabled:=True;

while (Infinity1) do
begin
  for ii1 := 3 to 5 do
    begin
        SetCursorPos(Point_advanced[ii1].X, Point_advanced[ii1].Y);
      mouse_event(MOUSEEVENTF_LEFTDOWN,Point_advanced[ii1].X,Point_advanced[ii1].Y,0,0);
      mouse_event(MOUSEEVENTF_LEFTUP,Point_advanced[ii1].X,Point_advanced[ii1].Y,0,0);
      Sleep(Speed1);
      Application.ProcessMessages;
      if StopCircle then exit;
      if stopminicircle then break;
    end;
    iRepeats1 := iRepeats1 + 1;
    if stopminicircle then break;
end;

stopminicircle := false;
Timer1.Enabled:=True;

....

Теперь постараюсь рассказать в чем суть

Итак, есть таймер. Заданы координаты. Разрешено задавать по 3 координаты. То есть - 3,6,9.. и т.д. После нажатия на Button начинается первый цикл. Если было задано 3 координаты ( Memo2.Lines.Count = 4, там первая строка "------1-----" так что именно 4 ), то после того как сработает таймер срабатывает Exit из процедуры, если же Memo2.Lines.Count не равно 4, то идет break и переход в другой цикл. Все работает, вот только при случае если Memo2.Lines.Count = 4 первый раз срабатывает все как я хочу. Идет переход по координатам и через интервал выходит из процедуры. Но если я второй раз нажимаю на Button при этом же условии, то мышка устанавливается на первой координате и сразу идет Exit. Почему так? Думаю какая-то переменная не обнуляется, но сколько копал - все правильно, опять таки на мой взгляд.
Praud вне форума
Старый 28.08.2013, 14:01   #2
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,926
По умолчанию

А где-нибудь в коде есть строка
Код:
proverka:=false;
?
northener вне форума
Старый 28.08.2013, 14:11   #3
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

Код:
procedure TForm3.Timer1Timer(Sender: TObject);
begin
stopminicircle:=True;
Timer1.Enabled:=False;
proverka:=false;
end;
Praud вне форума
Старый 28.08.2013, 14:42   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,926
По умолчанию

Ну так пройдитесь отладчиком по Button1Click и посмотрите почему при повторном нажатии происходит выход из процедуры.
northener вне форума
Старый 28.08.2013, 14:54   #5
asmprog
Пользователь
 
Регистрация: 10.08.2013
Сообщений: 67
По умолчанию

задание интервала после включения таймера выглядит странным:
Код:
Timer1.Enabled:=True;
...
 Timer1.Interval:=5000; // пока так для теста
еще, есть ли какой-то смысл после второго цикла снова включать таймер?
Код:
stopminicircle := false;
Timer1.Enabled:=True;
при срабатывании таймера ведь:
Код:
stopminicircle:=True;
...
proverka:=false;
asmprog вне форума
Старый 28.08.2013, 19:46   #6
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

После второго цикла есть еще 3-ий и 4-ый и т.д поэтому есть смысл включать таймер.


2 northener - если честно я не умею отладчиком пользоваться, не знаю как он работает
Praud вне форума
Старый 29.08.2013, 14:06   #7
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

Есть какие-то еще идеи?
Praud вне форума
Старый 29.08.2013, 14:37   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Exit зависит от значений переменных StopCircle, stopminicircle и proverka. Вот и проверь где засунул туда не то что надо. А вообще умиляет код типа
Код:
      if (stopminicircle) and (proverka = true) then begin exit; end;
почему не просто
      if stopminicircle and proverka then exit;
Какая особенность у proverka, в отличиии от stopminicircle?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума
Старый 29.08.2013, 15:23   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
Есть какие-то еще идеи?
1. заменить переменные на локальные.
2. инициализировать флаги при входе в циклы.
3. выкинуть из цикла ProcessMessage и избавиться от бесконечного запутанного цикла.
В программе и так есть этот самый бесконечный цикл. то есть нужен
а) ГЛОБАЛЬНЫЙ счетчик проверок. (вместо for i=0 to 2 for i:=3 to 5
б) запуск проверки по таймеру (вместо sleep и ProcessMessage)
в) локальные флаги проверок (вместо глобальных)
г) разделение проверок на разовую (только при нажатии)
таймер запускается только при успехе.
и повторную (по таймеру). c контролем по числу попыток или использование контрольного времени.

Код:
procedure T....ButtonXClick(sender: TObject);
begin
  if timer1.Enabled then //что на делать если таймер проверки уже включен
  else begin
    Timer1.enabled:=     // а можем ли мы запустить таймер
  end;
end;
Код:
procedure T....Timer1Time(sender: TObejct);
var
  prov, provX: boolean;
begin
  prov:=false;
  provX:=false;
.... //код ВЫЧИСЛЯЮЩИЙ нужное значение prov , provX

  if prov then begin
      SetCursorPos(Point_advanced[ii1].X, Point_advanced[ii1].Y);
      mouse_event(MOUSEEVENTF_LEFTDOWN,Point_advanced[ii1].X,Point_advanced[ii1].Y,0,0);
      mouse_event(MOUSEEVENTF_LEFTUP,Point_advanced[ii1].X,Point_advanced[ii1].Y,0,0);
  end;

  if ...  then Timer1.enabled:=false;  //   if provx then (sender as TTimer).enabled:=false;
end;
и главное
3. написать здесь исходную задачу.

не
Цитата:
После нажатия на Button начинается первый цикл. Если было задано 3 координаты
а что-то вроде:
ввести в мемо данные
при нажатии на кнопку
1. проверить данные
2. если данные корректны, то имитировать нажатие мыши ...
иначе ???
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 29.08.2013 в 15:49.
evg_m вне форума
Старый 29.08.2013, 15:46   #10
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Exit зависит от значений переменных StopCircle, stopminicircle и proverka. Вот и проверь где засунул туда не то что надо. А вообще умиляет код типа
Код:
      if (stopminicircle) and (proverka = true) then begin exit; end;
почему не просто
      if stopminicircle and proverka then exit;
Какая особенность у proverka, в отличиии от stopminicircle?
Вот ищу ищу и не могу найти. А в коде begin exit end; написал чтобы 100% быть уверенным, что при true будет выполняться только exit, это я уже написал после того как перестало работать. proverka=true мне привычнее, хотя надо переучиваться.

stopminicircle переключается в true, когда заканчивается таймер.
Proverka создана для того, чтобы узнавать введено ли в Memo2 4 строки. ( 3 координаты, первая строка "-----1----" ). И если щелкает таймер а в мемо введено 8 строк к примеру, идем по ветке break и перескакиваем в другой цикл, а если 4 строки, идем по ветки exit;
Praud вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запутался с кодировкой Blad47 Свободное общение 6 25.08.2011 17:12
Запутался с формами iHikita Общие вопросы .NET 6 30.07.2010 16:08
Запутался с CopyRect Alex Cones Общие вопросы Delphi 2 01.12.2009 20:55
запутался! mistertvister Помощь студентам 3 28.10.2009 14:52
запутался в процедурах world12_tk Помощь студентам 6 03.03.2009 18:57