Skip to content

Commit

Permalink
Add priority to observers to better control execution order
Browse files Browse the repository at this point in the history
  • Loading branch information
UweRaabe committed Jun 16, 2022
1 parent 93518f4 commit 730c74e
Show file tree
Hide file tree
Showing 3 changed files with 164 additions and 67 deletions.
6 changes: 4 additions & 2 deletions Examples/Observers/Main.Form.pas
Expand Up @@ -36,7 +36,7 @@ implementation

uses
System.SysUtils,
Cmon.Logging, Cmon.Observers.Vcl,
Cmon.Logging, Cmon.Observers, Cmon.Observers.Vcl,
ObservableData;

var
Expand All @@ -54,13 +54,15 @@ constructor TDemoMainForm.Create(AOwner: TComponent);
Data := GlobalData;

{ link observers }
MyStringEdit.AddValidator(Data.IsMyStringValid);
MyStringEdit.AddObserver(procedure(AValue: string) begin Data.MyString := AValue end);
MyLinesMemo.AddObserver(procedure(AValue: TStrings) begin Data.MyLines := AValue end);
MySelectedComboBox.AddObserver(procedure(AValue: Integer) begin Data.MySelectedIndex := AValue end);
MySelectedComboBox.AddObserver(procedure(AValue: string) begin Data.MySelected := AValue end);
MyListItemListBox.AddObserver(procedure(AValue: Integer) begin Data.MyListItemIndex := AValue end);
MyListItemListBox.AddObserver(procedure(AValue: string) begin Data.MyListItem := AValue end);

{ link validator with priority }
MyStringEdit.AddValidator(Data.IsMyStringValid, TObserverPriority.VeryEarly);
end;

destructor TDemoMainForm.Destroy;
Expand Down
110 changes: 62 additions & 48 deletions source/Cmon.Observers.Vcl.pas
Expand Up @@ -10,37 +10,41 @@ interface
type
TCustomEditHelper = class helper for TCustomEdit
public
procedure AddObserver(AOnUpdate: TNotifyEvent; AOnModified: TNotifyEvent = nil); overload;
procedure AddObserver(AOnUpdateValue: TProc<string>); overload;
procedure AddValidator(AOnValidateValue: TPredicate<string>);
procedure AddObserver(AOnUpdate: TNotifyEvent; AOnModified: TNotifyEvent = nil; APriority: TObserverPriority =
TObserverPriority.Normal); overload;
procedure AddObserver(AOnUpdateValue: TProc<string>; APriority: TObserverPriority = TObserverPriority.Normal); overload;
procedure AddValidator(AOnValidateValue: TPredicate<string>; APriority: TObserverPriority = TObserverPriority.Normal);
end;

type
TCustomMemoHelper = class helper for TCustomMemo
public
procedure AddObserver(AOnUpdate: TNotifyEvent; AOnModified: TNotifyEvent = nil); overload;
procedure AddObserver(AOnUpdateValue: TProc<TStrings>); overload;
procedure AddValidator(AOnValidateValue: TPredicate<TStrings>);
procedure AddObserver(AOnUpdate: TNotifyEvent; AOnModified: TNotifyEvent = nil; APriority: TObserverPriority =
TObserverPriority.Normal); overload;
procedure AddObserver(AOnUpdateValue: TProc<TStrings>; APriority: TObserverPriority = TObserverPriority.Normal); overload;
procedure AddValidator(AOnValidateValue: TPredicate<TStrings>; APriority: TObserverPriority = TObserverPriority.Normal);
end;

type
TCustomComboBoxHelper = class helper for TCustomComboBox
public
procedure AddObserver(AOnUpdate: TNotifyEvent; AOnModified: TNotifyEvent = nil); overload;
procedure AddObserver(AOnUpdateValue: TProc<string>); overload;
procedure AddObserver(AOnUpdateValue: TProc<Integer>); overload;
procedure AddValidator(AOnValidateValue: TPredicate<string>); overload;
procedure AddValidator(AOnValidateValue: TPredicate<Integer>); overload;
procedure AddObserver(AOnUpdate: TNotifyEvent; AOnModified: TNotifyEvent = nil; APriority: TObserverPriority =
TObserverPriority.Normal); overload;
procedure AddObserver(AOnUpdateValue: TProc<string>; APriority: TObserverPriority = TObserverPriority.Normal); overload;
procedure AddObserver(AOnUpdateValue: TProc<Integer>; APriority: TObserverPriority = TObserverPriority.Normal); overload;
procedure AddValidator(AOnValidateValue: TPredicate<string>; APriority: TObserverPriority = TObserverPriority.Normal); overload;
procedure AddValidator(AOnValidateValue: TPredicate<Integer>; APriority: TObserverPriority = TObserverPriority.Normal); overload;
end;

type
TCustomListBoxHelper = class helper for TCustomListBox
public
procedure AddObserver(AOnUpdate: TNotifyEvent; AOnModified: TNotifyEvent = nil); overload;
procedure AddObserver(AOnUpdateValue: TProc<string>); overload;
procedure AddObserver(AOnUpdateValue: TProc<Integer>); overload;
procedure AddValidator(AOnValidateValue: TPredicate<string>); overload;
procedure AddValidator(AOnValidateValue: TPredicate<Integer>); overload;
procedure AddObserver(AOnUpdate: TNotifyEvent; AOnModified: TNotifyEvent = nil; APriority: TObserverPriority =
TObserverPriority.Normal); overload;
procedure AddObserver(AOnUpdateValue: TProc<string>; APriority: TObserverPriority = TObserverPriority.Normal); overload;
procedure AddObserver(AOnUpdateValue: TProc<Integer>; APriority: TObserverPriority = TObserverPriority.Normal); overload;
procedure AddValidator(AOnValidateValue: TPredicate<string>; APriority: TObserverPriority = TObserverPriority.Normal); overload;
procedure AddValidator(AOnValidateValue: TPredicate<Integer>; APriority: TObserverPriority = TObserverPriority.Normal); overload;
end;

implementation
Expand Down Expand Up @@ -132,90 +136,100 @@ procedure TCustomEditObserver.ValueUpdate;
Target.ReSelectAll;
end;

procedure TCustomEditHelper.AddObserver(AOnUpdate: TNotifyEvent; AOnModified: TNotifyEvent = nil);
procedure TCustomEditHelper.AddObserver(AOnUpdate, AOnModified: TNotifyEvent; APriority: TObserverPriority);
begin
Observers.AddObserver(TObserverMapping.ControlValueID, TCustomEditObserver.Create(Self, AOnUpdate, AOnModified));
Observers.AddObserver(TObserverMapping.ControlValueID, TCustomEditObserver.Create(Self, AOnUpdate, AOnModified, APriority));
Observers.SortObservers(TObserverMapping.ControlValueID);
end;

procedure TCustomEditHelper.AddObserver(AOnUpdateValue: TProc<string>);
procedure TCustomEditHelper.AddObserver(AOnUpdateValue: TProc<string>; APriority: TObserverPriority);
begin
Observers.AddObserver(TObserverMapping.ControlValueID, TCustomEditObserver.Create(Self, AOnUpdateValue));
Observers.AddObserver(TObserverMapping.ControlValueID, TCustomEditObserver.Create(Self, AOnUpdateValue, APriority));
Observers.SortObservers(TObserverMapping.ControlValueID);
end;

procedure TCustomEditHelper.AddValidator(AOnValidateValue: TPredicate<string>);
procedure TCustomEditHelper.AddValidator(AOnValidateValue: TPredicate<string>; APriority: TObserverPriority);
begin
if not Assigned(AOnValidateValue) then Exit;
AddObserver(TValidator.Create<string>(AOnValidateValue));
AddObserver(TValidator.Create<string>(AOnValidateValue), APriority);
end;

procedure TCustomComboBoxHelper.AddObserver(AOnUpdate, AOnModified: TNotifyEvent);
procedure TCustomComboBoxHelper.AddObserver(AOnUpdate, AOnModified: TNotifyEvent; APriority: TObserverPriority);
begin
Observers.AddObserver(TObserverMapping.ControlValueID, TCustomComboBoxObserver.Create(Self, AOnUpdate, AOnModified));
Observers.AddObserver(TObserverMapping.ControlValueID, TCustomComboBoxObserver.Create(Self, AOnUpdate, AOnModified, APriority));
Observers.SortObservers(TObserverMapping.ControlValueID);
end;

procedure TCustomComboBoxHelper.AddObserver(AOnUpdateValue: TProc<string>);
procedure TCustomComboBoxHelper.AddObserver(AOnUpdateValue: TProc<string>; APriority: TObserverPriority);
begin
Observers.AddObserver(TObserverMapping.ControlValueID, TCustomComboBoxObserver.Create(Self, AOnUpdateValue));
Observers.AddObserver(TObserverMapping.ControlValueID, TCustomComboBoxObserver.Create(Self, AOnUpdateValue, APriority));
Observers.SortObservers(TObserverMapping.ControlValueID);
end;

procedure TCustomComboBoxHelper.AddObserver(AOnUpdateValue: TProc<Integer>);
procedure TCustomComboBoxHelper.AddObserver(AOnUpdateValue: TProc<Integer>; APriority: TObserverPriority);
begin
Observers.AddObserver(TObserverMapping.ControlValueID, TCustomComboBoxIndexObserver.Create(Self, AOnUpdateValue));
Observers.AddObserver(TObserverMapping.ControlValueID, TCustomComboBoxIndexObserver.Create(Self, AOnUpdateValue, APriority));
Observers.SortObservers(TObserverMapping.ControlValueID);
end;

procedure TCustomComboBoxHelper.AddValidator(AOnValidateValue: TPredicate<Integer>);
procedure TCustomComboBoxHelper.AddValidator(AOnValidateValue: TPredicate<Integer>; APriority: TObserverPriority);
begin
if not Assigned(AOnValidateValue) then Exit;
AddObserver(TValidator.Create<Integer>(AOnValidateValue));
AddObserver(TValidator.Create<Integer>(AOnValidateValue), APriority);
end;

procedure TCustomComboBoxHelper.AddValidator(AOnValidateValue: TPredicate<string>);
procedure TCustomComboBoxHelper.AddValidator(AOnValidateValue: TPredicate<string>; APriority: TObserverPriority);
begin
if not Assigned(AOnValidateValue) then Exit;
AddObserver(TValidator.Create<string>(AOnValidateValue));
AddObserver(TValidator.Create<string>(AOnValidateValue), APriority);
end;

procedure TCustomListBoxHelper.AddObserver(AOnUpdate, AOnModified: TNotifyEvent);
procedure TCustomListBoxHelper.AddObserver(AOnUpdate, AOnModified: TNotifyEvent; APriority: TObserverPriority);
begin
Observers.AddObserver(TObserverMapping.ControlValueID, TCustomListBoxObserver.Create(Self, AOnUpdate, AOnModified));
Observers.AddObserver(TObserverMapping.ControlValueID, TCustomListBoxObserver.Create(Self, AOnUpdate, AOnModified, APriority));
Observers.SortObservers(TObserverMapping.ControlValueID);
end;

procedure TCustomListBoxHelper.AddObserver(AOnUpdateValue: TProc<string>);
procedure TCustomListBoxHelper.AddObserver(AOnUpdateValue: TProc<string>; APriority: TObserverPriority);
begin
Observers.AddObserver(TObserverMapping.ControlValueID, TCustomListBoxObserver.Create(Self, AOnUpdateValue));
Observers.AddObserver(TObserverMapping.ControlValueID, TCustomListBoxObserver.Create(Self, AOnUpdateValue, APriority));
Observers.SortObservers(TObserverMapping.ControlValueID);
end;

procedure TCustomListBoxHelper.AddObserver(AOnUpdateValue: TProc<Integer>);
procedure TCustomListBoxHelper.AddObserver(AOnUpdateValue: TProc<Integer>; APriority: TObserverPriority);
begin
Observers.AddObserver(TObserverMapping.ControlValueID, TCustomListBoxIndexObserver.Create(Self, AOnUpdateValue));
Observers.AddObserver(TObserverMapping.ControlValueID, TCustomListBoxIndexObserver.Create(Self, AOnUpdateValue, APriority));
Observers.SortObservers(TObserverMapping.ControlValueID);
end;

procedure TCustomListBoxHelper.AddValidator(AOnValidateValue: TPredicate<Integer>);
procedure TCustomListBoxHelper.AddValidator(AOnValidateValue: TPredicate<Integer>; APriority: TObserverPriority);
begin
if not Assigned(AOnValidateValue) then Exit;
AddObserver(TValidator.Create<Integer>(AOnValidateValue));
AddObserver(TValidator.Create<Integer>(AOnValidateValue), APriority);
end;

procedure TCustomListBoxHelper.AddValidator(AOnValidateValue: TPredicate<string>);
procedure TCustomListBoxHelper.AddValidator(AOnValidateValue: TPredicate<string>; APriority: TObserverPriority);
begin
if not Assigned(AOnValidateValue) then Exit;
AddObserver(TValidator.Create<string>(AOnValidateValue));
AddObserver(TValidator.Create<string>(AOnValidateValue), APriority);
end;

procedure TCustomMemoHelper.AddObserver(AOnUpdateValue: TProc<TStrings>);
procedure TCustomMemoHelper.AddObserver(AOnUpdateValue: TProc<TStrings>; APriority: TObserverPriority);
begin
Observers.AddObserver(TObserverMapping.ControlValueID, TCustomMemoObserver.Create(Self, AOnUpdateValue));
Observers.AddObserver(TObserverMapping.ControlValueID, TCustomMemoObserver.Create(Self, AOnUpdateValue, APriority));
Observers.SortObservers(TObserverMapping.ControlValueID);
end;

procedure TCustomMemoHelper.AddValidator(AOnValidateValue: TPredicate<TStrings>);
procedure TCustomMemoHelper.AddValidator(AOnValidateValue: TPredicate<TStrings>; APriority: TObserverPriority);
begin
if not Assigned(AOnValidateValue) then Exit;
AddObserver(TValidator.Create<TStrings>(AOnValidateValue));
AddObserver(TValidator.Create<TStrings>(AOnValidateValue), APriority);
end;

procedure TCustomMemoHelper.AddObserver(AOnUpdate: TNotifyEvent; AOnModified: TNotifyEvent = nil);
procedure TCustomMemoHelper.AddObserver(AOnUpdate, AOnModified: TNotifyEvent; APriority: TObserverPriority);
begin
Observers.AddObserver(TObserverMapping.ControlValueID, TCustomMemoObserver.Create(Self, AOnUpdate, AOnModified));
Observers.AddObserver(TObserverMapping.ControlValueID, TCustomMemoObserver.Create(Self, AOnUpdate, AOnModified, APriority));
Observers.SortObservers(TObserverMapping.ControlValueID);
end;

function TCustomMemoObserver.GetTrack: Boolean;
Expand Down

0 comments on commit 730c74e

Please sign in to comment.