Дельфи Тоббер
-
27-10-2019 - |
Вопрос
Какое лучшее решение показать, что приложение что -то делает?
Я попытался показать индикатор прогресса, но он не сработал.
ОБНОВИТЬ: -------------
Бар прогресса работает нормально, но не то, что я хочу.
Я хочу показать пульсатор, Как и то, что используют веб -браузеры, поэтому, пока что -то обновляется, он продолжает поворачиваться.
Курсор также может быть в режиме Crhourglass.
Решение
Попробуй это:
AnimateUnit
unit AnimateUnit;
interface
uses
Windows, Classes;
type
TFrameProc = procedure(const theFrame: ShortInt) of object;
TFrameThread = class(TThread)
private
{ Private declarations }
FFrameProc: TFrameProc;
FFrameValue: ShortInt;
procedure SynchedFrame();
protected
{ Protected declarations }
procedure Frame(const theFrame: ShortInt); virtual;
public
{ Public declarations }
constructor Create(theFrameProc: TFrameProc; CreateSuspended: Boolean = False); reintroduce; virtual;
end;
TAnimateThread = class(TFrameThread)
private
{ Private declarations }
protected
{ Protected declarations }
procedure Execute(); override;
public
{ Public declarations }
end;
var
AnimateThread: TAnimateThread;
implementation
{ TFrameThread }
constructor TFrameThread.Create(theFrameProc: TFrameProc; CreateSuspended: Boolean = False);
begin
inherited Create(CreateSuspended);
FreeOnTerminate := True;
FFrameProc := theFrameProc;
end;
procedure TFrameThread.SynchedFrame();
begin
if Assigned(FFrameProc) then FFrameProc(FFrameValue);
end;
procedure TFrameThread.Frame(const theFrame: ShortInt);
begin
FFrameValue := theFrame;
try
Sleep(0);
finally
Synchronize(SynchedFrame);
end;
end;
{ TAnimateThread }
procedure TAnimateThread.Execute();
var
I: ShortInt;
begin
while (not Self.Terminated) do
begin
Frame(0);
for I := 1 to 8 do
begin
if (not Self.Terminated) then
begin
Sleep(120);
Frame(I);
end;
end;
Frame(0);
end;
end;
end.
Раздел 1
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ImgList;
type
TForm1 = class(TForm)
ImageList1: TImageList;
Image1: TImage;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure UpdateFrame(const theFrame: ShortInt);
end;
var
Form1: TForm1;
implementation
uses
AnimateUnit;
{$R *.DFM}
procedure TForm1.UpdateFrame(const theFrame: ShortInt);
begin
Image1.Picture.Bitmap.Handle := 0;
try
ImageList1.GetBitmap(theFrame, Image1.Picture.Bitmap);
finally
Image1.Update();
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
AnimateThread := TAnimateThread.Create(UpdateFrame);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
AnimateThread.Terminate();
end;
end.
Изображения
Другие советы
Вы, вероятно, выполняете свою трудоемкую задачу в основной теме.
Одним из вариантов является перемещение его в фоновый поток, который позволит обслуживать вашу очередь сообщения. Вам нужно, чтобы он был обслуживался, чтобы ваш планшник и любой пользовательский интерфейс работал.
Ответьте на обновленный вопрос:
- генерировать анимированный GIF, например здесь
- Добавьте библиотеку GIF в вашу среду (Jedi JVCl+JCL)
- Вставьте Timage и загрузите сгенерированный GIF
- Сделайте его видимым, если вам это нужно
Индикатор в порядке. Вы должны позвонить Application.ProcessMessages
После изменения.
«Какое лучшее решение показать, что это приложение что -то делает?» - Установить курсор мыши в Crhourglass? или создать другую форму/кадр/и т. Д., Какую внимание пользователь, который приложение «что -то делает», и ему нужно подождать.
Из вашей длительной задачи вы можете иногда обновлять визуальный индикатор, например, панель прогресса или что -либо еще. Тем не менее, вам нужно немедленно перерисовать изменения, позвонив Update
На управлении, который обеспечивает обратную связь.
Не используйте Application.ProcessMessages
Как это приведет к возможным вопросам повторной деятельности.