Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.09.22;
Скачать: CL | DM;

Вниз

Визуализация занятости приложения.   Найти похожие ветки 

 
lamer6666   (2013-01-02 20:21) [0]

Доброго времени суток уважаемые.
Подскажите, как реализовать визуализацию занятости приложения, т.е. пока например идет загрузка показать полупрозрачное окно (закрывающее основное окно программы) с крутящимся gif-ом "загрузка" ну или просто надпись, "ожидайте....".


 
Юрий Зотов ©   (2013-01-02 22:09) [1]

1. Загрузку данных выносим в отдельный поток (см. класс TThread)
2. Делаем новую форму. На нее кладем TLabel ("Ожидайте") и TAnimate.
3. Из основной формы показываем вторую (ShowModal)
4. В OnCreate второй формы запускаем поток загрузки данных.
5. Когда поток завершится, сработает обработчик OnTerminate (во второй форме). В нем пишем ModalResult := mrOK.


 
Юрий Зотов ©   (2013-01-02 22:12) [2]


> 4. В OnCreate второй формы...

Это если вторая форма создается динамически (что лучше). А если нет, то не в OnCreate, а в OnShow (что хуже).


 
lamer6666   (2013-01-02 22:48) [3]

Понял, разбираю.
Огромное спасибо.


 
lamer6666   (2013-01-07 02:49) [4]


> Это если вторая форма создается динамически (что лучше)


Реализовал так:

type
 TForm1 = class(TForm)
...
...
...
 procedure StartThreadOnShow(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

TLoad = class(TThread)
 private
   memorystream: TMemoryStream; //сюда гружу к примеру картинку
   procedure SetMemorystream;
 protected
   procedure Execute; override;
 end;

...
...
...

//Процедуры
procedure TLoad.Execute;
begin
 memorystream:=TMemoryStream.Create;
...
...
...
 Synchronize(SetMemorystream); //Отдаю в основной поток полученную картинку
 memorystream.Free;
end;

procedure TLoad.SetMemorystream;
var
 jpeg: TJPEGImage;
begin
 jpeg:=TJPEGImage.Create;
 memorystream.Position:=0;
 jpeg.LoadFromStream(memorystream);
 Form1.Image1.Picture.Graphic:=jpeg;
 jpeg.Free;
end;

procedure TForm1.StartThreadOnShow(Sender: TObject);//Процедура запуска потока захвата картинки
 var
 PT:TLoad;
begin
 PT:=TLoad.Create(True);
 PT.FreeOnTerminate:=True;
 PT.Priority:=tpLower;
 //PT.OnTerminate:=??? Тут не могу реализовать закрытие динамически созданной формы
 PT.Resume;
end;
//Процедуры

...
...
...

procedure TForm1.SpeedButton0Click(Sender: TObject);//Запускаю
 var
 LoadingForm:TForm;
begin

 LoadingForm:=TForm.Create(self);
 LoadingForm.BorderStyle:=bsNone;
 LoadingForm.WindowState:=wsMaximized;
 LoadingForm.OnShow:=StartThreadOnShow;//Стартую поток
 LoadingForm.ShowModal;
...


правильно ли реализовано? В реале у меня все работает.

Проблема: Не могу назначить процедуру событию OnTerminate созданного потока.
Прописать процедуру в Form1? Но тогда будет закрываться Form1 а не LoadingForm.


 
Юрий Зотов ©   (2013-01-07 11:03) [5]

1. LoadingForm сделать не локальной переменной, а полем формы TForm1.
2. Обработчик события OnTerminate потока прописать в Form1.
3. В нем пишем: LoadingForm.ModalResult := mrOK.


 
lamer6666   (2013-01-07 13:43) [6]

Огромное спасибо за подсказки! Теперь все работает на ура! )))


 
Юрий Зотов ©   (2013-01-07 14:02) [7]


> lamer6666   (07.01.13 13:43) [6]
> все работает на ура!

Значит, пришло время сменить ник.
:o)


 
lamer6666   (2013-01-07 16:01) [8]


> Значит, пришло время сменить ник.

Подумываю над этим ))), но до вас ПРОФФИ мне далековато еще!


 
sniknik ©   (2013-01-07 21:17) [9]

> Значит, пришло время сменить ник.
на lamer6667?
:)



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

Текущий архив: 2013.09.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.006 c
15-1365885002
Юрий
2013-04-14 00:30
2013.09.22
С днем рождения ! 14 апреля 2013 воскресенье


1-1314615724
denkop
2011-08-29 15:02
2013.09.22
Вопрос по отрисовке текста при TLabel.Enabled=false


15-1365671316
ПЛОВ
2013-04-11 13:08
2013.09.22
UDF на Delphi, FireBird и NULL


15-1366110720
Demo
2013-04-16 15:12
2013.09.22
События в FoxPro MSDOS


2-1357505005
Mixasnt
2013-01-07 00:43
2013.09.22
не могу обработать одномерный массив введённый в едит.