854 lines
27 KiB
ObjectPascal
854 lines
27 KiB
ObjectPascal
{-----------------------------------------------------------------------------
|
|
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.
|
|
|