📄 sqldriverediteh.pas
字号:
{*******************************************************}
{ }
{ EhLib v4.2 (Build 4.2.09) }
{ }
{ TSQLDataEditWin form }
{ }
{ Copyright (c) 2004-2006 by Dmitry V. Bolshakov }
{ }
{*******************************************************}
unit SQLDriverEditEh;
{$I EHLIB.INC}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, Grids, DBGridEh, ExtCtrls, Buttons, Mask,
DBCtrlsEh, DataDriverEh, DB, MemTableEh, MemTableDataEh, SQLEditFrameEh,
{$IFDEF CIL}
EhLibVCLNET,
{$ELSE}
EhLibVCL,
{$ENDIF}
{$IFDEF EH_LIB_6}
Variants,
{$ENDIF}
Contnrs, Menus, ImgList, StdActns, ActnList, ToolWin, GridsEh;
type
{ TSQLDataEditWin }
TSQLTreeNode = class;
TCustomDBService = class;
TDesignDataBaseEh = class;
TCustomDBServiceClass = class of TCustomDBService;
(* IGetSQLTreeNode = interface
['{48BFF91A-8FD5-4F69-8938-8251C1B11C3A}']
function GetSQLTreeNode: TSQLTreeNode;
end;
*)
TSQLDataEditWin = class(TForm)
Panel1: TPanel;
DBGridEh1: TDBGridEh;
Panel2: TPanel;
StatusBar1: TStatusBar;
Button1: TButton;
Button2: TButton;
Splitter1: TSplitter;
Splitter3: TSplitter;
Panel6: TPanel;
Panel7: TPanel;
DBEditEh1: TDBEditEh;
sbRefreshTree: TSpeedButton;
MemTableEh1: TMemTableEh;
DataSource1: TDataSource;
mtParams: TMemTableEh;
dsParams: TDataSource;
mtParamsParName: TStringField;
mtParamsParType: TStringField;
mtParamsParValue: TStringField;
gridTreeDetail: TDBGridEh;
mtTreeDetail: TMemTableEh;
dsTreeDetail: TDataSource;
Splitter4: TSplitter;
Panel3: TPanel;
PageControl1: TPageControl;
TabSheet1: TTabSheet;
Splitter2: TSplitter;
PanelParams: TPanel;
gridParams: TDBGridEh;
Panel5: TPanel;
Memo1: TMemo;
Panel8: TPanel;
bExecute: TButton;
Panel9: TPanel;
SpeedButton2: TSpeedButton;
TabSheet2: TTabSheet;
FrameInsertSQL: TSQLEditFrame;
TabSheet3: TTabSheet;
FrameUpdateSQL: TSQLEditFrame;
TabSheet4: TTabSheet;
FrameDeleteSQL: TSQLEditFrame;
bBuildUpdates: TButton;
Image1: TImage;
Panel4: TPanel;
sbRefresh: TSpeedButton;
PopupMenu1: TPopupMenu;
Ggg1: TMenuItem;
gridDBTree: TDBGridEh;
dsDBTree: TDataSource;
mtDBTree: TMemTableEh;
mtDBTreeName: TStringField;
mtDBTreeChieldCount: TIntegerField;
mtDBTreeDescription: TStringField;
mtDBTreeId: TAutoIncField;
mtDBTreeRefParent: TIntegerField;
bCheck: TButton;
bQueryPlan: TButton;
spCut: TSpeedButton;
sbCopy: TSpeedButton;
spPaste: TSpeedButton;
sbSelectAll: TSpeedButton;
ActionList1: TActionList;
EditCut1: TEditCut;
EditCopy1: TEditCopy;
EditPaste1: TEditPaste;
EditSelectAll1: TEditSelectAll;
ImageList1: TImageList;
ImageList2: TImageList;
mtDBTreeImageIndex: TIntegerField;
TabSheet5: TTabSheet;
FrameGetRecSQL: TSQLEditFrame;
ToolBar1: TToolBar;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
ToolButton4: TToolButton;
tsSpecParams: TTabSheet;
Panel11: TPanel;
Label1: TLabel;
Label2: TLabel;
MemoUpdateFields: TMemo;
MemoKeyFields: TMemo;
Bevel1: TBevel;
Bevel2: TBevel;
dbeUpdateTable: TDBEditEh;
Label3: TLabel;
Bevel3: TBevel;
GroupBox1: TGroupBox;
cbDinaDeleteSQL: TCheckBox;
cbDinaInsertSQL: TCheckBox;
cbDinaUpdateSQL: TCheckBox;
Panel12: TPanel;
mSpecParams: TMemo;
Panel10: TPanel;
Label4: TLabel;
Bevel4: TBevel;
bLoadSpecString: TButton;
Bevel5: TBevel;
mtDBTreeRefData: TRefObjectField;
procedure sbRefreshTreeClick(Sender: TObject);
procedure bExecuteClick(Sender: TObject);
procedure sbHideShowClick(Sender: TObject);
procedure Splitter2CanResize(Sender: TObject; var NewSize: Integer;
var Accept: Boolean);
procedure FormCreate(Sender: TObject);
procedure bBuildUpdatesClick(Sender: TObject);
procedure MemTableEh1AfterOpen(DataSet: TDataSet);
procedure FormShow(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Memo1Exit(Sender: TObject);
procedure Memo1Enter(Sender: TObject);
procedure sbRefreshClick(Sender: TObject);
procedure DBEditEh1EditButtons0Click(Sender: TObject;
var Handled: Boolean);
procedure DBEditEh1EditButtons1Click(Sender: TObject;
var Handled: Boolean);
procedure Memo1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure Memo1DragDrop(Sender, Source: TObject; X, Y: Integer);
procedure Ggg1Click(Sender: TObject);
procedure dsDBTreeDataChange(Sender: TObject; Field: TField);
procedure gridDBTreeMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure gridDBTreeStartDrag(Sender: TObject;
var DragObject: TDragObject);
procedure bQueryPlanClick(Sender: TObject);
procedure gridDBTreeColumns0GetCellParams(Sender: TObject;
EditMode: Boolean; Params: TColCellParamsEh);
procedure bLoadSpecStringClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure gridParamsColumns0UpdateData(Sender: TObject; var Text: string;
var Value: Variant; var UseText, Handled: Boolean);
private
FCharHeight: Integer;
FSQLCanvas: TControlCanvas;
FDesignDriver: TCustomSQLDataDriverEh;
FDataDriver: TCustomSQLDataDriverEh;
FDesignDataBase: TDesignDataBaseEh;
procedure SetDesignDataBase(const Value: TDesignDataBaseEh);
// procedure InsertText(Text: string; AddComma: Boolean = True);
procedure DrawCaretPosIndicator;
// procedure SetDataDriver(const Value: TCustomSQLDataDriverEh);
property DesignDriver: TCustomSQLDataDriverEh read FDesignDriver write FDesignDriver;
procedure SetObjectTreeParams;
procedure ResetObjectTreeParams;
// procedure BuildObjectTree;
function ExecuteCommand(DataDriver: TCustomSQLDataDriverEh;
Command: TCustomSQLCommandEh; var Cursor: TDataSet; var FreeOnEof: Boolean): Integer;
// function DesignDataBase: TDesignDataBaseEh;
procedure DesignDatabaseChanged();
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
public
Panel3Width: Integer;
// DragSQLTreeNode: IGetSQLTreeNode;
DragSQLTreeNode: TSQLTreeNode;
mtDBTreeLoading: Boolean;
destructor Destroy; override;
procedure AssignToDesignDriver;
procedure AssignToDesignControls;
procedure mtDBTreeExpanding(Sender: TObject; RecordNumber: Integer; var AllowExpansion: Boolean);
procedure gridTreeDetailColumns0GetCellParams(Sender: TObject;
EditMode: Boolean; Params: TColCellParamsEh);
property DataDriver: TCustomSQLDataDriverEh read FDataDriver write FDataDriver;
property DesignDataBase: TDesignDataBaseEh read FDesignDataBase write SetDesignDataBase;
end;
TParamsArr = array of Variant;
{ TDesignDataBaseEh }
TDesignDataBaseEh = class(TComponent, IDesignDataBaseEh
{$IFNDEF EH_LIB_6}, IInterfaceComponentReference, IUnknown {$ENDIF}
)
protected
FTreeDataSet: TMemTableEh;
procedure RemoveFromDesignDataBaseList;
function GetConnected: Boolean; virtual;
procedure SetConnected(const Value: Boolean); virtual;
{$IFNDEF EH_LIB_6}
{ IInterfaceComponentReference }
function IInterfaceComponentReference.GetComponent = IntfGetComponent;
function IntfGetComponent: TComponent;
{$ENDIF}
public
constructor Create; reintroduce;
destructor Destroy; override;
function BuildObjectTree(List: TList): Boolean; virtual;
function BuildUpdates(DataDriver: TCustomSQLDataDriverEh): Boolean; virtual;
// function Connected: Boolean; virtual; abstract;
function CreateDesignCopy(RTDataDriver: TCustomSQLDataDriverEh): TCustomSQLDataDriverEh; virtual;
function CreateReader(SQL: String; FParams: TParamsArr): TDataSet; virtual;
function DesignDataBaseConnetionEqual(DataDriver: TCustomSQLDataDriverEh): Boolean; virtual;
function Execute(Command: TCustomSQLCommandEh; var Cursor: TDataSet; var FreeOnEof: Boolean): Integer; overload; virtual;
function Execute(SQLText: String; CommandType: TSQLCommandTypeEh; VarParams: Variant; var Cursor: TDataSet): Integer; overload; virtual;
function GetEngineName: String; virtual;
function GetServerTypeName: String; virtual;
function GetFieldList(const TableName: string; DataSet: TDataSet): Boolean; virtual;
function GetSpecParamsList: String; virtual;
function SupportCustomSQLDataDriver: Boolean; virtual; abstract;
function GetCustomDBService: TCustomDBService; virtual;
function GetIncrementObjectsList: TStrings; virtual;
function GetObjectTreeDataSet: TDataSet; virtual;
function CreateTreeDataSet: TMemTableEh; virtual;
procedure mtDBTreeExpanding(Sender: TObject; RecordNumber: Integer; var AllowExpansion: Boolean);
procedure BuildQueryPlan(PlanTable: TMemTableEh; Command: TCustomSQLCommandEh); virtual;
procedure EditDatabaseParams; virtual;
procedure ResetDesignInfo; virtual;
procedure AssignFromDesignDataDriver(DesignDataDriver, RuntimeDataDriver: TCustomSQLDataDriverEh); virtual;
procedure AssignToDesignDataDriver(DesignDataDriver, RuntimeDataDriver: TCustomSQLDataDriverEh); virtual;
property Connected: Boolean read GetConnected write SetConnected;
end;
TDesignDataBaseClassEh = class of TDesignDataBaseEh;
{ Engines unils }
TAccessEngineEh = class(TObject)
function AccessEngineName: String; virtual; abstract;
function CreateDesignDataBase(DataDriver: TCustomSQLDataDriverEh;
DBServiceClass: TCustomDBServiceClass; DataBaseName: String): TDesignDataBaseEh;
virtual; abstract;
end;
TSQLTreeNodeTemplate = class;
TColumnAtribute = record
FieldName: String;
Title: String;
Width: Integer;
end;
TFieldAtribute = record
FieldName: String;
FieldType: TMTDataFieldEh;
Size: Integer;
end;
TGetTextEvent = function(Sender: TObject): String of object;
TServicePopupParam = record
Text: String;
OnSelect: TNotifyEvent;
OnGetMenuText: TGetTextEvent;
OnGetDataText: TGetTextEvent;
end;
TServicePopupParams = array of TServicePopupParam;
TColumnAttributes = array of TColumnAtribute;
TFieldAtributesEh = array of TFieldAtribute;
// TSQLTreeNode = class(TObject, IInterface, IGetSQLTreeNode)
// TSQLTreeNode = class(TInterfacedObject, IGetSQLTreeNode)
TSQLTreeNode = class(TObject)
private
FOnDragDrop: TDragDropEvent;
function GetSQLTreeNode: TSQLTreeNode;
protected
(*
{$IFNDEF CIL}
{ IInterface }
function QueryInterface(const IID: TGUID; out Obj): HResult; virtual; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
{$ENDIF}
*)
public
FFullName: String;
FImageIndex: Integer;
FMemRec: TMemoryRecordEh;
FName: String;
FNodes: TObjectList;
// FNodes: TInterfaceList;
FNodesLoaded: Boolean;
FNodesSelect: String;
FNodesTemplate: TSQLTreeNodeTemplate;
FObjId: String;
// FParent: IGetSQLTreeNode;
FParent: TSQLTreeNode;
FTable: TMemTableEh;
FTableFields: String;
FTableFilter: String;
FTypeId: String;
FParentRecordToTableMode: Boolean;
PopupParams: TServicePopupParams;
constructor Create;
destructor Destroy; override;
// procedure AddChild(Node: IGetSQLTreeNode);
procedure AddChild(Node: TSQLTreeNode);
function GetTable: TMemTableEh;
property OnDragDrop: TDragDropEvent read FOnDragDrop write FOnDragDrop;
end;
// TSQLTreeNodeManager = class;
TSQLTreeNodeTemplate = class(TObject)
private
FName: String;
FMasterTemplateName: String;
FNodesMemTableName: String;
FParams: TParamsArr;
FNodeManager: TCustomDBService;
FObjIdFieldName: String;
FInTreeTextFieldName: String;
FNodesFilter: String;
// FNodesFieldsInGrid: String;
FNodesSQLClassName: String;
// FFieldAttributes: TFieldAtributesEh;
FColumnAttributes: TColumnAttributes;
FOnNodeDragDrop: TDragDropEvent;
FNodeDropMenuParams: TServicePopupParams;
FTableNodeDropMenuParams: TServicePopupParams;
FHasNodes: Boolean;
FSelectedIndex: Integer;
FAdditionalLoadSQL: String;
FColumnAttributesStr: String;
FAdditionalFielsInfo: String;
procedure SetColumnAttributes(const Value: String);
public
constructor Create(ANodeManager: TCustomDBService;
AName: String
{ ANodesSQLClassName: String;
AMasterTemplateName: String;
ANodesMemTableName: String;
// AParams: TParamsArr;
AParams: array of Variant;
AObjIdFieldName: String;
AInTreeTextFieldName: String;
AHasNodes: Boolean;
ANodesFilter: String;
ANodesFieldsInGrid: String;
AColumnAttributes: String = ''; // FieldName, Caption, Width
AAdditionalLoadSQL: String = '';
AAdditionalFielsInfo: String = '' // FieldName, Type, Width
}
);
destructor Destroy; override;
// function CreateNodes(Parent: TSQLTreeNode): TList; virtual;
// function CreateNode: IGetSQLTreeNode; virtual;
function CreateNode: TSQLTreeNode; virtual;
function DropMenuNodeText(Sender: TObject): String;
function DropMenuNlCommaNodeText(Sender: TObject): String;
function DropMenuSelectAstFromName(Sender: TObject): String;
function DropMenuSelectAllFieldsFromName(Sender: TObject): String;
function DropDataSelectAllFieldsFromName(Sender: TObject): String;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -