![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Визуализация занятости приложения. [D7, XP]
lamer6666 © (2013-01-02 20:21:00)Доброго времени суток уважаемые.
Подскажите, как реализовать визуализацию занятости приложения, т.е. пока например идет загрузка показать полупрозрачное окно (закрывающее основное окно программы) с крутящимся gif-ом "загрузка" ну или просто надпись, "ожидайте....".
sniknik (2013-01-07 21:17:00) [1]> Значит, пришло время сменить ник.
на lamer666 7?
:)
lamer6666 (2013-01-07 16:01:00) [2]
> Значит, пришло время сменить ник.
Подумываю над этим ))), но до вас ПРОФФИ мне далековато еще!
Юрий Зотов (2013-01-07 14:02:00) [3]
> lamer6666 (07.01.13 13:43) [6]
> все работает на ура!
Значит, пришло время сменить ник.
:o)
lamer6666 (2013-01-07 13:43:00) [4]Огромное спасибо за подсказки! Теперь все работает на ура! )))
Юрий Зотов (2013-01-07 11:03:00) [5]1. LoadingForm сделать не локальной переменной, а полем формы TForm1.
2. Обработчик события OnTerminate потока прописать в Form1.
3. В нем пишем: LoadingForm.ModalResult := mrOK.
lamer6666 (2013-01-07 02:49:00) [6]
> Это если вторая форма создается динамически (что лучше)
Реализовал так:
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.
lamer6666 (2013-01-02 22:48:00) [7]Понял, разбираю.
Огромное спасибо.
Юрий Зотов (2013-01-02 22:12:00) [8]
> 4. В OnCreate второй формы...
Это если вторая форма создается динамически (что лучше). А если нет, то не в OnCreate, а в OnShow (что хуже).
Юрий Зотов (2013-01-02 22:09:00) [9]1. Загрузку данных выносим в отдельный поток (см. класс TThread)
2. Делаем новую форму. На нее кладем TLabel ("Ожидайте") и TAnimate.
3. Из основной формы показываем вторую (ShowModal)
4. В OnCreate второй формы запускаем поток загрузки данных.
5. Когда поток завершится, сработает обработчик OnTerminate (во второй форме). В нем пишем ModalResult := mrOK.