@SirRufo: Ich möchte nach Möglichkeit sofort die Änderungsinformation an eine weitere Klasse weiterreichen, deswegen wollte ich kein zusätzliches Feld deklarieren und die gesamte Abfrage innerhalb des OnChange bzw. OnClick durchführen.
Ja und?
Dann packe die
Logik doch einfach in diese Klasse oder schalte da einfach eine Klasse davor, die diese Logik innehat. Was man nicht macht, ist die Logik in der Form/View so an direkt mit den Controls zu verkoppeln, wie du das gemacht hast.
@Dejan Vu
Es ging mir nur um das
Prinzip, wie man das zusammenfassen kann.
Richtig, richtig, wird das z.B. mit einem
ViewModel, wo jeder Button seinen Status auslesen und setzen kann und zwar unabhängig voneinander. Das
ViewModel kümmert sich nun intern um die entsprechenden logischen Zusammenhänge und übergibt den resultierenden Wert an die Datenklasse oder wohin auch immer.
ViewModel:
Delphi-Quellcode:
type
TFooViewModel = class( TViewModelBase )
private
FStatus: Boolean;
FButton2Checked: Boolean;
FButton1Checked: Boolean;
procedure SetStatus( const Value: Boolean );
procedure SetButton1Checked( const Value: Boolean );
procedure SetButton2Checked( const Value: Boolean );
function GetButton1Checked: Boolean;
function GetButton2Checked: Boolean;
public
property Button1Checked: Boolean read GetButton1Checked write SetButton1Checked;
property Button2Checked: Boolean read GetButton2Checked write SetButton2Checked;
end;
implementation
{ TFooViewModel }
function TFooViewModel.GetButton1Checked: Boolean;
begin
Result := FStatus;
end;
function TFooViewModel.GetButton2Checked: Boolean;
begin
Result := not FStatus;
end;
procedure TFooViewModel.SetButton1Checked( const Value: Boolean );
begin
SetStatus( Value );
end;
procedure TFooViewModel.SetButton2Checked( const Value: Boolean );
begin
SetStatus( not Value );
end;
procedure TFooViewModel.SetStatus( const Value: Boolean );
begin
if FStatus <> Value
then
begin
FStatus := Value;
OnPropertyChanged( ['Button1Checked', 'Button2Checked'] );
end;
end;
View:
Delphi-Quellcode:
type
TFooViewForm = class( TBaseForm )
Switch1: TSwitch;
Switch2: TSwitch;
procedure Switch1Switch( Sender: TObject );
procedure Switch2Switch(Sender: TObject);
private
FViewModel: Ref<TFooViewModel>;
protected
procedure ViewModelPropertyChanged( Sender: TObject; const e: TPropertyChangedArgs ); override;
public
procedure SetViewModel( AViewModel: TViewModelBase ); override;
end;
var
FooViewForm: TFooViewForm;
implementation
{$R *.fmx}
{ TFooViewForm }
procedure TFooViewForm.SetViewModel( AViewModel: TViewModelBase );
begin
FViewModel := AViewModel as TFooViewModel;
inherited;
end;
procedure TFooViewForm.Switch1Switch( Sender: TObject );
begin
inherited;
if FViewModel.IsAssigned
then
FViewModel.Reference.Button1Checked := Switch1.IsChecked;
end;
procedure TFooViewForm.Switch2Switch(Sender: TObject);
begin
inherited;
if FViewModel.IsAssigned
then
FViewModel.Reference.Button2Checked := Switch2.IsChecked;
end;
procedure TFooViewForm.ViewModelPropertyChanged( Sender: TObject; const e: TPropertyChangedArgs );
begin
inherited;
if FViewModel.IsAssigned
then
begin
if e.Match( 'Button1Checked' )
then
Switch1.IsChecked := FViewModel.Reference.Button1Checked;
if e.Match( 'Button2Checked' )
then
Switch2.IsChecked := FViewModel.Reference.Button2Checked;
end;
end;