unit Unit45;
interface
uses
Vcl.Forms, System.Types, System.Classes;
type
TScroll =
class(TThread)
private
{ Private-Deklarationen }
anzeigepos : TPoint;
function Zeit : Cardinal;
function berechnepos( anteil : extended ) : TPoint;
protected
procedure Execute;
override;
procedure Ausgeben;
public
meinupdateform : TForm;
startpos, zielpos : TPoint;
startzeit, scrollzeit : Cardinal;
end;
implementation
uses unit44;
procedure TScroll.Ausgeben;
begin
meinupdateform.Left := anzeigepos.x;
meinupdateform.top := anzeigepos.y;
end;
function TScroll.Zeit : Cardinal;
begin
Result := GetTickCount;
// du könntest hier auch einen anderen Zeitmesser einbauen...
end;
function TScroll.berechnepos( anteil : extended ) : TPoint;
begin
if anteil >= 1
then
begin
Result.X := zielpos.X;
Result.Y := zielpos.Y;
end
else
begin
Result.X := round(anteil*(zielpos.X - startpos.X)+startpos.X);
Result.Y := round(anteil*(zielpos.Y - startpos.Y)+startpos.Y);
end;
end;
procedure TScroll.Execute;
var lastanteil, anteil : extended;
lastp : TPoint;
begin
startzeit := Zeit;
meinupdateform.Left := startpos.X;
meinupdateform.Top := startpos.Y;
meinupdateform.Show;
lastanteil := -1;
repeat
anteil := ( GetTickCount - startzeit )/scrollzeit;
// läuft von 0..1
if anteil > lastanteil
then
begin
lastanteil := anteil;
anzeigepos := berechnepos( anteil );
Synchronize( Ausgeben );
end;
until ( anteil >= 1 )
or terminated;
end;
end.