Created by
Stefan Glienke
last modified
| uses
Spring.Collections,
Spring.Reactive,
Spring.Reactive.Concurrency;
type
TNotifyEventArgs = record
Sender: TObject;
end;
TMouseEventArgs = record
Sender: TObject;
Button: TMouseButton;
Shift: TShiftState;
X, Y: Integer;
end;
TMouseMoveEventArgs = record
Sender: TObject;
Shift: TShiftState;
X, Y: Integer;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
mouseMoves: IObservable<TMouseMoveEventArgs>;
mouseDowns: IObservable<TMouseEventArgs>;
mouseUps: IObservable<TMouseEventArgs>;
mouseDrags: IObservable<TMouseMoveEventArgs>;
mouseDblClicks: IObservable<TNotifyEventArgs>;
begin
Canvas.Pen.Width := 5;
Canvas.Pen.Color := clBlue;
mouseMoves := TObservable.FromEventPattern<TMouseMoveEventArgs>(Self, 'OnMouseMove');
mouseDowns := TObservable.FromEventPattern<TMouseEventArgs>(Self, 'OnMouseDown');
mouseUps := TObservable.FromEventPattern<TMouseEventArgs>(Self, 'OnMouseUp');
mouseDblClicks := TObservable.FromEventPattern<TNotifyEventArgs>(Self, 'OnDblClick');
mouseDrags := mouseMoves._
.SkipUntil<TMouseMoveEventArgs,TMouseEventArgs>(mouseDowns)._
.TakeUntil<TMouseMoveEventArgs,TMouseEventArgs>(mouseUps)
.Repeated;
mouseDowns
.ObserveOn(TScheduler.MainThread)
.Subscribe(
procedure(const event: TMouseEventArgs)
begin
Canvas.MoveTo(event.X, event.Y);
end);
mouseDrags
.ObserveOn(TScheduler.MainThread)
.Subscribe(
procedure(const event: TMouseMoveEventArgs)
begin
Canvas.LineTo(event.X, event.Y);
end);
mouseDblClicks
.ObserveOn(TScheduler.MainThread)
.Subscribe(
procedure(const event: TNotifyEventArgs)
begin
Canvas.FillRect(ClientRect);
end);
end;
|