Наши преимущества

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

Статус
Закрыто для дальнейших ответов.

Denov

Турист
Credits
0
Нужна помощь...
Как сделать окно где будет крутиться какаянить анимация при этом не обращая внимания на процесс.
типа

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

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

Мож кто знает способ попроще.
 
Знаю что есть Application.ProcessMessage но ставить его внутрь кода (... строки какого нить процесса) это мутарно.

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


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

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

да, только тут передается функция, подправить надо будет параметр. Спешил :)
В общем, разбирайся.
 
Делать в отдельном потоке показ красивых картинок. В осном потоке - работа. Никакой Application.ProcessMessage не поможет, скажем при выполнении запроса к базе.
 
присоединюсь к последнему...
Application.ProcessMessage будет вызывать перерисовку всего окна. что в ряде слуаев добавит изрядно тормозов. кстати и с анимацией шибко заморачиваться не стОит - "накладные расходы" на анимацию могут так же тормозов добавить.
а так - только отдельными потоками. причем в идеале - свой процесс длительный - одним потоком. анимацию - вторым... так и форма будет активна и вменяема (в плане отрисовки) и прочие плюшки (с прерыванием задачи и т.п.) реализуемы.
 
Я всегда прокручиваю гифки живущие в ресурсах. Просто и удобно.
 
Повторю еще раз - только отдельный поток, показывающий картину (картинки, анимацию и т.п.). Естественно этот отдельный поток должен быть без VCL. Картинки, скажем, состояния вращающего круга, 16 штук, например, можно поместить в ресурс.
 
Application.ProcessMessage - не проще... хотя бы потому, что задержки между дёрганием ProcessMessage будут различны.
 
Все верно говорят про поток анимацию в поток а действие в основной программе а если без потоков то все равно любая анимация колом встанет.
 
Статус
Закрыто для дальнейших ответов.
Верх