📄 udatamodel.pas
字号:
unit UDataModel;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, MidasLib,
MyModel, MyTools, UModel, DB, DBClient;
type
TDataModel = class(TModel, IDataAccess)
ClientDataSet: TClientDataSet;
protected
AutoOpenDataSet: Boolean;
protected
procedure ParseToDataItem(DataItem: IDataItem); virtual; abstract;
function LocateByKey(Key: IKey): Boolean; virtual; abstract;
function NewDataItem: IDataItem; virtual; abstract;
function NewKey(const KeyName: string): IKey;
public
procedure OpenDataSet; virtual;
function IsAutoOpenDataSet: Boolean;
{---------------------------------------- IDataAcdess ----------------------------------------}
public
function GetDataItem(Key: MyTools.IKey): MyTools.IDataItem; virtual;
function GetCount: Word; virtual;
function GetDataSet: TDataSet; virtual;
function GetKey: IKey; virtual;
public
constructor Create(Owner: TComponent); override;
destructor Destroy; override;
procedure Refresh(Parameters: IParameters); override;
end;
implementation
uses
MyException;
{$R *.dfm}
constructor TDataModel.Create(Owner: TComponent);
begin
inherited;
AutoOpenDataSet := False;
end;
destructor TDataModel.Destroy;
begin
ClientDataSet.Close;
inherited;
end;
function TDataModel.GetCount: Word;
begin
if ClientDataSet.Active then
Result := ClientDataSet.RecordCount
else
Result := 0;
end;
function TDataModel.GetDataItem(Key: IKey): MyTools.IDataItem;
begin
Result := nil;
try
if not LocateByKey(Key) then
Exit;
except
on E: Exception do
raise ELocateByPKException.Create(Self.ClassName, E.Message);
end;
try
Result := NewDataItem;
except
on E: Exception do
raise ENewDataItemException.Create(Self.ClassName, E.Message);
end;
try
ParseToDataItem(Result);
except
on E: Exception do
begin
FreeAndNil(Result);
raise EParseToDataItemException.Create(Self.ClassName, E.Message);
end;
end;
end;
function TDataModel.GetDataSet: TDataSet;
begin
Result := ClientDataSet;
end;
function TDataModel.GetKey: IKey;
begin
end;
function TDataModel.IsAutoOpenDataSet: Boolean;
begin
Result := AutoOpenDataSet;
end;
function TDataModel.NewKey(const KeyName: string): IKey;
var
IntegerKey: IIntegerKey;
StringKey: IStringKey;
begin
if not ClientDataSet.Active then
raise ENewKeyException.Create(Self.ClassName, '数据集没有处于活动状态.');
if GetDataSet.FindField(KeyName) = nil then
raise ENewKeyException.Create(Self.ClassName, '没有发现字段''' + KeyName + '''.');
if (GetDataSet.FieldByName(KeyName).DataType = ftString) or
(GetDataSet.FieldByName(KeyName).DataType = ftWideString) then
begin
StringKey := TStringKey.Create;
StringKey.SetKeyName(KeyName);
StringKey.SetKey(GetDataSet.FieldByName(KeyName).AsString);
Result := StringKey;
end
else if (GetDataSet.FieldByName(KeyName).DataType = ftSmallint) or
(GetDataSet.FieldByName(KeyName).DataType = ftInteger) or
(GetDataSet.FieldByName(KeyName).DataType = ftWord) or
(GetDataSet.FieldByName(KeyName).DataType = ftLargeint) or
(GetDataSet.FieldByName(KeyName).DataType = ftFloat) then
begin
IntegerKey := TIntegerKey.Create;
IntegerKey.SetKeyName(KeyName);
IntegerKey.SetKey(GetDataSet.FieldByName(KeyName).AsInteger);
Result := IntegerKey;
end;
end;
procedure TDataModel.OpenDataSet;
begin
ClientDataSet.Open;
end;
procedure TDataModel.Refresh(Parameters: IParameters);
begin
inherited;
ClientDataSet.Refresh;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -