AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi XE5: Probleme mit LiveBindings "CheckedState(Self)"
Thema durchsuchen
Ansicht
Themen-Optionen

XE5: Probleme mit LiveBindings "CheckedState(Self)"

Offene Frage von "jus"
Ein Thema von Kralle · begonnen am 11. Jan 2014 · letzter Beitrag vom 10. Sep 2018
Antwort Antwort
Kralle

Registriert seit: 31. Okt 2004
Ort: Bremerhaven
355 Beiträge
 
Delphi XE7 Professional
 
#1

XE5: Probleme mit LiveBindings "CheckedState(Self)"

  Alt 11. Jan 2014, 17:47
Delphi-Version: XE5
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
OS: Windows 10 Professional, Delphi XE7 Pro SP1 +(Mobilpack & FireDAC)

Geändert von Kralle (11. Jan 2014 um 18:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

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

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

  Alt 11. Jan 2014, 19:10
Was mache ich falsch?
Du benutzt Livebindings

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.
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
Kralle

Registriert seit: 31. Okt 2004
Ort: Bremerhaven
355 Beiträge
 
Delphi XE7 Professional
 
#3

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

  Alt 11. Jan 2014, 19:31
N'abend,

Du benutzt Livebindings
Aber, ist da nicht gerade auch eine der tollen Neuerungen seit XE3?
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
OS: Windows 10 Professional, Delphi XE7 Pro SP1 +(Mobilpack & FireDAC)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

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

  Alt 11. Jan 2014, 23:59
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.
  Mit Zitat antworten Zitat
jus

Registriert seit: 22. Jan 2005
344 Beiträge
 
Delphi 2007 Professional
 
#5

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

  Alt 10. Sep 2018, 19:41
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?


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
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:58 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