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

  • Автор темы Denov
  • Обновлено
  • 05, Aug 2009
  • #1
Нужна помощь...

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

типа

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


Форма открывается но анимация не идет...

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

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

Denov


Рег
26 Jul, 2009

Тем
76

Постов
195

Баллов
595
  • 11, Aug 2009
  • #2
Denov, post: 706824:
Знаю что есть Application.ProcessMessage но ставить его внутрь кода (... строки какого нить процесса) это мутарно.

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

Gnomikk93


Рег
29 May, 2009

Тем
75

Постов
201

Баллов
616
  • 27, Jan 2011
  • #3
поток более правильное решение, application.processmessage более просто. на форму кинуть Tanimate куда закинуть ролик для анимации.
 

Timedrops


Рег
06 Feb, 2009

Тем
63

Постов
205

Баллов
530
  • 07, Mar 2012
  • #4
вариант с поток хорош при обращениях при обращениях к базе данных, в остальных случаях (когда в цикле обрабатывается большой массив данных) в тело цикла вставляется Application.ProcessMessage и ваша анимация будет проигрываться.
 

Kapguokog


Рег
04 Jun, 2008

Тем
80

Постов
190

Баллов
610
  • 04, Apr 2012
  • #5
Если тебе нужна просто анимированная картинка, то TGifImage

тебя спасёт.
 

Vogel


Рег
11 Nov, 2008

Тем
66

Постов
196

Баллов
546
  • 20, Apr 2012
  • #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;

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



В общем, разбирайся.
 

Fr0zen


Рег
05 Mar, 2009

Тем
79

Постов
184

Баллов
579
  • 24, Oct 2012
  • #7
Делать в отдельном потоке показ красивых картинок. В осном потоке - работа. Никакой Application.ProcessMessage не поможет, скажем при выполнении запроса к базе.
 

Maxim220


Рег
17 Jun, 2006

Тем
75

Постов
229

Баллов
614
  • 24, Jan 2013
  • #8
присоединюсь к последнему.

Application.ProcessMessage будет вызывать перерисовку всего окна.

что в ряде слуаев добавит изрядно тормозов.

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

причем в идеале - свой процесс длительный - одним потоком.

анимацию - вторым.

так и форма будет активна и вменяема (в плане отрисовки) и прочие плюшки (с прерыванием задачи и т.п.) реализуемы.
 

Dalx


Рег
17 Feb, 2010

Тем
74

Постов
200

Баллов
580
  • 24, Jan 2013
  • #9
Fr0zen, post: 706831:Моя процедура импорта большого количества файлов.
В общем, разбирайся.
Лучше автору топика не разбираться в такой процедуре...ac:
 

Qvint


Рег
30 Mar, 2011

Тем
58

Постов
199

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

Maxim220


Рег
17 Jun, 2006

Тем
75

Постов
229

Баллов
614
  • 10, Apr 2015
  • #11
Application.ProcessMessage - не проще... хотя бы потому, что задержки между дёрганием ProcessMessage будут различны.
 

Dalx


Рег
17 Feb, 2010

Тем
74

Постов
200

Баллов
580
  • 16, Apr 2015
  • #12
Все верно говорят про поток анимацию в поток а действие в основной программе а если без потоков то все равно любая анимация колом встанет.
 

Ephesmews


Рег
16 Apr, 2015

Тем
62

Постов
176

Баллов
526
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно