⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tvalueobjectlistunit.pas

📁 delphi实现三层erp
💻 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 + -