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

Статус
В этой теме нельзя размещать новые ответы.

Denov

Турист
Регистрация
26 Июл 2009
Сообщения
5
Реакции
0
Credits
4
Нужна помощь...
Как сделать окно где будет крутиться какаянить анимация при этом не обращая внимания на процесс.
типа

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

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

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

commandos911

Турист
Регистрация
29 Май 2009
Сообщения
5
Реакции
0
Credits
8
Знаю что есть Application.ProcessMessage но ставить его внутрь кода (... строки какого нить процесса) это мутарно.

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


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

maikeru

Местный
Регистрация
9 Мар 2012
Сообщения
10
Реакции
6
Credits
30
лучit все отправлять в потоки
 

Fr0zen

Турист
Регистрация
5 Мар 2009
Сообщения
3
Реакции
0
Credits
6
Моя процедура импорта большого количества файлов.

На форме, которая будет отображаться при длительном процессе:
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

Турист
Регистрация
18 Июн 2006
Сообщения
52
Реакции
0
Credits
78
Делать в отдельном потоке показ красивых картинок. В осном потоке - работа. Никакой Application.ProcessMessage не поможет, скажем при выполнении запроса к базе.
 

dalx

Местный
Регистрация
17 Фев 2010
Сообщения
6
Реакции
0
Credits
25
присоединюсь к последнему...
Application.ProcessMessage будет вызывать перерисовку всего окна. что в ряде слуаев добавит изрядно тормозов. кстати и с анимацией шибко заморачиваться не стОит - "накладные расходы" на анимацию могут так же тормозов добавить.
а так - только отдельными потоками. причем в идеале - свой процесс длительный - одним потоком. анимацию - вторым... так и форма будет активна и вменяема (в плане отрисовки) и прочие плюшки (с прерыванием задачи и т.п.) реализуемы.
 

Zhrnya

Турист
Регистрация
6 Май 2010
Сообщения
7
Реакции
0
Credits
12
Я всегда прокручиваю гифки живущие в ресурсах. Просто и удобно.
 

leo_nt

Турист
Регистрация
2 Ноя 2007
Сообщения
8
Реакции
0
Credits
18
более разумно - отдельный поток...
 

maxim220

Турист
Регистрация
18 Июн 2006
Сообщения
52
Реакции
0
Credits
78
Повторю еще раз - только отдельный поток, показывающий картину (картинки, анимацию и т.п.). Естественно этот отдельный поток должен быть без VCL. Картинки, скажем, состояния вращающего круга, 16 штук, например, можно поместить в ресурс.
 

carmen987

Турист
Регистрация
22 Окт 2010
Сообщения
2
Реакции
0
Credits
10
Проще использовать Application.ProcessMessage
 

dalx

Местный
Регистрация
17 Фев 2010
Сообщения
6
Реакции
0
Credits
25
Application.ProcessMessage - не проще... хотя бы потому, что задержки между дёрганием ProcessMessage будут различны.
 

Pasha123

Турист
Регистрация
16 Апр 2015
Сообщения
2
Реакции
0
Credits
4
Все верно говорят про поток анимацию в поток а действие в основной программе а если без потоков то все равно любая анимация колом встанет.
 
Статус
В этой теме нельзя размещать новые ответы.