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

📄 tvalueobjectlistunit.pas

📁 Delphi最新三层源码(1.0),对delphi有帮助
💻 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 + -