"
以下例子利用记录类型指针实现:
//代码效果参考: https://v.youku.com/v_show/id_XNjQwNjYwNzMzMg==.html获取窗体所有按钮的名字和对应的id值。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
pmyrec=^Tmyrec;//記錄類型指針要定義在對應的記錄類型之前。
Tmyrec=record
id:Integer;
mybutt:TButton;
pior:pmyrec;
next:pmyrec;
end;
//pmyrec=^Tmyrec;//記錄類型指針定義在對應的記錄類型之後會報錯:Identifier redeclared: 'pmyrec'
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
private
firstnode:pmyrec;//記錄類型指針pmyrec定義在前面這裡才能引用(故將其定義在type之後是有原因滴~)。
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
currnode,trannode,p1,p2:pmyrec;
i,j:Integer;
begin
trannode:=nil;
j:=0;
for i:=0 to Self.ComponentCount-1 do
begin
if //代码效果参考:https://v.youku.com/v_show/id_XNjQwMDE1ODkxMg==.html
(Self.Components【i】is TButton) thenbegin
inc(j);
currnode:=new(pmyrec);
currnode^.id:=j;//對於記錄類型指針,這裡有無尖角符都可以。
currnode.mybutt:=Self.components【i】as TButton;
currnode.pior:=nil;//此句在當次的循環就用到了,將下面的currnode.pior初始化為nil。
currnode.next:=nil;//此句在下次的循環才用到,將trannode.next初始化為nil。
if trannode=nil then
firstnode:=currnode
else
trannode.next:=currnode;//‘上一個地址’的下一個指向地址是‘當前地址’!
currnode.pior:=trannode;//‘當前地址’的前一個指向地址是‘上一個地址’!
trannode:=currnode;//把‘當前地址’賦給‘上一個地址’變量,留待下一次循環賦值。
end;
end;
p1:=firstnode;
while p1nil do
begin
p2:=p1;
ShowMessageFmt('按鈕名:%s,id值:%d',【p2.mybutt.Name,p2.id】);
p1:=p2.next;
end;
Dispose(currnode);
end;
end.
"