📄 tvalueobjectlistunit.pas
字号:
//------------------------------------------------------------------------------
// VOList值列表组装器
//1.本来只应该VO打交道。
//2.但要在客户端生成TDATASET,所以必须要有数据库字段相应的信息。
// 这些信息打一起打包传给客户端。由他生成TDATASET的基本结构。
//3.TDataSet的引入间接了破坏了封装性。
// (解决办法:在客户端彻底抛弃TDataSet,采用另外控件替代, 后期目标)
//
//------------------------------------------------------------------------------
unit TValueObjectListUnit;
interface
uses
Windows,Classes, SysUtils, Forms, Dialogs, DB, ADODB,
Contnrs, Variants, DBClient, ValueObjectUnit, DynamicDataSetUnit;
type
PTValueObjectList =^ TValueObjectList;
TValueObjectList = Class(TObjectList)
private
//打包传给客户端的相关TDynamicDataSet类信息.
DyDataSet: TDynamicDataSet;
VOClass: TClass; //实际要生成的VO对象.
ValueObject: TValueObject;
//主键生成机制:
maxKey: Integer;
countKey: Integer;
realKey: Integer;
function getVOClass: TClass;
procedure SetVOClass(tmpClass: TClass);
function getMaxKey: Integer;
procedure SetMaxKey(i_max: Integer);
function getCountKey: Integer;
procedure SetCountKey(i_count: Integer);
function getRealKey: Integer;
procedure SetRealKey(i_key: Integer);
function GetParmsCount: integer;
procedure setValueObject(pTmpVO :TValueObject);
function getValueObject: TValueObject;
procedure setDyDataSet(tmpDyDataSet :TDynamicDataSet);
function getDyDataSet: TDynamicDataSet;
procedure SetDataSet(tmpDS: TClientDataSet);
function GetDataSet: TClientDataSet;
function GetOleFields: OleVariant;
procedure SetOleFields(tmpOle: OleVariant);
protected
function GetOLEData: OleVariant; virtual;
procedure SetOLEData(const Value: OleVariant); virtual;
function GetOLEDataList: OleVariant; virtual;
procedure SetOLEDataList(const Value: OleVariant); virtual;
published
property pVOClassName: TClass read getVOClass write setVOClass;
property pMaxKey: Integer read getMaxKey write SetMaxKey;
property pCountKey: Integer read getCountKey write SetCountKey;
property pRealKey: Integer read getRealKey write SetRealKey;
property pDyDataSet: TDynamicDataSet read getDyDataSet write setDyDataSet;
//-- TDynamicDataSet--
property pDataSet: TClientDataSet read GetDataSet write SetDataSet;
property pOleFields: OleVariant read GetOleFields write SetOleFields;
property pParmCount: Integer read GetParmsCount;
//--TClientDataSet--
function GetDSItem(index: integer; tmpDS: TDataSet): TObject; virtual; //--TValueObject--
function AddItem(index: integer; AObject: TObject ):Integer; virtual;
function DelItem(index: integer; AObject: TObject ):Integer; virtual;
function GetItem(index: integer ): TObject; virtual; function CountItem:Integer; virtual; function OLEToDS(tmpOle: OleVariant): TClientDataSet; virtual; //--CreateDS-- procedure prepareTable(tmpDS: TDataSet); virtual; public constructor Create; virtual; destructor Destroy; override; procedure AfterConstruction; override; property POLEData: OleVariant read GetOLEData write SetOLEData;
property POLEDataList: OleVariant read GetOLEDataList write SetOLEDataList;
property PValueObject: TValueObject read getValueObject write setValueObject;
end;
implementation
uses ResourceStrUnit, UserVO;
//----------------------------- TValueObjectList---------------------------------
constructor TValueObjectList.Create;
begin
inherited Create;
end;
function TValueObjectList.getVOClass: TClass;
begin
Result := VOClass;
end;
procedure TValueObjectList.SetVOClass(tmpClass: TClass);
begin
VOClass := tmpClass;
end;
function TValueObjectList.getMaxKey: Integer;
begin
Result := maxKey;
end;
procedure TValueObjectList.SetMaxKey(i_max: Integer);
begin
maxKey := i_max;
end;
function TValueObjectList.getCountKey: Integer;
begin
Result :=countKey
end;
procedure TValueObjectList.SetCountKey(i_count: Integer);
begin
countKey := i_count;
end;
function TValueObjectList.getRealKey: Integer;
begin
Result := realKey;
end;
procedure TValueObjectList.SetRealKey(i_Key: Integer);
begin
realKey := i_Key;
end;
procedure TValueObjectList.SetDataSet(tmpDS: TClientDataSet);
begin
pDyDataSet.DataSet := tmpDS;
end;
function TValueObjectList.GetDataSet: TClientDataSet;
begin
Result := pDyDataSet.DataSet;
end;
procedure TValueObjectList.SetOleFields(tmpOle: OleVariant);
begin
pDyDataSet.OleFields := tmpOle;
end;
function TValueObjectList.GetOleFields: OleVariant;
begin
Result := pDyDataSet.OleFields;
end;
function TValueObjectList.GetParmsCount: Integer;
begin
Result := VarArrayHighBound(pDyDataSet.OleFields[0], 1);
end;
procedure TValueObjectList.setValueObject(pTmpVO :TValueObject);
begin
ValueObject := pTmpVO;
end;
function TValueObjectList.getValueObject: TValueObject;
begin
Result := ValueObject;
end;
procedure TValueObjectList.setDyDataSet(tmpDyDataSet :TDynamicDataSet);
begin
DyDataSet := tmpDyDataSet;
end;
function TValueObjectList.getDyDataSet: TDynamicDataSet;
begin
Result := DyDataSet;
end;
procedure TValueObjectList.prepareTable(tmpDS: TDataSet);
begin
pDyDataSet.prepareTable(tmpDS);
end;
procedure TValueObjectList.AfterConstruction;
begin
inherited;
maxKey := 0;
countKey := 0;
DyDataSet := TDynamicDataSet.Create;
end;
destructor TValueObjectList.Destroy;
begin
inherited;
end;
procedure TValueObjectList.SetOLEData(const Value: OleVariant);
var
i_i: integer;begin if not VarIsArray(Value) then Exit; Clear; for i_i:=0 to VarArrayHighBound(Value,1) do begin if assigned(pVOClassName) then ValueObject := TValueObject(pVOClassName.Create) else ValueObject := TValueObject.Create; ValueObject.POLEData := Value[i_i]; Add(ValueObject); end;
end;
procedure TValueObjectList.SetOLEDataList(const Value: OleVariant);
begin
if VarArrayHighBound(Value,1)>0 then
begin
pDyDataSet.OleFields := Value[0];
SetOLEData(Value[1]);
end
else
MessageBox(Application.Handle, PChar(GloRs_Title), PChar(GloRs_DSPackisErr),MB_ICONINFORMATION);
end;
function TValueObjectList.GetOLEData: OleVariant;
var
i_i, i_iCount: Integer;
s: string;
i: integer;
b: boolean;
begin
if Count=0 then begin TVarData(Result).VType := varEmpty; Exit; end; i_iCount := Count; Result := VarArrayCreate([0, i_iCount-1], varVariant); for i_i:=0 to i_iCount-1 do begin ValueObject := TValueObject(Items[i_i]); Result[i_i] := ValueObject.POLEData; end;
end;
function TValueObjectList.GetOLEDataList: OleVariant;
var
tmpOle: OleVariant;
begin
tmpOle := VarArrayCreate([0, 1], varVariant);
tmpOle[0] := pDyDataSet.OleFields;
tmpOle[1] := GetOLEData;
Result := tmpOle;
end;
//--TClientDataSet--
function TValueObjectList.GetDSItem(index: integer; tmpDS: TDataSet): TObject;
var
i_i: Integer;
tmpOle: OleVariant;
begin
if assigned(pVOClassName) then
ValueObject := TValueObject(pVOClassName.Create) else ValueObject := TValueObject.Create;
tmpOle := VarArrayCreate([0, tmpDS.FieldCount-1], varVariant);
for i_i:=0 to tmpDS.FieldCount-1 do
begin
tmpOle[i_i] := tmpDS.Fields[i_i].Value;
end;
ValueObject.POLEData := tmpOle;
Result := ValueObject;
end;
//--TValueObject--
function TValueObjectList.AddItem(index: integer; AObject: TObject ):Integer;
begin Result := Add(AObject);end;
function TValueObjectList.DelItem(index: integer; AObject: TObject ):Integer;
begin
Result := Remove(AObject);
end;
function TValueObjectList.GetItem(index: integer ): TObject;
begin Result := nil; if (index>=Count) or (index<0) then exit; ValueObject := TValueObject(Items[Index]); Result := Items[index];end;
function TValueObjectList.CountItem: Integer;
begin
Result := Count;
end;
function TValueObjectList.OLEToDS(tmpOle: OleVariant): TClientDataSet;
var
i_i, i_j, i_k: Integer;
oFields: OleVariant; //拆分成字段Olevariant;
oValues: OleVariant; //拆分值Olevariant;
oValue: OleVariant; //第N个VO值olevariant;
oFlag: OleVariant; //值1标志olevariant;
oRealVO: OleVariant; //值2真正使用的Olevariant;
oTmp: OleVariant;
oo, oo2: OleVariant;
begin
if VarArrayHighBound(tmpOle,1)>0 then
begin
oFields := tmpOle[0];
oValues := tmpOle[1];
end
else
begin
MessageBox(Application.Handle, PChar(GloRs_Title), PChar(GloRs_DSPackisErr),MB_ICONINFORMATION);
Result := nil;
Exit;
end;
if VarArrayHighBound(oFields,1)=2 then
begin
with DyDataSet do
begin
OleFldName := oFields[0];
OleFldType := oFields[1];
OleFldSize := oFields[2];
end;
end
else
begin
Result := nil;
Exit;
end;
if pDyDataSet.DataSet.Active then
pDyDataSet.DataSet.Close;
pDyDataSet.DataSet.FieldDefs.Clear;
for i_i:=0 to VarArrayHighBound(pDyDataSet.OleFldName,1) do
begin
with pDyDataSet.DataSet.FieldDefs.AddFieldDef do
begin
Name := String(pDyDataSet.OleFldName[i_i]);
DataType := TDataType(pDyDataSet.OleFldType[i_i]);
Size := pDyDataSet.OleFldSize[i_i];
end;
end;
pDyDataSet.DataSet.CreateDataSet;
pDyDataSet.DataSet.Open;
if not VarIsArray(oValues) then
begin
Result := nil;
Exit;
end;
for i_i:=0 to VarArrayHighBound(oValues,1) do
begin
oValue := oValues[i_i];
if VarArrayHighBound(oValue,1)>0 then
begin
oFlag := oValue[0];
oRealVO := oValue[1];
pDyDataSet.DataSet.Append;
for i_j:=0 to VarArrayHighBound(oRealVO,1) do
pDyDataSet.DataSet.Fields[i_j].Value := oRealVO[i_j];
pDyDataSet.DataSet.Post;
end
else
exit; //打包错误。
end;
Result := pDyDataSet.DataSet;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -