procedure TForm1.FormCreate(Sender: TObject);
var
    str:string;
    mapList: TStringList;
begin
mapList := TStringList.Create;
mapList.Values['name'] := '小李';
str:=mapList.Values['name'];
Button1.Tag := Integer(str);
end;procedure TForm1.Button1Click(Sender: TObject);
var
    str: string;
begin
    str := string(Button1.Tag);//这边出错了 
    ShowMessage(str);
end;

解决方案 »

  1.   

    Button1.Tag:=Integer(Str);不能和Str:=String(Button1.Tag);转换。
    Integer(Str)并不是说把Str“强制转化成”Integer,而是说取Str的地址;但是Str是一个局部变量,他所在的过程结束后便被释放,因此再用String(Button1.Tag)想转化时就非法了,因此不能这么操作。
    最好是用一个字符串数组来保存每个Button所对应的的字符串值。
      

  2.   

      楼上正解! str 属于局部变量,过程结束也就被释放了。 
      

  3.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
        str: string;
    begin
        //str := string(Button1.Tag);//这边出错了 ,改成:
        str := IntToStr(Button1.Tag);
        ShowMessage(str);
    end;
      

  4.   

    注意,楼主用的是
    mapList.Values['name'] := '小李';
    str:=mapList.Values['name'];
    也就是说Str里存的不是数字,不能用IntToStr();
      

  5.   

    要想这么干, 就得有全局变量支持unit Unit11;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm11 = class(TForm)
        btn1: TButton;
        btn2: TButton;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure btn1Click(Sender: TObject);
        procedure btn2Click(Sender: TObject);
      private
        { Private declarations }
        mapList: TStringList;
      public
        { Public declarations }
      end;var
      Form11: TForm11;implementation{$R *.dfm}procedure TForm11.btn1Click(Sender: TObject);
    begin
      ShowMessage(mapList.ValueFromIndex[btn1.Tag]);
    end;procedure TForm11.btn2Click(Sender: TObject);
    begin
      ShowMessage(mapList.ValueFromIndex[btn2.Tag]);
    end;procedure TForm11.FormCreate(Sender: TObject);
    var
      str:string;
    begin
      mapList := TStringList.Create;
      mapList.Values['name'] := '小李';
      mapList.Values['age'] := '18';
      btn1.Tag := mapList.IndexOfName('name');
      btn2.Tag := mapList.IndexOfName('age');
    end;procedure TForm11.FormDestroy(Sender: TObject);
    begin
      mapList.Free;
    end;end.
      

  6.   


    但是为什么下面这样可以呢? 下面可以正常获取procedure TForm1.FormCreate(Sender: TObject);
    var
        str1:string;
    begin
    str1:='小李';
    Button1.Tag := Integer(str1);
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
        str: string;
    begin
        str := string(Button1.Tag);
        ShowMessage(str);
    end;
      

  7.   

    传入地址, 地址的内容没有被修改或清空前, 当然没问题procedure TForm11.FormCreate(Sender: TObject);
    var
      str1:string;
    begin
      str1 :='小李';
      Btn1.Tag := Integer(str1);  pchar(str1)[1] := 'e'; //加这句测试end;