From 15f7db6d03068ee4ba209e6fb6e7927c665a654f Mon Sep 17 00:00:00 2001 From: jesus Date: Thu, 3 May 2007 17:34:56 +0000 Subject: [PATCH] LCL, fix several db controls to not enter dataset in edit state if datasource.autoedit is false, issue #8739 git-svn-id: trunk@11066 - --- lcl/dbctrls.pp | 1 + lcl/dbgrids.pas | 6 +----- lcl/include/dbcheckbox.inc | 8 +++++--- lcl/include/dbcombobox.inc | 34 +++++++++++++++++++++------------- lcl/include/dblistbox.inc | 4 ++++ lcl/include/dbradiogroup.inc | 6 ++++-- 6 files changed, 36 insertions(+), 23 deletions(-) diff --git a/lcl/dbctrls.pp b/lcl/dbctrls.pp index 25f84fb23e..a155475bab 100644 --- a/lcl/dbctrls.pp +++ b/lcl/dbctrls.pp @@ -494,6 +494,7 @@ Type procedure FocusRequest(Sender: TObject); virtual; procedure Loaded; override; procedure EditingDone; override; + procedure UpdateText; public constructor Create(TheOwner: TComponent); override; destructor Destroy; override; diff --git a/lcl/dbgrids.pas b/lcl/dbgrids.pas index c52dcb5c3c..1cbbcfe686 100644 --- a/lcl/dbgrids.pas +++ b/lcl/dbgrids.pas @@ -1533,16 +1533,12 @@ begin SelField := SelectedField; TempColumn := TColumn(ColumnFromGridColumn(Col)); - if (TempColumn<>nil) and not TempColumn.ReadOnly then + if (TempColumn<>nil) and not TempColumn.ReadOnly and FDatalink.Edit then begin if SelField.DataType=ftBoolean then - begin - SelField.DataSet.Edit; SelField.AsBoolean := not SelField.AsBoolean - end else begin - SelField.DataSet.Edit; if ValueMatch(TempColumn.ValueChecked, SelField.AsString) then SelField.AsString := TempColumn.ValueUnchecked else diff --git a/lcl/include/dbcheckbox.inc b/lcl/include/dbcheckbox.inc index b8c608fd56..a1d21735d0 100644 --- a/lcl/include/dbcheckbox.inc +++ b/lcl/include/dbcheckbox.inc @@ -149,9 +149,11 @@ end; procedure TDBCheckBox.EditingDone; begin - FDatalink.Edit; - FDatalink.Modified; - FDataLink.UpdateRecord; + if FDatalink.Edit then begin + FDatalink.Modified; + FDataLink.UpdateRecord; + end else + State:=GetFieldCheckState; inherited EditingDone; end; diff --git a/lcl/include/dbcombobox.inc b/lcl/include/dbcombobox.inc index f4939e3cf1..bd5ca67f6a 100644 --- a/lcl/include/dbcombobox.inc +++ b/lcl/include/dbcombobox.inc @@ -36,10 +36,12 @@ begin //need to override this to make sure the datalink gets notified //its been modified, then when post etc, it will call //updatedata to update the field data with current value - FDatalink.Edit; - FDataLink.Modified; - - inherited Change; + if FDatalink.Edit then + begin + FDataLink.Modified; + inherited change; + end else + UpdateText; end; @@ -69,15 +71,9 @@ end; procedure TDBComboBox.DataChange(Sender: TObject); begin - if not (Style=csSimple) and DroppedDown then Exit; - if FDataLink.Field <> nil then - // ToDo: use Field.Text - Text := FDataLink.Field.DisplayText - else - if csDesigning in ComponentState then - Text := Name - else - Text := ''; + if not (Style=csSimple) and DroppedDown then + Exit; + UpdateText; end; procedure TDBComboBox.EditingChange(Sender: TObject); @@ -123,6 +119,18 @@ begin inherited EditingDone; end; +procedure TDBComboBox.UpdateText; +begin + if FDataLink.Field <> nil then + // ToDo: use Field.Text + Text := FDataLink.Field.DisplayText + else + if csDesigning in ComponentState then + Text := Name + else + Text := ''; +end; + procedure TDBComboBox.ActiveChange(Sender: TObject); begin diff --git a/lcl/include/dblistbox.inc b/lcl/include/dblistbox.inc index 49a322ea46..102df2deaf 100644 --- a/lcl/include/dblistbox.inc +++ b/lcl/include/dblistbox.inc @@ -157,7 +157,11 @@ begin //so if a user changed the selection it can be //updated, and if not canel out ala ReadOnly if not FDataLink.Edit then + begin + // restore value + DataChange(self); exit; + end; inherited Click; FDataLink.Modified; diff --git a/lcl/include/dbradiogroup.inc b/lcl/include/dbradiogroup.inc index c2140ca174..f7ba3e25c1 100644 --- a/lcl/include/dbradiogroup.inc +++ b/lcl/include/dbradiogroup.inc @@ -141,8 +141,10 @@ begin Value := GetButtonValue(ItemIndex); if (Value<>OldValue) and FDatalink.CanModify and not SettingValue then begin - FDatalink.Edit; // ensure that we are in edit state - FDataLink.Modified; + if FDatalink.Edit then // ensure that we are in edit state + FDataLink.Modified + else + DataChange(Self); end; end;