Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];

Вниз

ProcessStatus   Найти похожие ветки 

 
liver   (2005-05-31 11:41) [0]

Нужна форма которая будет показывать состояние выполнения процесса.
Как реализовать ?


 
Игорь Шевченко ©   (2005-05-31 12:02) [1]

TProgressBar ?
TGauge ?

Поискать в папке Demos по этим словам ?


 
liver   (2005-05-31 12:07) [2]

чёт я не понял...


 
Anatoly Podgoretsky ©   (2005-05-31 12:07) [3]

CreateForm/TFormX.Create


 
liver   (2005-05-31 12:09) [4]

ну как форму скриэйтить я в курсе...
как форму, с которой была вызвана форма статуса, залочить...
ну а потом соответственно сделать доступной...
Enable := False не предлагать...


 
liver   (2005-05-31 12:10) [5]

http://softwarer.ru/Describe/describe_splash.html
то что мне нужно, но форма неактивная...с ней нельзя работать...


 
Игорь Шевченко ©   (2005-05-31 12:11) [6]


> чёт я не понял...


Это пройдет. Когда поймешь, что вопросы нужно задавать так, чтобы их смысл был понятен не только тебе. Иначе это не вопрос, а флуд.


 
liver   (2005-05-31 12:15) [7]

есть массив определенной длины...
вот и хочу показывать пользователю состояние обработки...
короче говоря проценты.
Формачка статуса с прогрессбаром...
чтоб показывалась форма с бегущим статусбаром, а форма из которой вызвана была эта форма была неактивной


 
_silver ©   (2005-05-31 12:18) [8]

liver   (31.05.05 12:15) [7]
ShowModal?


 
Erik1 ©   (2005-05-31 12:20) [9]

Ты уже знаеш как будеш уведомлять форму о выполненом проценте обработаных данных?
 И как ты собираешся даные обаратывать? В отдельнм потоке или как?


 
liver   (2005-05-31 12:26) [10]

нет, не в потоке.
а уведомлять как, да передавать продцедуре, текущее значение цикла и максимальное. ну и все, прогресс сам отрисует проценты.


 
liver   (2005-05-31 12:27) [11]

ShowModal не катит, так как пока не будет ModalResult код дальше выполняться не будет.


 
Slym ©   (2005-05-31 12:29) [12]

Я делаю так... Но есть теоретически проблемы типа DeadLock


unit ThreadProgress;

interface

uses
 Windows, Messages,SysUtils, Classes, Forms, StdCtrls,ComCtrls, Controls;

type
 TProgressForm = class(TForm)
   Text: TLabel;
   ProgressBar: TProgressBar;
   Cancel: TButton;
 end;
 TThreadProgress=class;
 TCustomThread=class;
 TOnExecute=procedure(Progress:TThreadProgress) of object;

 TCustomThread = class(TThread)
 private
   FThreadProgress:TThreadProgress;
   FOnExecute:TOnExecute;
 protected
   procedure Execute; override;
 public
   property ThreadProgress:TThreadProgress read FThreadProgress write FThreadProgress;
   property OnExecute:TOnExecute read FOnExecute write FOnExecute;
 end;

 TThreadProgress = class(TComponent)
 private
   FCaption:TCaption;
   FText:TCaption;
   FCancelEnabled:boolean;
   FPosition:integer;
   FMax:integer;
   FOnExecute:TOnExecute;
   FProgressForm:TProgressForm;
   FUpdateCount:integer;
   FBeginTime:DWORD;
   FThread:TCustomThread;
   procedure SetCaption(Value:TCaption);
   procedure SetText(Value:TCaption);
   procedure SetPosition(Value:integer);
   procedure SetMax(Value:integer);
   procedure SetCancelEnabled(Value:boolean);
   Function GetTerminated:boolean;
   procedure SetTerminated(Value:boolean);
 protected
   procedure DoUpdateForm;virtual;
   procedure OnTerminate(Sender:TObject);
 public
   constructor Create(AOwner: TComponent);override;
   destructor Destroy; override;
   function Run:integer;
   procedure BeginUpdate;
   procedure EndUpdate;
 published
   property Caption:TCaption read FCaption write SetCaption;
   property CancelEnabled:boolean read FCancelEnabled write SetCancelEnabled;
   property Text:TCaption read FText write SetText;
   property Position:integer read FPosition write SetPosition;
   property Max:integer read FMax write SetMax;
   property OnExecute:TOnExecute read FOnExecute write FOnExecute;
   property Terminated:boolean read GetTerminated write SetTerminated;
 end;

procedure Register;

implementation

{$R *.dfm}

procedure Register;
begin
 RegisterComponents("Samples", [TThreadProgress]);
end;

{ TCustomThread }

procedure TCustomThread.Execute;
begin
 if assigned(FOnExecute) then
 try
   FOnExecute(FThreadProgress);
 except
   ApplicationHandleException(self);
 end;
