Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: verschränke ToggleBoxes

  Alt 18. Jan 2015, 10:17
@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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat