Ich sehe gerade, das im Code die Methode 'SetStatus' als 'Setter' bezeichnet wird, was er ja gar nicht ist, denn wo keine Property, da auch kein Setter. Insofern führt das dann auch mal zu Misverständnissen. Richtig(er) sollte es also sein, eine private Property 'Status' einzuführen. Denn sonst sieht man ja nicht, das 'FStatus' und 'SetStatus' etwas miteinander zu zun haben.
Delphi-Quellcode:
Type
TFoo = class
property Status : boolean Read FStatus Write SetStatus;
end;
Ah sehr schön, dass du meinen Text aufmerksam durchgelesen hast:
Erstelle dir eine Eigenschaft vom Typ Boolean
mit einer Setter-Methode:
Soll ich es größer und bunter gestalten? Soll ich explizit noch dazu schreiben
Zitat:
Ich gehe mal davon aus, dass jeder weiß was eine Eigenschaft ist und wie man die erstellt, so dass diese eine Setter-Methode hat. Darum zeige ich hier jetzt nur die Setter-Methode. Die
IDE erstellt zu einer Eigenschaft auch automatisch ein Feld, das gleichlautend wie die Eigenschaft ist, mit einem vorangestellten F.
Also eine Eigenschaft
property Status : Boolean;
bekommt durch die Code-Vervollständigung automatisch ein privates Feld
FStatus: Boolean;
und eine private Setter-Methode
procedure SetStatus( const Value : Boolean );
Sollte ich vorsichtshalber auch noch vermerken "Einatmen - Ausatmen! Und hübsch in dieser Reihenfolge und kontinuierlich!"
Jetzt mal wieder an die normaldenkende Allgemeinheit (jeder der sich dazu zählt, darf sich angesprochen fühlen)
Um aus diesen Toggle-buttons jetzt einen TriState zu machen, ändert man einfach das
ViewModel ab (macht natürlich nur Sinn, wenn diese Information im Daten-Modell auch verwertet werden kann, logisch - aber genau das sind ja die Änderungen, die immer wieder auf einen zukommen) und schwups, ohne eine Änderung an der View, passiert alles wie gewünscht:
Delphi-Quellcode:
type
TStatus = ( None, Prev, Next );
TFooViewModel = class( TViewModelBase )
private
FStatus: TStatus;
FButton2Checked: Boolean;
FButton1Checked: Boolean;
procedure SetStatus( const Value: TStatus );
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 = TStatus.Prev;
end;
function TFooViewModel.GetButton2Checked: Boolean;
begin
Result := FStatus = TStatus.Next;
end;
procedure TFooViewModel.SetButton1Checked( const Value: Boolean );
begin
if GetButton1Checked <> Value
then
if Value
then
SetStatus( TStatus.Prev )
else
SetStatus( TStatus.None );
end;
procedure TFooViewModel.SetButton2Checked( const Value: Boolean );
begin
if GetButton2Checked <> Value
then
if Value
then
SetStatus( TStatus.Next )
else
SetStatus( TStatus.None );
end;
procedure TFooViewModel.SetStatus( const Value: TStatus );
begin
if FStatus <> Value
then
begin
FStatus := Value;
OnPropertyChanged( ['Button1Checked', 'Button2Checked'] );
end;
end;