end;

{ TThreadProgress }

constructor TThreadProgress.Create(AOwner: TComponent);
begin
 inherited;
 FOnExecute:=nil;
 FProgressForm:=nil;
 FCaption:="Подождите";
 FText:="Работаю...";
 FPosition:=0;
 FMax:=100;
 FCancelEnabled:=true;
 FUpdateCount:=0;
end;

destructor TThreadProgress.Destroy;
begin
 inherited;
end;

procedure TThreadProgress.DoUpdateForm;
begin
 if not assigned(FProgressForm) then exit;
 if FUpdateCount > 0 then Exit;

 {if (FMax>0) and (FPosition>0) then
   FText:=IntToStr(Round((GetTickCount-FBeginTime)*(FMax-FPosition)/FPosition));}

 if FProgressForm.Caption<>FCaption then
   FProgressForm.Caption:=FCaption;
 //if FProgressForm.Text.Caption<>FText then
   FProgressForm.Text.Caption:=FText;
 //if FProgressForm.ProgressBar.Position<>FPosition then
   FProgressForm.ProgressBar.Position:=FPosition;
 //if FProgressForm.ProgressBar.Max<>FMax then
   FProgressForm.ProgressBar.Max:=FMax;
 //if FProgressForm.Cancel.Enabled<>FCancelEnabled then
   FProgressForm.Cancel.Enabled:=FCancelEnabled;
 //FProgressForm.Update;
end;

procedure TThreadProgress.BeginUpdate;
begin
 Inc(FUpdateCount);
end;

procedure TThreadProgress.EndUpdate;
begin
 Dec(FUpdateCount);
 if FUpdateCount = 0 then DoUpdateForm;
end;

procedure TThreadProgress.OnTerminate(Sender: TObject);
begin
 if assigned(FProgressForm) then
 begin
   if fsModal in FProgressForm.FormState then
     FProgressForm.ModalResult:=mrOk;
   PostMessage(FProgressForm.Handle,WM_NULL,0,0);
 end;
end;

function TThreadProgress.Run:integer;
begin
 FBeginTime:=GetTickCount;
 FProgressForm:=TProgressForm.Create(nil);
 try
   DoUpdateForm;
   FThread:=TCustomThread.Create(true);
   try
     FThread.ThreadProgress:=self;
     FThread.OnExecute:=OnExecute;
     FThread.OnTerminate:=OnTerminate;
     FThread.Resume;
     result:=FProgressForm.ShowModal;
     if not FThread.Terminated then
     begin
       FThread.Terminate;
       FThread.WaitFor;
     end;
   finally
     FreeAndNil(FThread);
   end;
 finally
   FreeAndNil(FProgressForm);
 end;
end;

procedure TThreadProgress.SetCancelEnabled(Value: boolean);
begin
 if FCancelEnabled=Value then exit;
 FCancelEnabled:=Value;
 DoUpdateForm;
end;

procedure TThreadProgress.SetCaption(Value: TCaption);
begin
 if FCaption=Value then exit;
 FCaption:=Value;
 DoUpdateForm;
end;

procedure TThreadProgress.SetMax(Value: integer);
begin
 if FMax=Value then exit;
 FMax:=Value;
 DoUpdateForm;
end;

procedure TThreadProgress.SetPosition(Value: integer);
begin
 if FPosition=Value then exit;
 FPosition:=Value;
 DoUpdateForm;
end;

procedure TThreadProgress.SetText(Value: TCaption);
begin
 if FText=Value then exit;
 FText:=Value;
 DoUpdateForm;
end;

function TThreadProgress.GetTerminated: boolean;
begin
 if assigned(FThread) then
   result:=FThread.Terminated
 else
   result:=true;
end;

procedure TThreadProgress.SetTerminated(Value: boolean);
begin
 if assigned(FThread) then
   if Value then
     FThread.Terminate;
end;

end.


Использовать:


...
ThreadProgress1.OnExecute:=ThreadProgress1Execute;
ThreadProgress1.Run;
...
procedure TForm1.ThreadProgress1Execute(Progress: TThreadProgress;
 Thread: TCustomThread);
var i:integer;
begin
 for i:=0 to 100 do
 begin
   Progress.Position:=i;
   Sleep(100);
   if (i mod 20)=0 then Sleep(100);
 end;
end;



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.037 c
1-1117503703
Demonix
2005-05-31 05:41
2005.06.14
Как запретить менять размер формы?


1-1117437824
Rentgen
2005-05-30 11:23
2005.06.14
Как раскрыть весь TreeView?


1-1117200144
ctranik
2005-05-27 17:22
2005.06.14
Как просканировать весь реестр


1-1117132916
Nikitian
2005-05-26 22:41
2005.06.14
findcomponent - неясна работа


4-1114082421
Katy
2005-04-21 15:20
2005.06.14
Кодировка Windows





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский