{----------------------------------------------------------------------------- The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/MPL-1.1.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is: JvDBActionsEngine.Pas, released on 2004-12-30. The Initial Developer of the Original Code is Jens Fudickar [jens dott fudicker att oratool dott de] Portions created by Jens Fudickar are Copyright (C) 2002 Jens Fudickar. All Rights Reserved. Contributor(s): - You may retrieve the latest version of this file at the Project JEDI's JVCL home page, located at http://jvcl.sourceforge.net Known Issues: -----------------------------------------------------------------------------} // $Id: JvDBActionsEngine.pas 11205 2007-03-11 18:15:58Z jfudickar $ unit JvDBActionsEngine; {$I jvcl.inc} interface uses {$IFDEF UNITVERSIONING} JclUnitVersioning, {$ENDIF UNITVERSIONING} {$IFDEF MSWINDOWS} Windows, ImgList, Graphics, {$ENDIF MSWINDOWS} {$IFDEF UNIX} QWindows, QImgList, QGraphics, {$ENDIF UNIX} Forms, Controls, Classes, DB, DBGrids, JvPanel, JvDynControlEngineDB, JvDynControlEngineDBTools; type TJvDatabaseActionBaseEngine = class(TComponent) private FDatacomponent: TComponent; procedure SetDatacomponent(const Value: TComponent); virtual; public function Supports(ADataComponent: TComponent): Boolean; virtual; property Datacomponent: TComponent read FDatacomponent write SetDatacomponent; end; TJvDatabaseActionBaseDatasetEngine = class(TJvDatabaseActionBaseEngine) private FDataset: TDataset; procedure SetDatacomponent(const Value: TComponent); override; public function GetSQL: string; virtual; procedure SetSQL(const Value: string); virtual; function Supports(ADataComponent: TComponent): Boolean; override; function SupportsGetSQL: Boolean; virtual; function SupportsSetSQL: Boolean; virtual; property Dataset: TDataset read FDataset; property SQL: string read GetSQL write SetSQL; end; TJvShowSingleRecordWindowOptions = class(TPersistent) private FDialogCaption: string; FPostButtonCaption: string; FCancelButtonCaption: string; FCloseButtonCaption: string; FBorderStyle: TFormBorderStyle; FPosition: TPosition; FTop: Integer; FLeft: Integer; FWidth: Integer; FHeight: Integer; FArrangeConstraints: TSizeConstraints; FArrangeSettings: TJvArrangeSettings; FFieldCreateOptions: TJvCreateDBFieldsOnControlOptions; protected procedure SetArrangeSettings(Value: TJvArrangeSettings); procedure SetArrangeConstraints(Value: TSizeConstraints); procedure SetFieldCreateOptions(Value: TJvCreateDBFieldsOnControlOptions); public constructor Create; destructor Destroy; override; procedure SetOptionsToDialog(ADialog: TJvDynControlDataSourceEditDialog); published property DialogCaption: string read FDialogCaption write FDialogCaption; property PostButtonCaption: string read FPostButtonCaption write FPostButtonCaption; property CancelButtonCaption: string read FCancelButtonCaption write FCancelButtonCaption; property CloseButtonCaption: string read FCloseButtonCaption write FCloseButtonCaption; property BorderStyle: TFormBorderStyle read FBorderStyle write FBorderStyle default bsDialog; property Position: TPosition read FPosition write FPosition default poScreenCenter; property Top: Integer read FTop write FTop default 0; property Left: Integer read FLeft write FLeft default 0; property Width: Integer read FWidth write FWidth default 640; property Height: Integer read FHeight write FHeight default 480; property ArrangeConstraints: TSizeConstraints read FArrangeConstraints write SetArrangeConstraints; property ArrangeSettings: TJvArrangeSettings read FArrangeSettings write SetArrangeSettings; property FieldCreateOptions: TJvCreateDBFieldsOnControlOptions read FFieldCreateOptions write SetFieldCreateOptions; end; TJvDatabaseActionBaseControlEngine = class(TJvDatabaseActionBaseEngine) private FDataset: TDataset; FDataSource: TDataSource; function GetSelectedField: TField; virtual; protected function GetDataSource(ADataComponent: TComponent): TDataSource; virtual; function GetDataSet(ADataComponent: TComponent): TDataSet; virtual; procedure Notification(AComponent: TComponent; Operation: TOperation); override; procedure SetDatacomponent(const Value: TComponent); override; public constructor Create(AOwner: TComponent); override; function Supports(ADataComponent: TComponent): Boolean; override; function IsActive: Boolean; virtual; function HasData: Boolean; virtual; function FieldCount: Integer; virtual; function RecordCount: Integer; virtual; function RecNo: Integer; virtual; function CanInsert: Boolean; virtual; function CanUpdate: Boolean; virtual; function CanDelete: Boolean; virtual; function EOF: Boolean; virtual; function Bof: Boolean; virtual; function CanRefresh: Boolean; virtual; function CanNavigate: Boolean; virtual; procedure DisableControls; virtual; procedure EnableControls; virtual; function ControlsDisabled: Boolean; virtual; function EditModeActive: Boolean; virtual; function FieldById(const FieldId: Integer): TField; virtual; function FieldByName(const FieldName: string): TField; virtual; procedure FillFieldList(var AFieldList: TStrings; const AOnlyVisible: Boolean); virtual; procedure First; virtual; function GotoSelectedRow(const ASelectedRow: Integer): Boolean; virtual; function IsFieldVisible(const AFieldName: string): Boolean; virtual; function IsFieldReadOnly(const AFieldName: string): Boolean; virtual; procedure Last; virtual; procedure MoveBy(Distance: Integer); virtual; function SelectedRowsCount: Integer; virtual; procedure ShowSingleRecordWindow(AOptions: TJvShowSingleRecordWindowOptions); virtual; property Dataset: TDataset read FDataset; property DataSource: TDataSource read FDataSource; property SelectedField: TField read GetSelectedField; end; TJvDatabaseActionBaseEngineClass = class of TJvDatabaseActionBaseEngine; TJvDatabaseActionDBGridControlEngine = class(TJvDatabaseActionBaseControlEngine) private FCustomDBGrid: TCustomDBGrid; protected function GetCustomDBGrid(ADataComponent: TComponent): TCustomDBGrid; virtual; function GetDataSource(ADataComponent: TComponent): TDataSource; override; procedure OnCreateDataControls(ADynControlEngineDB: TJvDynControlEngineDB; AParentControl: TWinControl; AFieldCreateOptions: TJvCreateDBFieldsOnControlOptions); procedure SetDatacomponent(const Value: TComponent); override; public constructor Create(AOwner: TComponent); override; function GotoSelectedRow(const ASelectedRow: Integer): Boolean; override; function GetSelectedField: TField; override; function SelectedRowsCount: Integer; override; function Supports(ADataComponent: TComponent): Boolean; override; procedure ShowSingleRecordWindow(AOptions: TJvShowSingleRecordWindowOptions); override; property CustomDBGrid: TCustomDBGrid read FCustomDBGrid; end; TJvDatabaseActionEngineList = class(TList) public destructor Destroy; override; procedure RegisterEngine(AEngineClass: TJvDatabaseActionBaseEngineClass); function GetControlEngine(AComponent: TComponent): TJvDatabaseActionBaseControlEngine; function GetDatasetEngine(AComponent: TComponent): TJvDatabaseActionBaseDatasetEngine; function Supports(AComponent: TComponent): Boolean; function SupportsDataset(AComponent: TComponent): Boolean; end; procedure RegisterActionEngine(AEngineClass: TJvDatabaseActionBaseEngineClass); function RegisteredDatabaseActionEngineList: TJvDatabaseActionEngineList; {$IFDEF UNITVERSIONING} const UnitVersioning: TUnitVersionInfo = ( RCSfile: '$URL: https://jvcl.svn.sourceforge.net/svnroot/jvcl/tags/JVCL3_32/run/JvDBActionsEngine.pas $'; Revision: '$Revision: 11205 $'; Date: '$Date: 2007-03-11 19:15:58 +0100 (dim., 11 mars 2007) $'; LogPath: 'JVCL\run' ); {$ENDIF UNITVERSIONING} implementation uses SysUtils, Grids, TypInfo, {$IFDEF HAS_UNIT_STRUTILS} StrUtils, {$ENDIF HAS_UNIT_STRUTILS} JvResources, JvParameterList, JvParameterListParameter, JvDSADialogs, {$IFDEF HAS_UNIT_VARIANTS} Variants, {$ENDIF HAS_UNIT_VARIANTS} Dialogs; var IntRegisteredActionEngineList: TJvDatabaseActionEngineList; //=== { TJvDatabaseActionBaseControlEngine } ================================= constructor TJvDatabaseActionBaseControlEngine.Create(AOwner: TComponent); begin inherited Create(AOwner); FDataset := nil; FDataSource := nil; FDatacomponent := nil; end; function TJvDatabaseActionBaseControlEngine.GetDataSource(ADataComponent: TComponent): TDataSource; begin if Assigned(ADataComponent) and (ADataComponent is TDataSource) then Result := TDataSource(ADataComponent) else Result := nil; end; function TJvDatabaseActionBaseControlEngine.GetDataSet(ADataComponent: TComponent): TDataSet; begin if Assigned(GetDataSource(ADataComponent)) then Result := GetDataSource(ADataComponent).DataSet else Result := nil; end; function TJvDatabaseActionBaseControlEngine.Supports(ADataComponent: TComponent): Boolean; begin Result := Assigned(ADataComponent) and (ADataComponent is TDataSource); end; function TJvDatabaseActionBaseControlEngine.IsActive: Boolean; begin if Assigned(DataSet) then Result := DataSet.Active else Result := False; end; function TJvDatabaseActionBaseControlEngine.HasData: Boolean; begin if Assigned(DataSet) then Result := DataSet.RecordCount > 0 else Result := False; end; function TJvDatabaseActionBaseControlEngine.FieldCount: Integer; begin if Assigned(DataSet) then Result := DataSet.FieldCount else Result := -1; end; function TJvDatabaseActionBaseControlEngine.RecordCount: Integer; begin if Assigned(DataSet) then Result := DataSet.RecordCount else Result := -1; end; function TJvDatabaseActionBaseControlEngine.RecNo: Integer; begin if Assigned(DataSet) then Result := DataSet.RecNo else Result := -1; end; function TJvDatabaseActionBaseControlEngine.CanInsert: Boolean; begin if Assigned(DataSet) then Result := DataSet.CanModify else Result := False; end; function TJvDatabaseActionBaseControlEngine.CanUpdate: Boolean; begin if Assigned(DataSet) then Result := DataSet.CanModify else Result := False; end; function TJvDatabaseActionBaseControlEngine.CanDelete: Boolean; begin if Assigned(DataSet) then Result := DataSet.CanModify else Result := False; end; function TJvDatabaseActionBaseControlEngine.EOF: Boolean; begin if Assigned(DataSet) then Result := DataSet.EOF else Result := False; end; function TJvDatabaseActionBaseControlEngine.Bof: Boolean; begin if Assigned(DataSet) then Result := DataSet.Bof else Result := False; end; function TJvDatabaseActionBaseControlEngine.CanRefresh: Boolean; begin Result := Assigned(DataSet); end; function TJvDatabaseActionBaseControlEngine.CanNavigate: Boolean; begin Result := Assigned(DataSet); end; procedure TJvDatabaseActionBaseControlEngine.DisableControls; begin if Assigned(DataSet) then DataSet.DisableControls; end; procedure TJvDatabaseActionBaseControlEngine.EnableControls; begin if Assigned(DataSet) then DataSet.EnableControls; end; function TJvDatabaseActionBaseControlEngine.ControlsDisabled: Boolean; begin if Assigned(DataSet) then Result := DataSet.ControlsDisabled else Result := False; end; function TJvDatabaseActionBaseControlEngine.EditModeActive: Boolean; begin if Assigned(DataSet) then Result := DataSet.State in [dsInsert, dsEdit] else Result := False; end; function TJvDatabaseActionBaseControlEngine.FieldById(const FieldId: Integer): TField; begin if Assigned(Dataset) then Result := Dataset.Fields[FieldId] else Result := nil; end; function TJvDatabaseActionBaseControlEngine.FieldByName(const FieldName: string): TField; begin if Assigned(Dataset) then Result := Dataset.FieldByName(FieldName) else Result := nil; end; procedure TJvDatabaseActionBaseControlEngine.FillFieldList(var AFieldList: TStrings; const AOnlyVisible: Boolean); var I: Integer; begin AFieldList.Clear; if Assigned(Dataset) then begin for I := 0 to DataSet.Fields.Count - 1 do if not AOnlyVisible or IsFieldVisible(DataSet.Fields[I].FieldName) then AFieldList.Add(DataSet.Fields[I].FieldName); end; end; procedure TJvDatabaseActionBaseControlEngine.First; begin if Assigned(DataSet) then DataSet.First; end; function TJvDatabaseActionBaseControlEngine.GotoSelectedRow(const ASelectedRow: Integer): Boolean; begin Result := False; end; function TJvDatabaseActionBaseControlEngine.IsFieldVisible(const AFieldName: string): Boolean; var Field: TField; begin Field := FieldByName(AFieldName); if Assigned(Field) then Result := Field.Visible else Result := False; end; function TJvDatabaseActionBaseControlEngine.IsFieldReadOnly(const AFieldName: string): Boolean; var Field: TField; begin Field := FieldByName(AFieldName); if Assigned(Field) then Result := Field.ReadOnly else Result := False; end; procedure TJvDatabaseActionBaseControlEngine.Last; begin if Assigned(DataSet) then DataSet.Last; end; procedure TJvDatabaseActionBaseControlEngine.MoveBy(Distance: Integer); begin if Assigned(DataSet) then DataSet.MoveBy(Distance); end; procedure TJvDatabaseActionBaseControlEngine.Notification(AComponent: TComponent; Operation: TOperation); begin inherited Notification(AComponent, Operation); if (Operation = opRemove) and (AComponent = FDataComponent) then DataComponent := nil; end; function TJvDatabaseActionBaseControlEngine.GetSelectedField: TField; begin Result := nil; end; function TJvDatabaseActionBaseControlEngine.SelectedRowsCount: Integer; begin Result := 0; end; procedure TJvDatabaseActionBaseControlEngine.SetDatacomponent(const Value: TComponent); begin inherited SetDatacomponent (Value); FDatasource := GetDataSource(Value); FDataset := GetDataSet(Value); end; procedure TJvDatabaseActionBaseControlEngine.ShowSingleRecordWindow(AOptions: TJvShowSingleRecordWindowOptions); var Dialog: TJvDynControlDataSourceEditDialog; begin Dialog := TJvDynControlDataSourceEditDialog.Create; try AOptions.SetOptionsToDialog(Dialog); if Dialog.DynControlEngineDB.SupportsDataComponent(DataComponent) then Dialog.DataComponent := DataComponent else Dialog.DataComponent := DataSource; Dialog.ShowDialog; finally Dialog.Free; end; end; //=== { TJvDatabaseActionDBGridControlEngine } =============================== function TJvDatabaseActionDBGridControlEngine.GetDataSource(ADataComponent: TComponent): TDataSource; begin if Assigned(ADataComponent) and (ADataComponent is TCustomDBGrid) then Result := TCustomDBGrid(ADataComponent).DataSource else Result := nil; end; type TAccessCustomDBGrid = class(TCustomDBGrid); TAccessCustomControl = class(TCustomControl); constructor TJvDatabaseActionDBGridControlEngine.Create(AOwner: TComponent); begin inherited Create(AOwner); FCustomDBGrid := nil; end; function TJvDatabaseActionDBGridControlEngine.GetCustomDBGrid(ADataComponent: TComponent): TCustomDBGrid; begin if Assigned(ADataComponent) and (ADataComponent is TCustomDBGrid) then Result := TCustomDBGrid(ADataComponent) else Result := nil; end; function TJvDatabaseActionDBGridControlEngine.GotoSelectedRow(const ASelectedRow: Integer): Boolean; begin if (ASelectedRow >= 0) and (ASelectedRow < SelectedRowsCount) and Assigned(Dataset) and Dataset.Active then begin Dataset.GotoBookmark(Pointer(TAccessCustomDBGrid(CustomDBGrid).SelectedRows[ASelectedRow])); Result := True; end else Result := False; end; procedure TJvDatabaseActionDBGridControlEngine.OnCreateDataControls(ADynControlEngineDB: TJvDynControlEngineDB; AParentControl: TWinControl; AFieldCreateOptions: TJvCreateDBFieldsOnControlOptions); var I: Integer; ds: TDataSource; Field: TField; LabelControl: TControl; Control: TWinControl; Column: TColumn; begin if Assigned(CustomDBGrid) then begin ds := DataSource; with AFieldCreateOptions do for I := 0 to TAccessCustomDBGrid(CustomDBGrid).ColCount - 2 do begin Column := TAccessCustomDBGrid(CustomDBGrid).Columns[I]; if Column.Visible or ShowInvisibleFields then begin Field := Column.Field; Control := ADynControlEngineDB.CreateDBFieldControl(Field, AParentControl, AParentControl, '', ds); Control.Enabled := not IsFieldReadOnly(Field.FieldName); if FieldDefaultWidth > 0 then Control.Width := FieldDefaultWidth else begin if UseFieldSizeForWidth then if Field.Size > 0 then Control.Width := TAccessCustomControl(AParentControl).Canvas.TextWidth('X') * Field.Size else begin if (ADynControlEngineDB.GetFieldControlType(Field)= jctDBMemo) and (FieldMaxWidth > 0) then Control.Width := FieldMaxWidth; end else if Field.DisplayWidth > 0 then Control.Width := TAccessCustomControl(AParentControl).Canvas.TextWidth('X') * Field.DisplayWidth; if (FieldMaxWidth > 0) and (Control.Width > FieldMaxWidth) then Control.Width := FieldMaxWidth else if (FieldMinWidth > 0) and (Control.Width < FieldMinWidth) then Control.Width := FieldMinWidth; end; if UseParentColorForReadOnly then if (Assigned(ds.DataSet) and not ds.DataSet.CanModify) or Field.ReadOnly then if isPublishedProp(Control, 'ParentColor') then SetOrdProp(Control, 'ParentColor', Ord(True)); LabelControl := ADynControlEngineDB.DynControlEngine.CreateLabelControlPanel(AParentControl, AParentControl, '', '&' + Column.Title.Caption, Control, True, 0); if FieldWidthStep > 0 then if (LabelControl.Width mod FieldWidthStep) <> 0 then LabelControl.Width := ((LabelControl.Width div FieldWidthStep) + 1) * FieldWidthStep; end; end; end; end; function TJvDatabaseActionDBGridControlEngine.GetSelectedField: TField; begin if Assigned(CustomDBGrid) then Result := CustomDBGrid.SelectedField else Result := nil; end; function TJvDatabaseActionDBGridControlEngine.SelectedRowsCount: Integer; begin if Assigned(CustomDBGrid) then Result := TAccessCustomDBGrid(CustomDBGrid).SelectedRows.Count else Result := 0; end; procedure TJvDatabaseActionDBGridControlEngine.SetDatacomponent(const Value: TComponent); begin inherited SetDatacomponent(Value); FCustomDbGrid := GetCustomDBGrid(Value); end; function TJvDatabaseActionDBGridControlEngine.Supports(ADataComponent: TComponent): Boolean; begin Result := Assigned(ADataComponent) and (ADataComponent is TCustomDBGrid); end; procedure TJvDatabaseActionDBGridControlEngine.ShowSingleRecordWindow(AOptions: TJvShowSingleRecordWindowOptions); var Dialog: TJvDynControlDataSourceEditDialog; begin Dialog := TJvDynControlDataSourceEditDialog.Create; try AOptions.SetOptionsToDialog(Dialog); if Dialog.DynControlEngineDB.SupportsDataComponent(DataComponent) then Dialog.DataComponent := DataComponent else Dialog.DataComponent := DataSource; Dialog.OnCreateDataControlsEvent := OnCreateDataControls; Dialog.ShowDialog; finally Dialog.Free; end; end; //=== { TJvDatabaseActionEngineList } ======================================== destructor TJvDatabaseActionEngineList.Destroy; var I: Integer; begin for I := Count - 1 downto 0 do begin TJvDatabaseActionBaseControlEngine(Items[I]).Free; Items[I] := nil; Delete(I); end; inherited Destroy; end; procedure TJvDatabaseActionEngineList.RegisterEngine(AEngineClass: TJvDatabaseActionBaseEngineClass); begin Add(AEngineClass.Create(nil)); end; function TJvDatabaseActionEngineList.GetControlEngine(AComponent: TComponent): TJvDatabaseActionBaseControlEngine; var Ind: Integer; begin Result := nil; for Ind := 0 to Count - 1 do if TObject(Items[Ind]) is TJvDatabaseActionBaseControlEngine then if TJvDatabaseActionBaseControlEngine(Items[Ind]).Supports(AComponent) then begin Result := TJvDatabaseActionBaseControlEngine(Items[Ind]); Break; end; end; function TJvDatabaseActionEngineList.GetDatasetEngine(AComponent: TComponent): TJvDatabaseActionBaseDatasetEngine; var Ind: Integer; begin Result := nil; for Ind := 0 to Count - 1 do if TObject(Items[Ind]) is TJvDatabaseActionBaseDatasetEngine then if TJvDatabaseActionBaseDatasetEngine(Items[Ind]).Supports(AComponent) then begin Result := TJvDatabaseActionBaseDatasetEngine(Items[Ind]); Break; end; end; function TJvDatabaseActionEngineList.Supports(AComponent: TComponent): Boolean; begin Result := Assigned(GetControlEngine(AComponent)); end; function TJvDatabaseActionEngineList.SupportsDataset(AComponent: TComponent): Boolean; begin Result := Assigned(GetDatasetEngine(AComponent)); end; //=== { TJvDatabaseActionBaseEngine } ======================================== procedure TJvDatabaseActionBaseEngine.SetDatacomponent(const Value: TComponent); begin FDatacomponent := Value; if FDataComponent <> nil then FDataComponent.FreeNotification(Self); end; function TJvDatabaseActionBaseEngine.Supports(ADataComponent: TComponent): Boolean; begin Result := False; end; //=== { TJvDatabaseActionBaseDatasetEngine } ================================= function TJvDatabaseActionBaseDatasetEngine.GetSQL: string; begin Result := ''; end; procedure TJvDatabaseActionBaseDatasetEngine.SetDatacomponent(const Value: TComponent); begin inherited Setdatacomponent (Value); if Supports(Value) then FDataset := TDataset(Value) else FDataset := nil; end; procedure TJvDatabaseActionBaseDatasetEngine.SetSQL(const Value: string); begin end; function TJvDatabaseActionBaseDatasetEngine.Supports(ADataComponent: TComponent): Boolean; begin Result := False; end; function TJvDatabaseActionBaseDatasetEngine.SupportsGetSQL: Boolean; begin Result := False; end; function TJvDatabaseActionBaseDatasetEngine.SupportsSetSQL: Boolean; begin Result := False; end; //=== { TJvShowSingleRecordWindowOptions } =================================== constructor TJvShowSingleRecordWindowOptions.Create; begin inherited Create; FDialogCaption := ''; FPostButtonCaption := RsSRWPostButtonCaption; FCancelButtonCaption := RsSRWCancelButtonCaption; FCloseButtonCaption := RsSRWCloseButtonCaption; FBorderStyle := bsDialog; FTop := 0; FLeft := 0; FWidth := 640; FHeight := 480; FPosition := poScreenCenter; FArrangeSettings := TJvArrangeSettings.Create(); with FArrangeSettings do begin AutoSize := asBoth; DistanceHorizontal := 3; DistanceVertical := 3; BorderLeft := 3; BorderTop := 3; WrapControls := True; end; FArrangeConstraints := TSizeConstraints.Create(nil); FArrangeConstraints.MaxHeight := 480; FArrangeConstraints.MaxWidth := 640; FFieldCreateOptions := TJvCreateDBFieldsOnControlOptions.Create; end; destructor TJvShowSingleRecordWindowOptions.Destroy; begin FFieldCreateOptions.Free; FArrangeConstraints.Free; FArrangeSettings.Free; inherited Destroy; end; procedure TJvShowSingleRecordWindowOptions.SetArrangeSettings(Value: TJvArrangeSettings); begin FArrangeSettings.Assign(Value); end; procedure TJvShowSingleRecordWindowOptions.SetArrangeConstraints(Value: TSizeConstraints); begin FArrangeConstraints.Assign(Value); end; procedure TJvShowSingleRecordWindowOptions.SetFieldCreateOptions(Value: TJvCreateDBFieldsOnControlOptions); begin FFieldCreateOptions.Assign(Value); end; procedure TJvShowSingleRecordWindowOptions.SetOptionsToDialog(ADialog: TJvDynControlDataSourceEditDialog); begin if Assigned(ADialog) then begin ADialog.DialogCaption := DialogCaption; ADialog.PostButtonCaption := PostButtonCaption; ADialog.CancelButtonCaption := CancelButtonCaption; ADialog.CloseButtonCaption := CloseButtonCaption; ADialog.Position := Position; ADialog.BorderStyle := BorderStyle; ADialog.Top := Top; ADialog.Left := Left; ADialog.Width := Width; ADialog.Height := Height; ADialog.ArrangeConstraints := ArrangeConstraints; ADialog.ArrangeSettings := ArrangeSettings; ADialog.FieldCreateOptions := FieldCreateOptions; end; end; //=== Global ================================================================= function RegisteredDatabaseActionEngineList: TJvDatabaseActionEngineList; begin Result := IntRegisteredActionEngineList; end; procedure RegisterActionEngine(AEngineClass: TJvDatabaseActionBaseEngineClass); begin if Assigned(IntRegisteredActionEngineList) then IntRegisteredActionEngineList.RegisterEngine(AEngineClass); end; procedure CreateActionEngineList; begin IntRegisteredActionEngineList := TJvDatabaseActionEngineList.Create; end; procedure DestroyActionEngineList; begin IntRegisteredActionEngineList.Free; IntRegisteredActionEngineList := nil; end; procedure InitActionEngineList; begin CreateActionEngineList; RegisterActionEngine(TJvDatabaseActionBaseControlEngine); RegisterActionEngine(TJvDatabaseActionDBGridControlEngine); end; initialization {$IFDEF UNITVERSIONING} RegisterUnitVersion(HInstance, UnitVersioning); {$ENDIF UNITVERSIONING} InitActionEngineList; finalization DestroyActionEngineList; {$IFDEF UNITVERSIONING} UnregisterUnitVersion(HInstance); {$ENDIF UNITVERSIONING} end.