Сделать окно с анимацией при выполнении какого нить долгого процесса

Status
Not open for further replies.

Denov

Member
Joined
Jul 26, 2009
Messages
5
Reaction score
0
Age
41
Нужна помощь...
Как сделать окно где будет крутиться какаянить анимация при этом не обращая внимания на процесс.
типа

Code:
try
Process_frm.Show;
... строки какого нить процесса
finally
Process_frm.Close;
end;

Форма открывается но анимация не идет...
Знаю что есть Application.ProcessMessage но ставить его внутрь кода (... строки какого нить процесса) это мутарно.

Мож кто знает способ попроще.
 

commandos911

Member
Joined
May 29, 2009
Messages
5
Reaction score
0
Знаю что есть Application.ProcessMessage но ставить его внутрь кода (... строки какого нить процесса) это мутарно.

Мож кто знает способ попроще.


Не много не понимаю, чего сдесь муторно???
Это кажись самый простой вариант Application.ProcessMessage ставиш в коде перед выполнением особо длительного процеса, и все форма не висит и графика на форме крутится!
Еще вариант процес вынести в отдельный поток! Но по мне этот вариан сложнее!:D
 

vogel

Member
Joined
Nov 11, 2008
Messages
6
Reaction score
6
Age
35
Если тебе нужна просто анимированная картинка, то TGifImage тебя спасёт.
 

fr0zen

New member
Joined
Mar 5, 2009
Messages
3
Reaction score
0
Age
33
Моя процедура импорта большого количества файлов.

На форме, которая будет отображаться при длительном процессе:
TProccessProc = procedure of object;

procedure ShowProgress(ProccessProc: TProccessProc; AActName:
string; AStepCount: Integer = 0); overload;
begin
frmProjectExportProgress := TfrmProjectExportProgress.Create(Application);
try
frmProjectExportProgress.InitProgress(AActName,AStepCount);
frmProjectExportProgress.Show;
Application.ProcessMessages;
ProccessProc;
frmProjectExportProgress.Hide;
finally
frmProjectExportProgress.Free;
end;
end;

procedure doStepProccess(AObjName: string; isError: Boolean; var isBreak: Boolean);
var iTmp: Integer;
begin
with frmProjectExportProgress do begin
cxERowCurrentFile.Properties.value:=AObjName;
CurrStep:=CurrStep+1;
if isError then
begin
ErrorCount:=ErrorCount+1;
cxERowErrorCount.Properties.Value:=ErrorCount;
cxMemoLog.Lines.Add('Не удалось импортировать файл: '+AObjName);
//вывод какой-то статистики на форме при импорте
gProgress.Progress := iTmp;
isBreak := isCancel;
end;
Application.ProcessMessages;
end;

Из основной формы вызов:
ShowProgress(LoadFiles,'Импорт файлов',Length(fFileList))

function LoadFiles: Boolean;
begin
//импортируем как-то там
//останавливает импорт
FIsBreak:=false;
while (I<=Length(fFileList) - 1) AND not FIsBreak do
begin
//идет импорт каждого файла по отдельности
//и вызываем нашу формочку, говорим ей, чтобы обновилась
doStepProccess(fDirPath+fFileList.Name, not Res, FIsBreak);
end;
end;

да, только тут передается функция, подправить надо будет параметр. Спешил :)
В общем, разбирайся.
 

maxim220

Member
Joined
Jun 17, 2006
Messages
52
Reaction score
0
Location
Russia, SPb
Делать в отдельном потоке показ красивых картинок. В осном потоке - работа. Никакой Application.ProcessMessage не поможет, скажем при выполнении запроса к базе.
 

dalx

Member
Joined
Feb 17, 2010
Messages
6
Reaction score
0
присоединюсь к последнему...
Application.ProcessMessage будет вызывать перерисовку всего окна. что в ряде слуаев добавит изрядно тормозов. кстати и с анимацией шибко заморачиваться не стОит - "накладные расходы" на анимацию могут так же тормозов добавить.
а так - только отдельными потоками. причем в идеале - свой процесс длительный - одним потоком. анимацию - вторым... так и форма будет активна и вменяема (в плане отрисовки) и прочие плюшки (с прерыванием задачи и т.п.) реализуемы.
 

qvint

Member
Joined
Mar 30, 2011
Messages
27
Reaction score
4
Моя процедура импорта большого количества файлов.
В общем, разбирайся.

Лучше автору топика не разбираться в такой процедуре...:bac:
 

Zhrnya

Member
Joined
May 6, 2010
Messages
7
Reaction score
0
Я всегда прокручиваю гифки живущие в ресурсах. Просто и удобно.
 

leo_nt

Member
Joined
Nov 2, 2007
Messages
8
Reaction score
0
более разумно - отдельный поток...
 

maxim220

Member
Joined
Jun 17, 2006
Messages
52
Reaction score
0
Location
Russia, SPb
Повторю еще раз - только отдельный поток, показывающий картину (картинки, анимацию и т.п.). Естественно этот отдельный поток должен быть без VCL. Картинки, скажем, состояния вращающего круга, 16 штук, например, можно поместить в ресурс.
 

dalx

Member
Joined
Feb 17, 2010
Messages
6
Reaction score
0
Application.ProcessMessage - не проще... хотя бы потому, что задержки между дёрганием ProcessMessage будут различны.
 

Pasha123

New member
Joined
Apr 16, 2015
Messages
2
Reaction score
0
Все верно говорят про поток анимацию в поток а действие в основной программе а если без потоков то все равно любая анимация колом встанет.
 
Status
Not open for further replies.
Top