📄 tvalueobjectlistunit.pas
字号:
//------------------------------------------------------------------------------
// VOList值列表组装器基类
//1.只和VO打交道,与VO来源无关(数据库,EXCEL,XML等,不关心底层)。
//2.提供VO的基本操纵方法(新增,删除,获取, 更新, 导航功能)。
//3.提供了TVOList<->OleVariant的互换功能。
//4.VOList的派生类应能获取多种数据源(File, XML,内存流等)。
//------------------------------------------------------------------------------
unit TValueObjectListUnit;
interface
uses
Windows,Classes, SysUtils, Forms, Dialogs, DB, ADODB,
Contnrs, Variants, DBClient, ValueObjectUnit;
type
PTValueObjectList =^ TValueObjectList;
TValueObjectList = Class(TObjectList)
private
sVOClass: String; //实际要生成的VO对象.
ValueObject: TValueObject;
PIndex: Integer;
function getVOClass: String;
procedure SetVOClass(sTmpClass: String);
procedure setValueObject(pTmpVO :TValueObject);
function getValueObject: TValueObject;
protected
function GetOLEData: OleVariant; virtual;
procedure SetOLEData(const Value: OleVariant); virtual;
function GetVO: TValueObject; overload;
function GetVO(index: Integer): TValueObject; overload;
published
property pVOClass: String read getVOClass write setVOClass;
//--TValueObject--
function FindVO(AObject: TValueObject ):Integer; virtual;
function SetVo(AObject: TValueObject ):Integer; virtual;
function NewVO: TValueObject; virtual;
function AddVO(AObject: TValueObject ):Integer; virtual;
function DelVO(index: integer; AObject: TValueObject ):Integer; virtual;
function FirstVO: TValueObject; virtual;
function PriorVO: TValueObject; virtual; function NextVO: TValueObject; virtual; function EndVO: TValueObject; virtual; function CountVO:Integer; virtual; public constructor Create; destructor Destroy; override; procedure AfterConstruction; override; property POLEData: OleVariant read GetOLEData write SetOLEData;
property PValueObject: TValueObject read getValueObject write setValueObject;
end;
implementation
//----------------------------- TValueObjectList---------------------------------
constructor TValueObjectList.Create;
begin
inherited Create;
PIndex := 0;
end;
function TValueObjectList.getVOClass: String;
begin
Result := sVOClass;
end;
procedure TValueObjectList.SetVOClass(sTmpClass: String);
begin
sVOClass := sTmpClass;
end;
procedure TValueObjectList.setValueObject(pTmpVO :TValueObject);
begin
ValueObject := pTmpVO;
end;
function TValueObjectList.getValueObject: TValueObject;
begin
Result := ValueObject;
end;
procedure TValueObjectList.AfterConstruction;
begin
inherited;
end;
destructor TValueObjectList.Destroy;
begin
inherited;
end;
procedure TValueObjectList.SetOLEData(const Value: OleVariant);
var
i_i: integer; tmpPer: TPersistent;begin if not VarIsArray(Value) then Exit; Clear; for i_i:=0 to VarArrayHighBound(Value,1) do begin ValueObject := NewVO; ValueObject.POLEData := Value[i_i]; Add(ValueObject); end;
end;
function TValueObjectList.GetOLEData: OleVariant;
var
i_i, i_iCount: Integer;
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;
//--TValueObject--
function TValueObjectList.NewVO: TValueObject;
var
tmpPer: TPersistent;
begin if FindClass(pVOClass) <> nil then begin
tmpPer := TPersistentClass(FindClass(pVOClass)).Create;
Result := TValueObject(tmpPer);
end
else
Result := TValueObject.Create;end;
function TValueObjectList.AddVO(AObject: TValueObject ):Integer;
begin Result := Add(AObject);end;
function TValueObjectList.FindVO(AObject: TValueObject ):Integer;
var
i_i: Integer;
tmpVO: TValueObject;
b_flag: Boolean;
begin
b_flag := false;
for i_i :=0 to CountVO-1 do
begin
tmpVO := GetVO(i_i);
if tmpVO.pPrimarykey= AObject.pPrimarykey then
begin
b_flag := true;
break;
end;
end;
if b_flag then
Result := i_i
else
Result := -1;
end;
function TValueObjectList.GetVO: TValueObject;
begin ValueObject := TValueObject(Items[PIndex]); Result := TValueObject(Items[PIndex]);end;
function TValueObjectList.SetVo(AObject: TValueObject ):Integer;
var
i_rtn: Integer;
tmpVO: TValueObject;
begin
i_rtn := FindVO(AObject);
if i_rtn<>-1 then
begin
tmpVO := GetVO(i_rtn);
tmpVO := AObject;
Result := 1;
end
else
Result := -1;
end;
function TValueObjectList.DelVO(index: integer; AObject: TValueObject ):Integer;
var
tmpVO: TValueObject;
i_rtn: Integer;
begin
i_rtn := FindVO(AObject);
if i_rtn<>-1 then
begin
tmpVO := getVO(i_rtn);
Result := Remove(tmpVO);
end
else
Result := -1;
end;
function TValueObjectList.GetVO(index: Integer): TValueObject;
begin
if (index>=0) and (index<CountVO) then
Result := TValueObject(Items[index]);
end;
function TValueObjectList.FirstVO: TValueObject;
begin
Result := GetVO(0);
PIndex := 0;
end;
function TValueObjectList.PriorVO: TValueObject;begin Dec(PIndex); Result := TValueObject(Items[PIndex]);end;function TValueObjectList.NextVO: TValueObject;begin Inc(PIndex); Result := TValueObject(Items[PIndex]);end;
function TValueObjectList.EndVO: TValueObject;
begin
Result := GetVO(CountVO-1);
PIndex := CountVO-1;
end;
function TValueObjectList.CountVO: Integer;
begin
Result := Count;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -