Ich möchte eine wissenschaftliche Grafik kontinuierlich flüssig animieren und die restliche Benutzeroberfläche soll interaktiv bleiben und die Animation nicht hakeln lassen. Als Trivialversion habe ich daher erst einmal eine primitive "NewsTicker-Laufschrift" testen wollen, die echte Grafik sollte dann später leicht auszutauschen sein. Aber mir gelingt nicht einmal ansatzweise eine flüssige, pixelbasierte Animation. Wer hat Tipps, wie man da herangeht?
Ich dachte, dass ich das mit einem MultiMedia-Timer realisieren könnte.
Die Schrift springt aber um geschätzte 10 px je sichtbarer Änderung und jede Mausbewegung auf der Form lässt alles stehen. Liegt das daran, dass das ganze nicht threadsicher ist? Was mache ich so grundsätzlich falsch und wie kann man das Problem beheben? (D6 unter W7)
Code:
type
TNewsTicker = class(TObject)
private
mmResult : Integer;
Canvas : TCanvas;
X : Integer;
public
constructor Create(ACanvas: TCanvas);
destructor Destroy; override;
end;
implementation
procedure TimeCallBack(TimerID, Msg: Uint; dwUser, dw1, dw2: DWORD); pascal;
var ANewsTicker : TNewsTicker;
begin
ANewsTicker := TNewsTicker(dwUser);
ANewsTicker.Canvas.TextOut(ANewsTicker.X, 100, 'Test');
Inc(ANewsTicker.X);
end;
{ TNewsTicker }
constructor TNewsTicker.Create(ACanvas: TCanvas);
begin
inherited Create;
Canvas := ACanvas;
X := 0;
mmResult := TimeSetEvent(50, 10, @TimeCallBack, DWORD(Self), TIME_PERIODIC);
end;
destructor TNewsTicker.Destroy;
begin
TimeKillEvent(mmResult);
inherited Destroy;
end;
und aufgerufen einfach durch die Form der Anwendung:
Code:
procedure TFormMain.Button1Click(Sender: TObject);
begin
MainNewsTicker := TNewsTicker.Create(Canvas);
end;