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

Status
Not open for further replies.

Denov

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

Code:
try
Process_frm.Show;
... строки какого нить процесса
finally
Process_frm.Close;
end;
Форма открывается но анимация не идет...
Знаю что есть Application.ProcessMessage но ставить его внутрь кода (... строки какого нить процесса) это мутарно.

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

commandos911

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

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

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

Fr0zen

Турист
Моя процедура импорта большого количества файлов.

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

Турист
Делать в отдельном потоке показ красивых картинок. В осном потоке - работа. Никакой Application.ProcessMessage не поможет, скажем при выполнении запроса к базе.
 

dalx

Турист
присоединюсь к последнему...
Application.ProcessMessage будет вызывать перерисовку всего окна. что в ряде слуаев добавит изрядно тормозов. кстати и с анимацией шибко заморачиваться не стОит - "накладные расходы" на анимацию могут так же тормозов добавить.
а так - только отдельными потоками. причем в идеале - свой процесс длительный - одним потоком. анимацию - вторым... так и форма будет активна и вменяема (в плане отрисовки) и прочие плюшки (с прерыванием задачи и т.п.) реализуемы.
 

qvint

Турист
Моя процедура импорта большого количества файлов.
В общем, разбирайся.
Лучше автору топика не разбираться в такой процедуре...:bac:
 

Zhrnya

Турист
Я всегда прокручиваю гифки живущие в ресурсах. Просто и удобно.
 

maxim220

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

dalx

Турист
Application.ProcessMessage - не проще... хотя бы потому, что задержки между дёрганием ProcessMessage будут различны.
 

Pasha123

Турист
Все верно говорят про поток анимацию в поток а действие в основной программе а если без потоков то все равно любая анимация колом встанет.
 
Status
Not open for further replies.
Top