Форум: "Начинающим";
Текущий архив: 2013.09.22;
Скачать: [xml.tar.bz2];
ВнизВизуализация занятости приложения. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.002 c