2

TDBCheckBox最初のコントロールがにバインドされているいくつかのコントロールを持つフォームがありDataField := 'enabled'ます。

チェックボックスをクリックすると、残りのすべてのコントロールを有効/無効にする必要があります。

procedure TMyAdapter.DataSourceDataChange(Sender: TObject; Field: TField);
var
  Enabled: Boolean;
begin
  Enabled := FModel.DataSet['enabled'].AsBoolean;
  FView.Label1.Enabled   := Enabled;
  FView.DBEdit1.Enabled  := Enabled;
  FView.Label2.Enabled   := Enabled;
  FView.DBEdit2.Enabled  := Enabled;
  FView.Label3.Enabled   := Enabled;
  FView.DBEdit3.Enabled  := Enabled;
  FView.Label4.Enabled   := Enabled;
  FView.DBEdit4.Enabled  := Enabled;
end;

これは、フォーカスがチェックボックスを離れたとき、またはデータセットがスクロールされたときにのみ機能します (このフォームにもナビゲーターがあります)。

チェックボックスのデータフィールドをすぐに更新する方法はありますか?

または、私が説明したことを達成するためのより良い代替手段はありますか?

4

3 に答える 3

3

DataSetsUpdateRecordメソッドを呼び出して、リンクされた DB コントロールがそのデータを基になるフィールドに格納するようにすることができます。

于 2015-06-21T10:54:49.100 に答える
2

このようなことを行うために DataChange イベントを使用する場合のいくつかの問題は、次のとおりです。

  • DBCheckBox がクリックされたことに反応するために、実際に必要な頻度よりもはるかに頻繁に呼び出されます。

  • データセットに .Post を実行すると、その状態が変更されます。これは、データセットの状態の変更によってトリガーされる可能性のあるイベント内では一般的に悪い考えです。

この種の問題に対処するには、標準化された方法を使用するのが最善です。私が使用する方法は、以下に示すように、必要な作業を行うカスタム メッセージ ハンドラーを作成し、DBCheckBox1Click ハンドラーから PostMessage を使用して呼び出すことです。

const
      WM_AutoPost = WM_User + 1;
type
  TForm1 = class(TForm)
    [...]
  private
    procedure DoAutoPost;
    procedure WMAutoPost(var Msg : TMessage); message WM_Autopost;
  [...]
  end;

var
  Form1: TForm1;

implementation

[...]

procedure TForm1.DBCheckBox1Click(Sender: TObject);
begin
  PostMessage(Self.Handle, WM_AutoPost, 0, 0);
end;

procedure TForm1.DoAutoPost;
begin
  if CDS1.State in [dsEdit, dsInsert] then begin
    CDS1.Post;
    //  Update other controls here
  end;
end;

procedure TForm1.WMAutoPost(var Msg: TMessage);
begin
  DoAutoPost;
end;
于 2015-06-21T11:59:06.410 に答える
1

これは、Uwe と MartynA の回答を入力して作成したソリューションです。

procedure TMyAdapter.EnabledClick(Sender: TObject);
begin
  PostMessage(FView.Handle, WM_ENABLED_CLICKED, 0, 0);
end;

procedure TMyAdapter.WMEnabledClicked(var Msg: TMessage);
var
  DataSet: TDataSet;
begin
  DataSet := FView.EnabledCheckBox.Field.DataSet;
  if not (DataSet.State in [dsInsert, dsEdit]) then 
    DataSet.Edit;
  DataSet.UpdateRecord;
end;

procedure TMyAdapter.DataSourceDataChange(Sender: TObject; Field: TField);
var
  Enabled: Boolean;
begin
  if (Field = nil) or (Field = FView.EnabledCheckBox.Field) then
  begin
    Enabled := FView.EnabledCheckBox.Field.AsBoolean;
    FView.Label1.Enabled   := Enabled;
    FView.DBEdit1.Enabled  := Enabled;
    // etc.
  end;
end;
于 2015-06-22T07:18:35.303 に答える