Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.06.2013, 22:43
bleex bleex вне форума
Прохожий
 
Регистрация: 02.06.2013
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
Восклицание Delphi поиск в списке

Мне нужно сделать визуализацию, но ее нет, т.к. все закрашевается только после того как цикл отработает. как сделать что бы было видно изменения по одному элементу? а не после отработки цикла..

Код:
procedure TForm5.Timer2Timer(Sender: TObject);
var
  a: integer;
begin
  if find.checked=true then
    begin
      k:= strtoint(edit1.Text);
      for i:= 1 to m do
        begin
          lbl1[i].Color:= clYellow;
          if lbl1[i].height=k then
            begin
              lbl1[i].Color:= clGreen;
              lbl2[i].Font.Color:= clGreen;
              //showmessage('find ', k);
              //exit
            end
          else
              lbl1[i].Color:= clRed;
              //exit;
              //i:= i+1;
            end;
    end;
Ответить с цитированием
  #2  
Старый 02.06.2013, 22:45
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Добавь application.ProcessMessages в цикле.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение:
bleex (03.06.2013)
  #3  
Старый 03.06.2013, 12:31
bleex bleex вне форума
Прохожий
 
Регистрация: 02.06.2013
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Добавлять в начало цикла? или после каждого оператора?
Ответить с цитированием
  #4  
Старый 03.06.2013, 12:34
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от bleex
Добавлять в начало цикла? или после каждого оператора?
Внутри цикла, в том месте где все надписи уже обновились и должны перерисоваться. После каждого оператора не обязательно.
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
bleex (03.06.2013)
  #5  
Старый 03.06.2013, 12:41
bleex bleex вне форума
Прохожий
 
Регистрация: 02.06.2013
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

не замедляется..
Ответить с цитированием
  #6  
Старый 03.06.2013, 12:44
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от bleex
не замедляется..
Для замедления (приостановки) используй функцию Sleep (сразу после Application.ProcessMessages):
Код:
Sleep(5000); // Приостановка на 5 секунд
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
bleex (03.06.2013)
  #7  
Старый 03.06.2013, 13:16
bleex bleex вне форума
Прохожий
 
Регистрация: 02.06.2013
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
Лампочка

Я вставил после каждого закрашивания, но работает нормально только в проверке (при закрашивании зеленым) если вставлять только в начале цикла (после желтого) проходит до 3го элемента и виснет, тоже самое если после закрашивания красным..

Код:
procedure TForm5.Timer2Timer(Sender: TObject);
var
  a: integer;
begin
  if find.checked=true then
    begin
      k:= strtoint(edit1.Text);
      for i:= 1 to m do
        begin
          //y:= i;
          //yellow;
          lbl1[i].Color:= clYellow;
          application.ProcessMessages;
          Sleep(500);
          if lbl1[i].height=k then
            begin
              //g:= i;
              //green
              lbl1[i].Color:= clGreen;
              lbl2[i].Font.Color:= clGreen;
              application.ProcessMessages;
              Sleep(500);
              //showmessage('find ', k);
              //exit
            end
          else
              //r:= i;
              //Red;
              lbl1[i].Color:= clRed;
              application.ProcessMessages;
              Sleep(500);
              //exit;
              //i:= i+1;
            end;
    end;
end;
Ответить с цитированием
  #8  
Старый 03.06.2013, 13:23
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от bleex
Я вставил после каждого закрашивания, но работает нормально только в проверке (при закрашивании зеленым) если вставлять только в начале цикла (после желтого) проходит до 3го элемента и виснет, тоже самое если после закрашивания красным..

Код:
procedure TForm5.Timer2Timer(Sender: TObject);
var
  a: integer;
begin
  if find.checked=true then
    begin
      k:= strtoint(edit1.Text);
      for i:= 1 to m do
        begin
          //y:= i;
          //yellow;
          lbl1[i].Color:= clYellow;
          application.ProcessMessages;
          Sleep(500);
          if lbl1[i].height=k then
            begin
              //g:= i;
              //green
              lbl1[i].Color:= clGreen;
              lbl2[i].Font.Color:= clGreen;
              application.ProcessMessages;
              Sleep(500);
              //showmessage('find ', k);
              //exit
            end
          else
              //r:= i;
              //Red;
              lbl1[i].Color:= clRed;
              application.ProcessMessages;
              Sleep(500);
              //exit;
              //i:= i+1;
            end;
    end;
