记录类型指针

以下例子利用记录类型指针实现:

获取窗体所有按钮的名字和对应的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 (Self.Components[i]is TButton) then
    begin
      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 p1<>nil do
  begin
    p2:=p1;
    ShowMessageFmt('按鈕名:%s,id值:%d',[p2.mybutt.Name,p2.id]);
    p1:=p2.next;
  end;
  Dispose(currnode); 
end;

end.

 

 

 

 

posted @ 2021-05-24 16:45  枭二熊  阅读(56)  评论(0编辑  收藏  举报