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.
  • 相关阅读:
    Luogu 1080 【NOIP2012】国王游戏 (贪心,高精度)
    Luogu 1314 【NOIP2011】聪明的质检员 (二分)
    Luogu 1315 【NOIP2011】观光公交 (贪心)
    Luogu 1312 【NOIP2011】玛雅游戏 (搜索)
    Luogu 1525 【NOIP2010】关押罪犯 (贪心,并查集)
    Luogu 1514 引水入城 (搜索,动态规划)
    UVA 1394 And Then There Was One / Gym 101415A And Then There Was One / UVAlive 3882 And Then There Was One / POJ 3517 And Then There Was One / Aizu 1275 And Then There Was One (动态规划,思维题)
    Luogu 1437 [HNOI2004]敲砖块 (动态规划)
    Luogu 1941 【NOIP2014】飞扬的小鸟 (动态规划)
    HDU 1176 免费馅饼 (动态规划)
  • 原文地址:https://www.cnblogs.com/enli/p/1735099.html
Copyright © 2011-2022 走看看