end;
У тебя просто таймер срабатывает повторно ещё до того как проработает весь цикл от предыдущего срабатывания таймера. При входе в обработчик таймера отключай его (Timer2.Enabled:=False), а при выходе опять включай (Timer2.Enabled:=True).
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
bleex (03.06.2013)
  #9  
Старый 03.06.2013, 15:09
bleex bleex вне форума
Прохожий
 
Регистрация: 02.06.2013
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
Радость

Понял, спасибо !

Все работает, только теперь не останавливается таймер, сам себя так же запускает..

Все - разобрался. Работает

только почему то 1 раз только работает поиск

Последний раз редактировалось M.A.D.M.A.N., 03.06.2013 в 19:21.
Ответить с цитированием
  #10  
Старый 03.06.2013, 19:21
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Так, товарищ bleex, кончаем устраивать из форума чат и пользуемся кнопкой "Правка"!
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #11  
Старый 03.06.2013, 19:33
bleex bleex вне форума
Прохожий
 
Регистрация: 02.06.2013
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
Счастье

Работает поиск 1 раз.
Если раскомментировать "Timer2.Enabled:= True;" в конце, то ищет бесконечно..

Код:
procedure TForm5.Timer2Timer(Sender: TObject);
var
  a, с: integer;
  s: string;
begin
  Timer2.Enabled:=False;
  с:= 0;
  if find.checked=true then
    begin
      k:= strtoint(edit1.Text);
      for i:= 1 to m do
        begin
          label1.Caption:= inttostr(i);
          lbl1[i].Color:= clYellow;
          application.ProcessMessages;
          Sleep(100);
          if lbl1[i].height=k then
            begin
              lbl1[i].Color:= clGreen;
              lbl2[i].Font.Color:= clGreen;
              с:= с+1;
              s:= inttostr(с);
              application.ProcessMessages;
              Sleep(100);
              if (i=m) and (с>0) then
                begin
                  ShowMessage(s);
                  Timer2.Enabled:=False;
                end;
              if (i=m) and (с=0) then
                begin
                  ShowMessage('Закончено');
                  Timer2.Enabled:=False;
                end;
            end
          else
              lbl1[i].Color:= clRed;
              application.ProcessMessages;
              Sleep(100);
              if (i=m) and (с>0) then
                begin
                  ShowMessage('Закончено');
                   Timer2.Enabled:=False;
                end;
              if (i=m) and (с=0) then
                begin
                  ShowMessage('Таких элементов не найдено');
                  Timer2.Enabled:=False;
                end;
            end;
    end;
   //Timer2.Enabled:=True;
end;
Ответить с цитированием
  #12  
Старый 03.06.2013, 19:44
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Вместо последующих после первого использования Timer2.Enabled:=False внутри процедуры попробуйте использовать Exit, надо прерывать цикл, если всё закончено.

З.Ы. Ну или нужно тогда глобальный флаг использовать - если он true, то продолжить, false - оставить как есть.

Код:
Timer2.Enabled:= flg;

Последний раз редактировалось Alegun, 03.06.2013 в 19:52.
Ответить с цитированием
  #13  
Старый 03.06.2013, 19:53
bleex bleex вне форума
Прохожий
 
Регистрация: 02.06.2013
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

пробовал и exit и break - эффект один и тот же - либо 1 раз, либо бесконечно

насчет флага - что то не пойму..

Последний раз редактировалось bleex, 03.06.2013 в 19:57.
Ответить с цитированием
  #14  
Старый 03.06.2013, 20:00
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от bleex
пробовал и exit и break - эффект один и тот же - либо 1 раз, либо бесконечно...
А чем таймер запускается?
Ответить с цитированием
  #15  
Старый 03.06.2013, 20:06
bleex bleex вне форума
Прохожий
 
Регистрация: 02.06.2013
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

если вставляю break после смены цвета - ничего не меняется;
если ставлю exit - работает 1 раз, так же как и с timer.interval:=0
запускаю с кнопки:
Код:
procedure TForm5.FindbClick(Sender: TObject);
begin
   timer2.Interval:= 1000;
end;
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:50.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter