好象那个TEMP要做全局变量才行

解决方案 »

  1.   

    我改了以下你的程序,稍稍改了以下,呵呵unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type  MyRec = Record                //声明一个记录类型
        S1 : PChar;
        S2 : PChar;
      end;
      PMyRec = ^MyRec;             //声明一个指向记录类型的指针  ArrayInt = array [0..1] of integer; //声明一个整数数组
      PInt = ^ArrayInt;                   //声明一个指向数组的指针  TForm1 = class(TForm)
        Button1: TButton;
        Label1: TLabel;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
        function SetRecValue : PMyRec;  //函数返回一个记录类型的指针
        procedure GetRecValue;          //通过SetRecValue返回的指针获取记录各域的值    function SetIntArrayValue : PInt; //函数返回一个静态数组的指针
        procedure GetIntArrayValue;       //通过调用SetIntArrayValue返回数组的各元素值.
      public
        { Public declarations }
            
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.GetIntArrayValue;
    var
      b : ArrayInt;
    begin
      b := SetIntArrayValue^;
      Label1.Caption := IntToStr(b[1])+ '      ' + IntToStr(b[0]);
    end;function TForm1.SetIntArrayValue: PInt;
    var
      a : ArrayInt;
    begin
      a[0] := 111;
      a[1] := 234;
      Result := @a;
    end;procedure TForm1.GetRecValue;
    var
      Temp : MyRec;
    begin
      Caption := 'asdfasdf';
      Temp := SetRecValue^;     //获取函数返回值的内容.
      Label1.Caption := StrPas(Temp.S1) + StrPas(Temp.S2);
    end;function TForm1.SetRecValue: PMyRec;
    var
      Temp : MyRec;
    begin
      Temp.S1 := 'I am testing ';
      Temp.S2 := 'the pointer!';
      Result := @Temp;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      GetRecValue;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      GetIntArrayValue;
    end;end.
      

  2.   

    呵呵,很简单。String虽然也是数组但是他的下标是1
    请把声明换了吧
      MyRec = Record                //声明一个记录类型
            S1 : array [0..200] of char;
            S2 : array [0..200] of char;
    别的地方不用动
      

  3.   

    这是变量的生存期问题,你只要将TEMP的作用域扩大一点,在如定义在implementation的前后就可以了,还有就是可以用数组,
      

  4.   

    在function TForm1.SetRecValue: PMyRec;
    var
      Temp : MyRec;
    begin
      Temp.S1 := 'I am testing ';
      Temp.S2 := 'the pointer!';
      Result := @Temp;
    end;这个函数中,你的 Temp 是局部变量,该函数执行完毕以后,Temp 会被释放掉,这样你在函数procedure TForm1.GetRecValue;
    var
            Temp : MyRec;
    begin        Temp := SetRecValue^;     //获取函数返回值的内容.
            Label1.Caption := Temp.S1 + Temp.S2;
    end;中的 Temp := SetRecValue^; 就变得无效了,此时Temp 的两个结构体 S1 和 S2已经被释放掉了。解决办法:1. 定义 Temp : MyRec; 为全局变量2. 让编译器不释放 Temp,即定义一个指针:Temp: PMyRec,然后用 New 分配,这时只要你不用 Dispose ,那么编译器就不会自动释放
      

  5.   

    用PChar吧,他就是字符指针,他根据字符串来分配空间,不会造成浪费^_^
      

  6.   

    问题在于此时记录中的string是AnsiString,是生存期自管理类型,其内存动态分布且有自动收功能。当出了过程的作用域后其不存于内存中间。而Integer则不一样,数组所提地址及是所赋数值,因而可以显示出来,而记录中的不能显示出来。