比如下面这样:我有几个不同的结构体
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]来代替,这样我就可以用一个过程处理所有的结构体了,但是我弄了很久也没弄明白该怎么做,谁能教教我?
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]来代替,这样我就可以用一个过程处理所有的结构体了,但是我弄了很久也没弄明白该怎么做,谁能教教我?
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;
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域,表示结构体的长度,然后就可以通过指针处理了。例子,休想!
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;
有100多个结构,每个结构有几百条数据,最后全部写到一个数据文件里面去。我现在一个结构一个结构的处理已经写好了,但是觉得重复代码太多了,每一段都只是其中的变量不同而已,所以想有没有办法能把相同的代码用一个过程或者函数进行处理,只是传进去的结构数据不同而已,这样就能极大的简化程序,别人看程序也没那么累^_^!象楼上的那个例子,我是希望能这样:
a[1] := @p1;
a[1]^^.m := ...
或者
a[1]:= p1;
a[1]^.m := ...
之类的形式调用,不过我不知道delphi是不是能这样做,如果能的话又该怎么做?
如果delphi版本不支持泛型,你可以用类替代结构体,用RTTI或者多态来实现。楼上说的就是多态的做法结构体用起来是简单,但是它的缺点就是不够灵活,
怎么取舍就看你自己了
我原来学过一些编程,但是本来就不精,而且很久没编过了,所以等于要从头重新自学一次,到这里来也是想能够有高手帮助给点例子学学,早点把工具弄出来而已。
可惜很遗憾,中国的程序员要么眼光太高,要么鄙帚自珍,所以我决定还是老老实实,一个一个结构的写,反正我也不追求效率,也不赶什么时间,别人能看懂就看,看不懂也不关我的事^_^谢谢zhouzuoji、sdzeng和lake_cx,
特别是lake_cx和sdzeng,虽然你们最后还是没能提供一个能用上的例子,但是起码告诉了我解决问题的方向