比如下面这样:我有几个不同的结构体
type
 ts1_Info = packed record               //1类结构体
    a1:Integer;
    a2:Array[0..31] of WideChar;
    a9:Integer;
    a10_1:Single;
    a10_2:Integer;
    a11_1:Single;
    a11_2:Integer;
    a12:Integer;
  end;
  Pts1_Info = ^ts1_Info;  ts2_Info = packed record           //2类结构体
    a1:Integer;
    a2:Array[0..31] of WideChar;
  end;
  Pts2_Info = ^ts2_Info;var
  Pts1:Pts1_Info;
  Pts2:Pts2_Info;
现在我希望能用Pts[1]、Pts[2]来代替,这样我就可以用一个过程处理所有的结构体了,但是我弄了很久也没弄明白该怎么做,谁能教教我?

解决方案 »

  1.   

    用指针数组或者变体数组,读取时逐个进行类型转换用TList保存对象会更简单一些
      

  2.   

    我接触Pascal时间不长,能不能用实例来说明一下该怎么做?unit main;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ToolWin, ComCtrls, Tabs,  Math;type
      TForm1 = class(TForm)
        StatusBar1: TStatusBar;
        GroupBox1: TGroupBox;
        PageControl1: TPageControl;
        tsaddred: TEdit;procedure Readts(tsPage:Integer;  ts_addr:Integer);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     ts1_Info = packed record               //1类结构体
        a1:Integer;
        a2:Array[0..31] of WideChar;
        a9:Integer;{    a10_1:Single;
        a10_2:Integer;
        a11_1:Single;
        a11_2:Integer;
    }
        a10:Integer;
        a11:Integer;
        a12:Integer;
      end;
      Pts1_Info = ^ts1_Info;  ts2_Info = packed record           //2类结构体
        a1:Integer;
        a2:Array[0..31] of WideChar;
      end;
      Pts2_Info = ^ts2_Info;
    var
      Form1: TForm1;
      MyStream:TFileStream; 
      FileVer1:Integer; 
      FileVer2:Single;
      TempText:Array[0..127] of Char;  tsaddr:Array[0..50] of Integer;
      tsList:Array[0..50] of TList;
      tsinfosize:array[0..50] of Integer;
      Pts:Array[0..50] of Pointer;
      Pts1:Pts1_Info;
      Pts2:Pts2_Info;
    implementation{$R *.dfm}
    procedure TForm1.ts1_g3_button1Click(Sender: TObject);
    begin
      if not FileExists(ExtractFilePath(Application.ExeName) + '.\elements.data') then
      begin
        Application.Terminate;
        Exit;
      end;
      try
        MyStream := TFileStream.Create('.\elements.data', fmOpenRead);
        MyStream.Read(FileVer1,4);
        MyStream.Read(FileVer2,4);
        tsaddr[1] := MyStream.Position;
        Readts(1,tsaddr[1]);
        lvShowData;
      finally
        MyStream.Free;
      end;
    end;procedure TForm1.Readts(tsPage:Integer;  ts_addr:Integer);  //读取数据
    var
      i:Integer;
      count:Integer;begin{这里有没有办法把后面的ts1_Info改成ts[tsPage]_Info之类的形式?}
      tsinfosize[1] := sizeof(ts1_Info);  tsList[tsPage] := TList.Create;
      MyStream.Position := ts_addr;
      MyStream.Read(count,4);
      for i := 0 to count-1 do
      begin
        new(Pts1);
        MyStream.Read(Pts1^,tsinfosize[1]);        {这里怎么才能用Pts[tsPage]代替Pts1?}
        tsList[tsPage].Add(Pts1);
      end;
    end;
      

  3.   

    这问题是很难?还是delphi没办法做到?有没有高手来指点一下?
      

  4.   

    这么乱的代码谁愿意看。
    type
     ts1_Info = packed record //1类结构体
        cbSize:Cardinal;
        a1:Integer;
        a2:Array[0..31] of WideChar;
        a9:Integer;
        a10_1:Single;
        a10_2:Integer;
        a11_1:Single;
        a11_2:Integer;
        a12:Integer;
      end;
      Pts1_Info = ^ts1_Info;  ts2_Info = packed record           //2类结构体
        cbSize:Cardinal;
        a1:Integer;
        a2:Array[0..31] of WideChar;
      end;
      Pts2_Info = ^ts2_Info;var
      Pts1:Pts1_Info;
      Pts2:Pts2_Info; 结构体前面加个cbSize域,表示结构体的长度,然后就可以通过指针处理了。例子,休想!
      

  5.   

    type
      str1 = record
        m : Integer;
      end;
      pstr1 = ^str1;  str2 = record
        m : Integer;
      end;
      pstr2 = ^str2;  str3 = record
        m : Integer;
      end;
      pstr3 = ^str3;var
      p1 : pstr1;
      p2 : pstr2;
      p3 : pstr3;  a : array [0..2] of Pointer;
      p : Pointer;
      lst : TList;
    begin
      GetMem(p1,SizeOf(str1));
      GetMem(p2,SizeOf(str2));
      GetMem(p3,SizeOf(str3));
      try
        //指针数组    a[0] := p1;
        a[1] := p2;
        a[2] := p3;    p := a[0];
        pstr1(p)^.m := 0;    p := a[1];
        pstr2(p)^.m := 1;    p := a[2];
        pstr3(p)^.m := 2;    //TList
        lst := TList.Create;
        try
          lst.Add(p1);
          lst.Add(p2);
          lst.Add(p3);      p := lst[0];
          pstr1(p)^.m := 0;      p := lst[1];
          pstr2(p)^.m := 1;      p := lst[2];
          pstr3(p)^.m := 2;    finally
          lst.Free;
        end;  finally
        FreeMem(p1);
        FreeMem(p2);
        FreeMem(p3);
      end;
    end;
      

  6.   

    复杂……而且没达到我的目的:(我现在的情况是这样的:
    有100多个结构,每个结构有几百条数据,最后全部写到一个数据文件里面去。我现在一个结构一个结构的处理已经写好了,但是觉得重复代码太多了,每一段都只是其中的变量不同而已,所以想有没有办法能把相同的代码用一个过程或者函数进行处理,只是传进去的结构数据不同而已,这样就能极大的简化程序,别人看程序也没那么累^_^!象楼上的那个例子,我是希望能这样:
    a[1] := @p1;
    a[1]^^.m := ...
    或者
    a[1]:= p1;
    a[1]^.m := ...
    之类的形式调用,不过我不知道delphi是不是能这样做,如果能的话又该怎么做?
      

  7.   

    你应该定义为类,同时做一个基类,基类定义虚方法SaveToStream、LoadFromStream,然后这些类(结构体)都重载这些方法,你把你那些处理结构的代码放到这个之中,然后一百多个对象都放到List里面,保存时就只要取出来,转为基类的类型,调用SaveToStream就行了。
      

  8.   

    如果你觉得第一个结构与第二个结构有重复的,你可以让第一个结构继承至第二个结构,并在SaveToStream的时候先调用基类的SaveToStream就行了,这可以尽量复用代码
      

  9.   

    delphi是强类型检测的,编译器本身就限制了这种不同类型间的转换和操作要想实现你的需求,标准的办法是用泛型,要求你的delphi版本要支持
    如果delphi版本不支持泛型,你可以用类替代结构体,用RTTI或者多态来实现。楼上说的就是多态的做法结构体用起来是简单,但是它的缺点就是不够灵活,
    怎么取舍就看你自己了
      

  10.   

    多态太复杂了,我不是专业的程序员,只是工作中有个数据文件没工具修改,想自己编个小程序来用用。
    我原来学过一些编程,但是本来就不精,而且很久没编过了,所以等于要从头重新自学一次,到这里来也是想能够有高手帮助给点例子学学,早点把工具弄出来而已。
    可惜很遗憾,中国的程序员要么眼光太高,要么鄙帚自珍,所以我决定还是老老实实,一个一个结构的写,反正我也不追求效率,也不赶什么时间,别人能看懂就看,看不懂也不关我的事^_^谢谢zhouzuoji、sdzeng和lake_cx,
    特别是lake_cx和sdzeng,虽然你们最后还是没能提供一个能用上的例子,但是起码告诉了我解决问题的方向