如何使用指向动态记录(record)数组的指针 (300分)(300分)

  • 主题发起人 主题发起人 DickWu
  • 开始时间 开始时间
D

DickWu

Unregistered / Unconfirmed
GUEST, unregistred user!
如何定义一个指向自定义record的动态数组的指针?
我在程序中针对数据库的记录定义了一个Record,
想在程序中根据数据库的记录数动态的生成一个record数组,
并通过一个指针来存取该record数组,
可是不知道怎么做 :(
哪位大侠可以指点一下,最好给个原代码示例
 
type
ttest:record
......
end;

var
tarr:array of ttest;
p:^ttest;

然后象这样:
SetLength(tarr,10);
p:=@tarr[0];
就行了。

 
<pre><pre class="text">
unit Unit1;
interface
uses
Windows, Classes, Forms, Dialogs, Db, DBTables, Controls,
StdCtrls ;
type
TForm1 = class(TForm)
Button1: TButton;
Table1: TTable;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
type TableRecord = record
CustNo:integer;
Company:String;
Addr1:string;
Addr2:String;
City:String;
end;
var Customer:array of TableRecord;
begin
table1.DatabaseName:='DBDEMOS';
table1.tablename:='customer.db';
table1.DisableControls;
table1.open;
SetLength(Customer, table1.RecordCount);
while not table1.eofdo
begin
Customer[table1.recno-1].CustNo:=table1.fieldbyname('custno')
.AsInteger;
Customer[table1.recno-1].Company:=table1.fieldbyname('Company
').AsString;
Customer[table1.recno-1].Addr1:=table1.fieldbyname('Addr1').A
sString;
Customer[table1.recno-1].Addr2:=table1.fieldbyname('Addr2').A
sString;
Customer[table1.recno-1].City:=table1.fieldbyname('City').AsS
tring;
table1.next;
end;
table1.Close;
showmessage(customer[1].City);//返回第二记录的城市名称
end;

end.
</font></pre>
 
在D4,D5可用上面的方法。
若在D1-D3下,它们不支持动态数组,
可用下面的方法生成动态数组:
type
RecordArray=array[0..1] of Record;
//下标从0开始
PRecordArray=^RecordArray;
var
Arr:PRecordArray;
begin
GetMem(Arr, RecordNum*Sizeof(RecordArray));//申请内存
for i:=0 to RecordNum-1do

begin
Arr^....=Table1['..'].as...;
..........
end;
end;

 
是指向"自定义record的动态数组" 的指针,
还是"指向自定义record"的指针的动态数组???
这是两个概念。
前者是amo的方法. 那个指针是指向一块内存, 内存的内容是一个record数
组(连续存放的具体record记录).
后者可不是喽. 是一个指针, 指针指向一块内存, 内存内容是一个指针数组
(连续存放的Pointer变量), 每个数组项指向一块独立的内存, 那块内存中才
存放record的具体记录.
 
我之所以用指针来操作动态数组,因为按照下面的程序一直出错,不能编译.
type
Tmyrecord=record
a: integer;
b: byte;
c: string;
end;
Trecordarray=array of Tmyrecord;
var
recordarray : Trecordarray;
myrecord : Tmyrecord;
begin
myrecord.a := 1 ;
..............
setlength(recordarray,length(recordarray)+1);
move(@myrecord,@recordarray[high(recordarray)]),sizeof(TmyRecord));
end;
在编译的时候一直出错:
出错信息如下:(光标指在move的前两个参数后)
Variable required
Constant object cannot be passed as var parameter
我的这个例程是照搬前面的帖子,不知道为什么不能通过.
所以我想改用指针来操作. 哪位能帮我看一下为什么?
前面的指针操作已经试了,可以用, 分我就先给各位加了 :)
 
仔细看看Another_eYes说的,
试试下面的例子。
procedure TForm1.Button1Click(Sender: TObject);
var
recordarray : Trecordarray;
myrecord : Tmyrecord;
begin
setlength(recordarray,10);
recordarray[0].a:=1;
move(recordarray[0],myrecord,sizeof(TmyRecord));
showmessage(inttostr(myrecord.a));
myrecord.a:=2;
move(myrecord,recordarray[0],sizeof(TmyRecord));
showmessage(inttostr(recordarray[0].a));
end;
 
你得先给动态数组分配内存,setlength(recordarray,10);
 
@只是对简单变量取地址. 比如integer, char...
复杂变量如record直接用变量名就可以了, 如果一定要用@, 得用
@(record.firstfield) (record中第一个简单变量的地址).
 
type
Tmyrecord=record
a: integer;
b: byte;
c: string;
end;

var
recordarray : array of Tmyrecord;
myrecord : Tmyrecord;
begin
myrecord:=new(tmyrecord);
myrecord.a := 1 ;
..............
setlength(recordarray,length(recordarray)+1);
move(myrecord,recordarray[high(recordarray)]),sizeof(TmyRecord));
end;
 
多人接受答案了。
 
后退
顶部