zoukankan      html  css  js  c++  java
  • Delphi备忘三:TCollection的使用,用Stream保存

    代码
    unit ufrmGetFunctionDefine;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,TypInfo,
      Dialogs,ufrmStockBaseCalc, StdCtrls, ComCtrls,uQEFuncManager,uWnDataSet,uDataService;

    type


      TGettingParamDefine 
    = class(TCollectionItem)
      
    private
        FName:
    string;
        F_Type : DataType;
      
    public
        
    property Name : string read FName write FName;
        
    property _Type : DataType read F_Type write F_Type;
      
    end;

      TGettingParamDefines 
    = class(TCollection)
      
    private
        
    function GetItem(Index: Integer): TGettingParamDefine;
      
    public
        
    function Add: TGettingParamDefine;
        
    function FindByName(AName: string): TGettingParamDefine;
        
    function FindByIndex(AIndex : Integer) : TGettingParamDefine;
        
    property Items[Index: Integer]: TGettingParamDefine read GetItem; default;
      
    end;

      TGettingFunctionDefine 
    = class(TCollectionItem)
      
    private
        FName:
    string;
        FResultType:DataType;
        FParamDefines:TGettingParamDefines;
      
    public
        
    property Name : string read FName write FName;
        
    property ResultType: DataType read FResultType write FResultType;
        
    //函数的参数定义
        
    property ParamDefines: TGettingParamDefines read FParamDefines write FParamDefines;
        
    constructor Create(Collection: TCollection); override;
        
    destructor Destroy; override;
      
    end;

      TGettingFunctionDefines 
    = class(TCollection)
        
    function GetItem(Index: Integer): TGettingFunctionDefine;
      
    public
        
    function Add: TGettingFunctionDefine;
        
    function FindByName(AName: string): TGettingFunctionDefine;
        
    function FindByIndex(AIndex : Integer) : TGettingFunctionDefine;
        
    property Items[Index: Integer]: TGettingFunctionDefine read GetItem; default;
      
    end;


      TfrmGetFunctionDefine 
    = class(TfrmStockBaseCalc)
        edtFunctionList: TMemo;
        tvwFunction: TTreeView;
        btnGet: TButton;
        btnShowFunction: TButton;
        btnSaveStream: TButton;
        dlgSaveFile: TSaveDialog;
        btnLoadStream: TButton;
        dlgOpenFile: TOpenDialog;
        
    procedure btnGetClick(Sender: TObject);
        
    procedure FormCreate(Sender: TObject);
        
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
        
    procedure btnShowFunctionClick(Sender: TObject);
        
    procedure btnSaveStreamClick(Sender: TObject);
        
    procedure btnLoadStreamClick(Sender: TObject);
      
    private
        FQEFunctionManager:TQEFunctionManager;
        FGettingFunctionDefines : TGettingFunctionDefines;
        
    { Private declarations }
      
    public
        
    { Public declarations }
      
    end;

    implementation

    {$R *.dfm}

    procedure TfrmGetFunctionDefine.btnGetClick(Sender: TObject);
    var
        i,j:integer;
        LFunction: TQEFunctionDefine;
        LGettingFunctionDefine:TGettingFunctionDefine;
        LGettingParamDefine:TGettingParamDefine;
    begin
        
    for i:=0 to edtfunctionlist.Lines.Count-1 do
        
    begin
          LFunction :
    = FQEFunctionManager.RootGroup.FindNodeByNotIsLink(edtfunctionlist.Lines[i]) ;
          
    if not assigned(LFunction) then
            showmessage(
    '没有'+ edtfunctionlist.Lines[i])
          
    else
          
    begin
            LGettingFunctionDefine :
    = FGettingFunctionDefines.Add;
            LGettingFunctionDefine.Name :
    = edtfunctionlist.Lines[i];
            LGettingFunctionDefine.ResultType :
    = DataType(CaseFuncTypeToDataType(LFunction.ResultType));
            
    for j:=0 to LFunction.ParamDefines.Count-1 do
            
    begin
              LGettingParamDefine :
    = LGettingFunctionDefine.ParamDefines.Add;
              LGettingParamDefine.Name :
    = LFunction.ParamDefines[j].Name;
              LGettingParamDefine._Type :
    = CaseFuncTypeToDataType(LFunction.ParamDefines[j].ParamType);
            
    end;
          
    end;
        
    end;
    end;

    procedure TfrmGetFunctionDefine.FormClose(Sender: TObject;
      
    var Action: TCloseAction);
    begin
      
    inherited;
      FGettingFunctionDefines.Free;
    end;


    procedure TfrmGetFunctionDefine.FormCreate(Sender: TObject);
    begin
      FQEFunctionManager :
    = CreateFunctionManager;
      FGettingFunctionDefines :
    = TGettingFunctionDefines.Create(TGettingFunctionDefine);
    end;

    procedure TfrmGetFunctionDefine.btnShowFunctionClick(Sender: TObject);
    var
      I,J:integer;
      LTreeNode,LChildTreeNode: TTreeNode;
    begin
       tvwFunction.Items.Clear;
       
    for i:=0 to FGettingFunctionDefines.Count-1 do
       
    begin
         LTreeNode :
    = tvwfunction.Items.Add(nil,FGettingFunctionDefines[i].Name);
         tvwfunction.Items.AddChild(LTreeNode,
    'Result:'+GetEnumName(typeInfo(DataType),ord(FGettingFunctionDefines[i].ResultType)));
         
    for j:=0 to FGettingFunctionDefines[i].ParamDefines.Count-1 do
         
    begin
           LChildTreeNode :
    = tvwfunction.Items.AddChild(LTreeNode,'Param'+inttostr(j)+':'+FGettingFunctionDefines[i].ParamDefines[j].Name);
           tvwfunction.Items.AddChild(LChildTreeNode,GetEnumName(typeInfo(DataType),ord(FGettingFunctionDefines[i].ParamDefines[j]._Type)));
         
    end;
       
    end;
    end;

    procedure TfrmGetFunctionDefine.btnSaveStreamClick(Sender: TObject);
    var
      LFileStream : TFileStream;
      LWriter : TWriter;
      I,J: Integer;
    begin
    //写入流文件
      
    if dlgSaveFile.Execute then
      
    begin
        
    if FileExists(dlgSaveFile.FileName) then
        
    begin
          showmessage(
    '文件已经存在');
          exit;
        
    end;
        LFileStream :
    = TFileStream.Create(dlgSaveFile.FileName,fmCreate);
        
    try
          LWriter :
    = TWriter.Create(LFileStream,4096);
          
    try
            LWriter.WriteListBegin;
            LWriter.WriteInteger(FGettingFunctionDefines.Count);
            
    for i:=0 to FGettingFunctionDefines.Count-1 do
            
    begin
              LWriter.WriteString(FGettingFunctionDefines[i].Name);
              LWriter.WriteInteger(ord(FGettingFunctionDefines[i].ResultType));
              LWriter.WriteInteger(FGettingFunctionDefines[i].ParamDefines.Count);
              
    for j:=0 to FGettingFunctionDefines[i].ParamDefines.Count-1 do
              
    begin
                LWriter.WriteString(FGettingFunctionDefines[i].ParamDefines[j].Name);
                LWriter.WriteInteger(ord(FGettingFunctionDefines[i].ParamDefines[j]._Type));
              
    end;
            
    end;
            LWriter.WriteListEnd;
            LFileStream.Seek(
    0,soFromBeginning);
          
    finally
            LWriter.Free;
          
    end;
          
    //FileWrite(FileHandle,FGettingFunctionDefines,sizeof(FGettingFunctionDefines));
        
    finally
          LFileStream.Free;
        
    end;

      
    end;

    end;

    procedure TfrmGetFunctionDefine.btnLoadStreamClick(Sender: TObject);
    var
      i,j,LType:integer;
      LFunctionCount,LParamCount:integer;
      LGettingFunctionDefine:TGettingFunctionDefine;
      LGettingParamDefine:TGettingParamDefine;
      LFileStream : TFileStream;
      LReader : TReader;
    begin
      
    if dlgOpenFile.Execute then
      
    begin
        
    if not fileexists(dlgOpenFile.FileName) then
        
    begin
          showmessage(
    '文件已经不存在');
          exit;
        
    end;
        LFileStream :
    = TFileStream.Create(dlgOpenFile.FileName,fmOpenRead);
        
    try
          LReader :
    = TReader.Create(LFileStream,4096);
          
    try
            LFileStream.Seek(
    0,soFromBeginning);
            LReader.ReadListBegin;
            LFunctionCount:
    =LReader.ReadInteger;
            
    for i:=0 to LFunctionCount-1 do
            
    begin
              LGettingFunctionDefine :
    = FGettingFunctionDefines.Add;
              LGettingFunctionDefine.Name :
    = LReader.ReadString;
              LGettingFunctionDefine.ResultType :
    = DataType(LReader.ReadInteger);
              LParamCount :
    = LReader.ReadInteger;
              
    for j:=0 to LParamCount-1 do
              
    begin
                LGettingParamDefine :
    = LGettingFunctionDefine.ParamDefines.Add;
                LGettingParamDefine.Name :
    = LReader.ReadString;
                LType :
    = LReader.ReadInteger;
                LGettingParamDefine._Type :
    = DataType(LType);
              
    end;
            
    end;
            LReader.ReadListEnd;
            LFileStream.Seek(
    0,soFromBeginning);
          
    finally
            LReader.Free;
          
    end;
        
    finally
          LFileStream.Free;
        
    end;
      
    end;
    end;

    { TGettingParamDefines }

    function TGettingParamDefines.Add: TGettingParamDefine;
    begin
      Result :
    = TGettingParamDefine(inherited Add);
    end;

    function TGettingParamDefines.FindByIndex(
      AIndex: Integer): TGettingParamDefine;
    begin
      Result :
    = nil;

      
    if (AIndex<0or (AIndex > Count-1then exit;

      result :
    = Self[AIndex];
    end;

    function TGettingParamDefines.FindByName(
      AName: 
    string): TGettingParamDefine;
    var
      I: Integer;
    begin
      Result :
    = nil;
      
    for I := 0 to Count - 1 do
        
    if CompareText(Self[I].Name, AName) = 0 then
        
    begin
          Result :
    = Self[I];
          Break;
        
    end;
    end;

    function TGettingParamDefines.GetItem(Index: Integer): TGettingParamDefine;
    begin
      Result :
    = TGettingParamDefine(inherited GetItem(Index));
    end;

    { TGettingFunctionDefines }

    function TGettingFunctionDefines.Add: TGettingFunctionDefine;
    begin
        Result :
    = TGettingFunctionDefine(inherited Add);
    end;

    function TGettingFunctionDefines.FindByIndex(
      AIndex: Integer): TGettingFunctionDefine;
    begin
      Result :
    = nil;

      
    if (AIndex<0or (AIndex > Count-1then exit;

      result :
    = Self[AIndex];
    end;

    function TGettingFunctionDefines.FindByName(
      AName: 
    string): TGettingFunctionDefine;
    var
      I: Integer;
    begin
      Result :
    = nil;
      
    for I := 0 to Count - 1 do
        
    if CompareText(Self[I].Name, AName) = 0 then
        
    begin
          Result :
    = Self[I];
          Break;
        
    end;
    end;

    function TGettingFunctionDefines.GetItem(
      Index: Integer): TGettingFunctionDefine;
    begin
         Result :
    = TGettingFunctionDefine(inherited GetItem(Index))
    end;

    { TGettingFunctionDefine }

    constructor TGettingFunctionDefine.Create(Collection: TCollection);
    begin
      
    inherited;
      FParamDefines :
    = TGettingParamDefines.Create(TGettingParamDefine);    s
    end;

    destructor TGettingFunctionDefine.Destroy;
    begin
      FParamDefines.Free;
      
    inherited;
    end;

    end.
  • 相关阅读:
    linux addr2line 定位so库崩溃位置
    转:关于Android机型适配这件小事儿
    转:android studio 改编译区背景色
    转:ios review推送与执行
    k2pdfopt下载页
    转:让kindle更好的支持pdf
    转:各种文本格式转换的网站
    转: iOS崩溃堆栈符号表使用与用途
    转: 腾讯Bugly干货分享:Android应用性能评测调优
    转: git的图文使用教程(巨详细)
  • 原文地址:https://www.cnblogs.com/enli/p/1735099.html
Copyright © 2011-2022 走看看