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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.09.2011, 19:59   #1
hon
Форумчанин
 
Регистрация: 08.06.2011
Сообщений: 693
По умолчанию Отмена операции. Остановка процедуры

Идет какой-нибуть процесс. Как нажатием на кнопку его остановить. Набросал код, но что писать для кнопки отмена?

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    ProgressBar1: TProgressBar;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
     ProgressBar1.Position:=0;
     Label1.Caption:='Выпоненение';
     Label1.Refresh;
     while ProgressBar1.Position<>ProgressBar1.Max do
           begin
           ProgressBar1.Position:=ProgressBar1.Position+1;
           end;
     Label1.Caption:='Операция выполнено';
     Label1.Refresh;
end;

end.

Формочка:

Код:
object Form1: TForm1
  Left = 192
  Top = 114
  Width = 696
  Height = 480
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Label1: TLabel
    Left = 440
    Top = 144
    Width = 209
    Height = 13
    Caption = 'Label1'
  end
  object Button1: TButton
    Left = 32
    Top = 136
    Width = 105
    Height = 25
    Caption = 'Начать процесс'
    TabOrder = 0
    OnClick = Button1Click
  end
  object Button2: TButton
    Left = 224
    Top = 136
    Width = 97
    Height = 25
    Caption = 'Отмена'
    TabOrder = 1
  end
  object ProgressBar1: TProgressBar
    Left = 24
    Top = 64
    Width = 625
    Height = 17
    Max = 20000
    TabOrder = 2
  end
end
hon вне форума Ответить с цитированием
Старый 28.09.2011, 20:32   #2
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Я бы в формочку вёл переменную Flag : boolean котроая принимала бы значение true при запущенном процессе. При нажатии на кнопку 2, флаг бы ставал false
А в цикле while ProgressBar1.Position<>ProgressBar1 .Max do
я бы дописал условие
if not Flag then break
-----------
Типа чтото вот такого
Код:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    ProgressBar1: TProgressBar;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    Flag : boolean;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
     ProgressBar1.Position:=0;
     Flag := true;
     Label1.Caption:='Выпоненение';
     Label1.Refresh;
     while ProgressBar1.Position<>ProgressBar1.Max do
           begin
             ProgressBar1.Position:=ProgressBar1.Position+1;
             if not Flag then Break;
             Application.ProcessMessages();
           end;
     Label1.Caption:='Операция выполнено';
     Label1.Refresh;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Flag := false;
end;
end.
95% сбоев и ошибок приложений, находится в полу метрах от монитора

Последний раз редактировалось JUDAS; 28.09.2011 в 20:34.
JUDAS вне форума Ответить с цитированием
Старый 28.09.2011, 20:49   #3
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Когда закончите мыслить в кнопках и займётесь нитями/потоками - Threads и иже с ними, то дойдёте до решения задачи в общем виде.
Ну а чисто в лоб решить то, что Вы написали :
Код:
var dostop : boolean;
...
procedure TForm1.Button1Click(Sender: TObject);
begin
     ProgressBar1.Position:=0;
     Label1.Caption:='Выпоненение';
     Label1.Refresh;
     while (ProgressBar1.Position<>ProgressBar1.Max) and not dostop do
           begin
           ProgressBar1.Position:=ProgressBar1.Position+1;
           application.processmessages;
           end;
     Label1.Caption:='Операция выполнено';
     Label1.Refresh;
dostop := false;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
    dostop := true;
end;
Edit : мда ) опередили )
phomm вне форума Ответить с цитированием
Старый 28.09.2011, 20:50   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А я бы эти действия пустил в дополнительный поток...
hon, с TThread работать умеешь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.09.2011, 20:51   #5
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

http://www.delphikingdom.ru/asp/view...catalogid=1355 - в аттаче примеры
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 28.09.2011, 20:56   #6
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
TThread работать умеешь?
Правильно Stilet, поддерживаю !
Чтобы разобратся в потоках, нужно не один месяц "курить" мануалы )
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 28.09.2011, 21:15   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Чтобы разобратся в потоках, нужно не один месяц "курить" мануалы )
Посмотри: http://www.delphikingdom.ru/asp/view...catalogid=1355
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 01.10.2011, 19:56   #8
hon
Форумчанин
 
Регистрация: 08.06.2011
Сообщений: 693
Сообщение

Спасибо JUDAS. Помогло.

Цитата:
Сообщение от Stilet Посмотреть сообщение
А я бы эти действия пустил в дополнительный поток...
hon, с TThread работать умеешь?
Было бы интересно узнать как это делать. С TThead работать не умею, но это уже по ЛС, т.к. основной вопрос темы уже решен.
hon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Visual Basic ОТМЕНА ПРОЦЕДУРЫ Army Помощь студентам 1 29.06.2011 20:39
остановка цикла dgoc Помощь студентам 7 28.06.2011 02:18
Остановка потоков по ID steelforce Общие вопросы Delphi 2 24.01.2010 16:50
Аварийная остановка remz Общие вопросы Delphi 3 03.12.2009 11:34
Как определить время работы процедуры или операции? Roof Общие вопросы Delphi 7 18.01.2009 21:56