Animacja progressbar-a w xe2

0

Witam,
korzystam z progress-barów w delphi xe2. Niestety nie pasuje mi ich animacja (w dephi 7 tego nie było - po ustawieniu progresa od razu pokazywał żądaną wartość). Niestety w xe2 progressbar jest animowany i 'dochodzi' do żądanej wartości powoli:
Przykład:

 
procedure TForm1.Button1Click(Sender: TObject);
begin
  ProgressBar1.Position:= Progressbar1.Max;
  Application.ProcessMessages;
  ShowMessage('w tym momencie prgsbar wcale nie ma maxa!');
end;

Najgorzej jest, gdy zamiast showmessage z powyższego przykładu np. zamykam okno. W rezultacie progres nie zdążył
dojść nawet do połowy!!! mimo że jego pozycja była ustawiona na maxa. Nie pomogło oczywiście nawet application.processmessages (to mnie akurat wcale nie dziwi w tej sytuacji).

Moje pytanie:
czy jest jakaś właściwość bądź zdarzenie, które mi w tym pomogą (poczekam na zdarzenie aż prgsbar 'dojdzie' i dopiero wyświetle komunikat lub zamknę okno ???).
Proszę nie pisać coś w stylu pętli czasowej + application.processmessages -> to jest lamerskie rozwiązanie, które
znam od wieków i nijak się ono ma do programowania obiektowego. Interesuje mnie tylko obiektowe rozwiązanie tego trywialnego problemu.
Dzięki z góry.

0

Dobra, sam se odpowiem :p (może komuś na przyszłość się przyda).
Niestety jest to 'dirty programming', ale zgodne z podejściem obiektowym.
Wyłączam animację używając triku (class helper dla TProgressBar) - w ten sposób nadpisuje
właściwość w oryginalnym TProgressBar. Ma to zalety w postaci używania oryginalnego
komponentu i właściwości o tej samej nazwie czyli position.

 

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls;

type
  test = class helper for TProgressBar
  private
    function getpos: integer;
    procedure setpos(value: integer);
  public
    property position: integer read getpos write setpos;
  end;

  TForm1 = class(TForm)
    ProgressBar1: TProgressBar;
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ test }

function test.getpos: integer;
begin
  Result:= inherited Position;
end;

procedure test.setpos(value: integer);
begin
  inherited position:= value+1;
  StepBy(-1);
  StepBy(0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  progressbar1.position:= 50;
  Edit1.Text:= IntToStr(progressbar1.position);
end;

end.
0

że, tak się dokleje do tematu. Czy istnieje możliwość, użycia komponentów FMX w aplikacji VCL?

1 użytkowników online, w tym zalogowanych: 0, gości: 1