我把Record放到Tstringlist中去,在同一个事件中取出来数据是对的,可到另一个事件中取出来就不对了。原代码如下:
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  DrugTList=^Drug;
  Drug=record
  DrugName: string;//药名
  OperateMark: string;//用法标识,是否需要用法对比
end;type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;
  MyDrugTlist: TStringList;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
  DrugRecord: Drug;
  TempRecord: Drug;
begin
  DrugRecord.DrugName := 'name';
  DrugRecord.OperateMark := '1';
  MyDrugTlist.AddObject('name',Pointer(@DrugRecord));
  TempRecord := drugtlist(MyDrugTlist.Objects[0])^;
  ShowMessage(TempRecord.OperateMark); //可以显示1
end;procedure TForm1.FormShow(Sender: TObject);
begin
  MyDrugTlist := TStringList.Create;
end;procedure TForm1.Button2Click(Sender: TObject);
var
  DrugRecord: Drug;
begin
  DrugRecord := drugtlist(MyDrugTlist.Objects[0])^;
  ShowMessage(DrugRecord.OperateMark); //无显示结果
end;end.请大家多多指教

解决方案 »

  1.   

    DrugRecord是局部变量,当你这个事件运行完之后,它的内存就无效了,下次通过@DrugRecord取出来的结果就错了。你必须为这个记录New一个指针出来,然后记录指针地址才行。最后别忘了释放。
      

  2.   

    delphi结构体是生存期自管理类型 ,分配在栈中,用完后就回收了,只所以你这里没显示,因为超过了其作用域,lz可能对指针的概念还比较模糊。
      

  3.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      DrugRecord: DrugTList;
      TempRecord: Drug;
    begin
      New(DrugRecord);
      DrugRecord^.DrugName := 'name';
      DrugRecord^.OperateMark := '1';
      MyDrugTlist.AddObject('name',Pointer(DrugRecord));
      TempRecord := drugtlist(MyDrugTlist.Objects[0])^;
      ShowMessage(TempRecord.OperateMark); //可以显示1
    end;