Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi XE5: Probleme mit LiveBindings "CheckedState(Self)" (https://www.delphipraxis.net/178506-xe5-probleme-mit-livebindings-checkedstate-self.html)

Kralle 11. Jan 2014 16:47

Delphi-Version: XE5

XE5: Probleme mit LiveBindings "CheckedState(Self)"
 
Hallo,

da bin ich wieder.

Ich habe jetzt das erstemal mit den LiveBindings gearbeitet bzw. es versucht.

Ich habe eine Checkbox und mehrere TEdits auf einem Form platziert.
Mittels Livebindings habe ich die Eigenschaft "CheckedState(Self)" der Checkbox mit den Eigenchaften "Enabled" der TEdits verbunden.
Wenn ich die Anwendung starte, dann ist die Checkbox NOT Enabled und alle TEdits sind Enabled.
Erst wenn ich die Checkbox zweimal betätige (Check / not Check) übernehmen die TEdits den Status.

Was mache ich falsch?

Nachtrag: Ich habe jetzt alle Bindungen gelöscht und neu hergestellt und jetzt ist der Effekt dieser:
Egal ob im Objektinspektor "Checked" gesetzt ist oder nicht, in der EXE ist die Checkbox "Checked".

Muß ich jetzt doch noch im OnCreate den Default-Wert setzte? Hatte gehofft, das dieses Visual nicht mehr nötig wäre.


Gruß Heiko

Sir Rufo 11. Jan 2014 18:10

AW: XE5: Probleme mit LiveBindings "CheckedState(Self)"
 
Zitat:

Zitat von Kralle (Beitrag 1243184)
Was mache ich falsch?

Du benutzt Livebindings :mrgreen:

Dafür nehme ich MVVM, das kann ich immer so hinbiegen wie ich möchte und bin nicht darauf angewiesen, ob Komponente X und Eigenschaft Y auch für Livebindings vorgesehen vorbereitet ist.
Delphi-Quellcode:
unit ViewFormMain;

interface

  uses
    Windows,
    Messages,
    SysUtils,
    Variants,
    Classes,
    Graphics,
    Controls,
    Forms,
    Dialogs,
    StdCtrls;

  type
    TViewModel = class
    private
      FValue   : Boolean;
      FOnUpdate : TNotifyEvent;
      procedure SetValue( const Value : Boolean );
    protected
      procedure DoUpdate;
    public
      property OnUpdate : TNotifyEvent read FOnUpdate write FOnUpdate;
      property Value   : Boolean read FValue write SetValue;
    end;

    TMainFormView = class( TForm )
      Edit1 : TEdit;        // OI: OnChange => ControlChange
      Edit2 : TEdit;        // OI: OnChange => ControlChange
      Edit3 : TEdit;        // OI: OnChange => ControlChange
      CheckBox1 : TCheckBox; // OI: OnClick => ControlChange
      procedure ControlChange( Sender : TObject );
      procedure FormShow( Sender : TObject );
    private
      FModelLoading : Boolean;
      FViewModel   : TViewModel;
    protected
      procedure DoLoadFromModel; virtual;
      procedure DoSaveToModel; virtual;
      procedure ViewModelUpdate( Sender : TObject );
    protected
      procedure LoadFromModel;
      procedure SaveToModel;
      procedure SyncWithModel;
    public
      procedure AfterConstruction; override;
      procedure BeforeDestruction; override;
      property ViewModel : TViewModel read FViewModel;
    end;

  var
    MainFormView : TMainFormView;

implementation

{$R *.dfm}
  { TForm1 }

  procedure TMainFormView.AfterConstruction;
    begin
      inherited;
      FViewModel         := TViewModel.Create;
      FViewModel.OnUpdate := ViewModelUpdate;
    end;

  procedure TMainFormView.BeforeDestruction;
    begin
      inherited;
      FViewModel.Free;
    end;

  procedure TMainFormView.ControlChange( Sender : TObject );
    begin
      SyncWithModel;
    end;

  procedure TMainFormView.DoLoadFromModel;
    begin
      // Binding Model => View
      CheckBox1.Checked := ViewModel.Value;
      Edit1.Enabled    := not ViewModel.Value;
      Edit2.Enabled    := not ViewModel.Value;
      Edit3.Enabled    := not ViewModel.Value;
    end;

  procedure TMainFormView.DoSaveToModel;
    begin
      // Binding View => Model
      ViewModel.Value := CheckBox1.Checked;
    end;

  procedure TMainFormView.FormShow( Sender : TObject );
    begin
      LoadFromModel;
    end;

  procedure TMainFormView.LoadFromModel;
    begin
      if FModelLoading
      then
        Exit;

      FModelLoading := True;
      try
        DoLoadFromModel;
      finally
        FModelLoading := False;
      end;
    end;

  procedure TMainFormView.SaveToModel;
    begin
      if FModelLoading
      then
        Exit;

      DoSaveToModel;
    end;

  procedure TMainFormView.SyncWithModel;
    begin
      SaveToModel;
      LoadFromModel;
    end;

  procedure TMainFormView.ViewModelUpdate( Sender : TObject );
    begin
      LoadFromModel;
    end;

  { TViewModel }

  procedure TViewModel.DoUpdate;
    begin
      if Assigned( OnUpdate )
      then
        OnUpdate( Self );
    end;

  procedure TViewModel.SetValue( const Value : Boolean );
    begin
      if Value = FValue
      then
        Exit;

      FValue := Value;
      DoUpdate;
    end;

end.

Kralle 11. Jan 2014 18:31

AW: XE5: Probleme mit LiveBindings "CheckedState(Self)"
 
N'abend,

Zitat:

Zitat von Sir Rufo (Beitrag 1243195)
Du benutzt Livebindings :mrgreen:

Aber, ist da nicht gerade auch eine der tollen Neuerungen seit XE3?
Zitat:

Zitat von Sir Rufo (Beitrag 1243195)
Dafür nehme ich MVVM, das kann ich immer so hinbiegen wie ich möchte und bin nicht darauf angewiesen, ob Komponente X und Eigenschaft Y auch für Livebindings vorgesehen vorbereitet ist.

Mit der Modelansicht und dem Umgang damit habe ich mich noch nie beschäftigt.

Gruß Heiko

Der schöne Günther 11. Jan 2014 22:59

AW: XE5: Probleme mit LiveBindings "CheckedState(Self)"
 
Ich weiß zwar spontan auch nicht, wo im VCL/FMX-Quellcode das so geregelt wird, aber beim Erstellen des Formulars geht es einmal anders herum: Die Checkbox richtet ihr Kreuzchen danach, ob die Edits die sie steuern soll, enabled sind oder nicht.

jus 10. Sep 2018 18:41

AW: XE5: Probleme mit LiveBindings "CheckedState(Self)"
 
Sorry, dass ich einen alten Thread wieder rauskrame, aber in Moment beschäftige ich mich mit MVVM und bin zufällig über das geniale Beispiel von Sir Rufo gestoplert. Meine Frage ist, kann man eigentlich sagen, dass die folgenden zwei Methoden eigentlich schon die konkrete Implementierung von ViewModel sind?

Zitat:

Zitat von Sir Rufo (Beitrag 1243195)

Delphi-Quellcode:
unit ViewFormMain;

...

  procedure TMainFormView.DoLoadFromModel;
    begin
      // Binding Model => View
      CheckBox1.Checked := ViewModel.Value;
      Edit1.Enabled    := not ViewModel.Value;
      Edit2.Enabled    := not ViewModel.Value;
      Edit3.Enabled    := not ViewModel.Value;
    end;

  procedure TMainFormView.DoSaveToModel;
    begin
      // Binding View => Model
      ViewModel.Value := CheckBox1.Checked;
    end;

...

end.

Lg,
jus


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz