Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа цикла пока не нажата кнопка 
:(
    Опции темы
Гость_Drizhenko
Дата 18.10.2005, 07:22 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Помогите пожалуйста. Возникает задача создать цикл, который будет выполняться пока не нажата кнопка button2. То есть, что нужно поставить вместо точек? Или может организовать другой цикл, не while.

Код

while ...  do
  begin
    for i:=1 to 50 do
      begin
        memo1.Lines.Add(IntTostr(i));
        sleep(200);
      end;
  end;
end;


На форме две кнопки (button1 и button2). Первая запускает цикл, вторая остонавливает + memo1 для вывода на экран.

Код у меня не на C++, а не Delphi.
  Вверх
Zero
Дата 18.10.2005, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: 8
Всего: 24



Цитата
Или может организовать другой цикл, не while.

А может, тогда тебе на форму кинуть таймер, и когда нажмёш кнопку, значение Enable присваивай false, и цикл остановится.
Цитата(Drizhenko @ 18.10.2005, 08:26)
Код у меня не на C++, а не Delphi.

В Билдере всё как в Delphi, поэтому разницы нету.
Добавлено @ 07:46
Вот пример:
Код

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  for (int i = 1; i<=50; i++)
    {
       Memo1->Lines->Add(i);
    };
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Timer1->Enabled = (Timer1->Enabled)?false: true;  //На одну кнопку можно и запускать и останавливать цикл...
}


Это сообщение отредактировал(а) Zero - 18.10.2005, 07:50
PM MAIL ICQ   Вверх
Zero
Дата 18.10.2005, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: 8
Всего: 24



А-а-а... блин, перепутал.... Если на делфи то, так:
Код

procedure TForm1.Timer1Timer(Sender: TObject);
var i:integer;
begin
  for i:=1 to 50 do
    memo1.Lines.Add(IntToStr(i));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Timer1.Enabled = false then
    Timer1.Enabled := true
  else Timer1.Enabled := false;
end;

А из за такой строки будут глюки:
Код

sleep(200);

PM MAIL ICQ   Вверх
Drizhenko
Дата 18.10.2005, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 13.1.2005

Репутация: нет
Всего: нет



Интересное решение, но есть одно но. Когда я нажимаю кнопку, то таймер начинает работу, и в мемо вписываюся цифры и пока они не напишутся до 50 таймер не остнавится даже если я буду нажимать кнопку. А это неприемлимо, работа должна прикращаться ни когда выполнится цикл в любое время.
А вообще, спасибо за помощь.
Добавлено @ 09:31
Извиняюсь за граматические ошибки.

работа должна прикращаться ни тогда когда выполнится цикл, а в любое время.
PM MAIL   Вверх
Zero
Дата 18.10.2005, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: 8
Всего: 24



Цитата(Drizhenko @ 18.10.2005, 10:26)
но есть одно но. Когда я нажимаю кнопку, то таймер начинает работу, и в мемо вписываюся цифры и пока они не напишутся до 50 таймер не остнавится даже если я буду нажимать кнопку. А это неприемлимо

Млин, ты же сам написал что должен прекращатся вот этот цикл:
Код

while ...  do

А этот:
Код

for i:=1 to 50 do
ясное дело не остановится...
Из-за вот этой строки:
Код

sleep(200);

Но если тебе нужно, просто выводить цифры от 1 до 50, периодически, а в нужное время останавливать, тогда можно сделать так:
Интервал таймера ставь 200 и коды такие:
Код

var
  Form1: TForm1;
  i:integer;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Timer1.Enabled then
    Timer1.Enabled := false
  else
    Timer1.Enabled := true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if i>=51 then i:=1;
  memo1.Lines.Add(IntToStr(i));
  inc(i);
end;

Единственный недостаток, это то что тут переменная i обявлена как глобальная...
PM MAIL ICQ   Вверх
Drizhenko
Дата 18.10.2005, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 13.1.2005

Репутация: нет
Всего: нет



Спасибо, работает.
А что означает функция inc(i). Я в Дельфи новичок.
PM MAIL   Вверх
Alexeis
Дата 18.10.2005, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



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


попробуй

Код

var
  Form1: TForm1;
  fl : Boolean = false;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  fl := true;
end;

..............
while not fl do
  begin
    for i:=1 to 50 do
      begin
        memo1.Lines.Add(IntTostr(i));
        application.processmessages;
     end;
  end;
.............







--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Zero
Дата 18.10.2005, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: 8
Всего: 24



Цитата(Drizhenko @ 18.10.2005, 11:06)
А что означает функция inc(i). Я в Дельфи новичок.

Это альтенатива:
Код

i:=i+1;

Только
Код

inc(i);  
работает быстрее... Привычка у меня такая ставить её...
При инк, типа такого получается:
Код

Add i,1


Это сообщение отредактировал(а) Zero - 18.10.2005, 10:17
PM MAIL ICQ   Вверх
Alexeis
Дата 18.10.2005, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



inc(i); => i := i + 1;



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
YurikGL
Дата 18.10.2005, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 5.7.2005
Где: Уфа

Репутация: нет
Всего: 2



Держи рабочий код

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Memo1: TMemo;
    Button1: TButton;
    procedure FormShow(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    i:integer;
    OutPutEnable,fl1:boolean;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
   i:=1;
   Timer1.Interval:=500;//Задержка между выводом символов
   fl1:=true;
   OutPutEnable:=false;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if OutPutEnable then OutPutEnable:=false
                   else OutPutEnable:=true;
  while OutPutEnable do begin
    Memo1.Lines.add(IntToStr(i));
    inc(i);
    if i>50 then i:=1;
    fl1:=true;
    while fl1 do Application.ProcessMessages;
                        end;

end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  fl1:=false;
end;

end.


Это сообщение отредактировал(а) YurikGL - 18.10.2005, 22:03
--------------------
 
PM MAIL WWW ICQ   Вверх
FRAGNATIC
Дата 18.10.2005, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


Профиль
Группа: Участник
Сообщений: 901
Регистрация: 17.10.2004
Где: ICQ

Репутация: 6
Всего: 11



да зачем таймеры то?
самый номаный вариант как уже предложил
alexeis1
Код

  fl : Boolean = false;    
implementation    
{$R *.dfm}    
procedure TForm1.Button1Click(Sender: TObject);    
begin    
  fl := true;    
end;    
..............    
while not fl do    
  begin    
    for i:=1 to 50 do    
      begin    
        memo1.Lines.Add(IntTostr(i));    
        application.processmessages;    
     end;    
  end;    
.............


Это сообщение отредактировал(а) Girder - 19.10.2005, 15:37
PM MAIL   Вверх
Drizhenko
Дата 19.10.2005, 05:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 13.1.2005

Репутация: нет
Всего: нет



Цитата
procedure TForm1.Button1Click(Sender: TObject);
begin
  fl := true;
end;

Получается, что при нажатии кнопки f1 призваивается значение true, а цикл while начинает работу когда f1 ложно. То есть цикл никогда ни начнет работу. Если сделать так:
Код

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  i:integer;
  fl : Boolean = false;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin
  fl := false;

while not fl do
  begin
    for i:=1 to 50 do
      begin
        memo1.Lines.Add(IntTostr(i));
        application.processmessages;
     end;
  end;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  fl := true;
end;

end.

то все работает, но опять же цикл прекращает свою работу когда он переберёт все значения. НЕ ТО !!!!

Спасибо всем, остальное еще не попробовал.






PM MAIL   Вверх
Albinos_x
Дата 19.10.2005, 06:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



попробуй так:
Код

var    
  Form1: TForm1;    
  fl : Boolean = false;    
implementation    
{$R *.dfm}    
procedure TForm1.Timer1Timer(Sender: TObject);    
var i:integer;    
begin    
  for i:=1 to 50 do
    begin
     application.processmessages;
    If not Timer1.Enabled then Exit;    
    memo1.Lines.Add(IntToStr(i));
    end;    
end;    

procedure TForm1.Button1Click(Sender: TObject);    
begin    
  if Timer1.Enabled = false then
     begin
    Button1.Caption:='Остановить';    
    Timer1.Enabled := true
    end    
  else
  begin
 Timer1.Enabled := false;
  Button1.Caption:='Запустить'; 
  end;    
end;


Цитата
но опять же цикл прекращает свою работу когда он переберёт все значения. НЕ ТО !!!!

Конечно будет перебирать все значения у тебя.... у тебя нет проверки внутри цикла на выполнение условия останова, т.е. правильнее так:
Код

procedure TForm1.Button1Click(Sender: TObject);    
begin    
  fl := false;    
while not fl do    
  begin    
    for i:=1 to 50 do    
      begin    
        memo1.Lines.Add(IntTostr(i));    
        application.processmessages;
        If fl then Exit;    { выходим из процедуры, если просто нужно остановить цикл, допустим выполнить необходимые действия после цикла, то вместо Exit пишем Break}
     end;    
  end;    
end;


Это сообщение отредактировал(а) Albinos_x - 19.10.2005, 06:55


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Alexeis
Дата 19.10.2005, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Вероятено
код будет работать если эту процедуру запустить отдельным
потоком, тогда реакция будет незамедлительной


Код

procedure TForm1.Button1Click(Sender: TObject);

begin
  fl := false;

while not fl do
  begin
    for i:=1 to 50 do
      begin
        //тут должна быть критическая секция
        memo1.Lines.Add(IntTostr(i));
        application.processmessages;
        If fl then Exit; //Как мне верно указали
     end;
  end;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 //тут должна быть критическая секция
  fl := true;
end;


Поправлено 13.00

Это сообщение отредактировал(а) alexeis1 - 19.10.2005, 12:45


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Albinos_x
Дата 19.10.2005, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата(alexeis1 @ 19.10.2005, 09:26)
while not fl do
  begin
    for i:=1 to 50 do
      begin
        //тут должна быть критическая секция
        memo1.Lines.Add(IntTostr(i));
        application.processmessages;
    end;
  end;


повторяете предыдущую ошибку, этот код не остановит цикл, я же писал:

Цитата(Albinos_x @ 19.10.2005, 06:54)
for i:=1 to 50 do   
      begin   
        memo1.Lines.Add(IntTostr(i));   
        application.processmessages;
        If fl then Exit;




--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Drizhenko
Дата 19.10.2005, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 13.1.2005

Репутация: нет
Всего: нет



Цитата
//тут должна быть критическая секция

Извиняюсь за тупость, а что это значит???
PM MAIL   Вверх
YurikGL
Дата 21.10.2005, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 5.7.2005
Где: Уфа

Репутация: нет
Всего: 2



Народ, что вы спорите... я написал программу и все проверил... Все работает

Цитата
Получается, что при нажатии кнопки f1 призваивается значение true, а цикл while начинает работу когда f1 ложно. То есть цикл никогда ни начнет работу. Если сделать так:

fl1 сбрасывается таймером и цикл прекращается

цикл while OutPutEnable do тоже не бесконечен т.к. при повторном нажатии на кнопку переменная OutPutEnable будет инвертирована и цикл прекратится.

Цитата
да зачем таймеры то?

Что-бы делать задержку между выводом символов.

Короче, код рабочий. Прерывание происходит незамедлительно.

Кстати, его можно еще слегка оптимизировать

Код


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Button1: TButton;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    fl1:boolean;
    i:integer;

    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
   i:=1;
   Timer1.Interval:=500;//Задержка между выводом символов
   Timer1.enabled:=false;
   fl1:=true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Timer1.Enabled then Timer1.Enabled:=false
                    else Timer1.Enabled:=true;
  while Timer1.Enabled do begin
    Memo1.Lines.add(IntToStr(i));
    inc(i);
    if i>50 then i:=1;
    fl1:=true;
    while fl1 do Application.ProcessMessages;
                        end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
fl1:=false;
end;

end.


Это сообщение отредактировал(а) YurikGL - 22.10.2005, 08:07
--------------------
 
PM MAIL WWW ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1027 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.