因为你的code 是一个局部变量,在下一个procedure是访问不到的
var
  cl : TStringlist;// 用stringlist
procedure SetNation(cmbNation: TComboBox;const FileName: string);
var
  NationRec: TNationRec;
  DataFile: file of TNationRec;
  Code, NName: string;
begin
  if cl<>nil then cl.Free;
  cl:=TStringList.Create;
  cmbNation.Items.Clear;
  if FileExists(FileName) then
  begin
    AssignFile(DataFile,FileName);
    Reset(DataFile);
    try
      while not Eof(DataFile) do
      begin
        Read(DataFile,NationRec);
        NName := NationRec.NationName;
        cl.add(NationRec.NationCode);
        cmbNation.Items.Add(NName);
      end;
    finally
      CloseFile(DataFile);
    end;
  end
  else Application.MessageBox(Pchar('没找到设置文件'+ FileName),'错误',MB_OK);
end;
procedure TFrom1.Button1Click(Sender: TObject);
var
  s: string;
begin
  s:=cl[cmbNation.ItemIndex];
  showmessage(s);
end;这样就可以了

解决方案 »

  1.   

    因为你的code是函数SetNation的内部变量,函数结束时释放了空间,在其他函数访问时,会出现异常。你可以如下方法使用:
    procedure SetNation(cmbNation: TComboBox;const FileName: string);
    var
      NationRec: PNationRec;//////使用指针
      DataFile: file of TNationRec;
      Code, NName: string;
    begin
      cmbNation.Items.Clear;
      if FileExists(FileName) then
      begin
        AssignFile(DataFile,FileName);
        Reset(DataFile);
        try
          while not Eof(DataFile) do
          begin
            new(NationRec);//申请指针内存。
            Read(DataFile,NationRec^);
            NName := NationRec^.NationName;
            Code := NationRec^.NationCode;
            cmbNation.Items.AddObject(NName,TObject(NationRec));
    (cmbNation.Items.AddObject(NName,TObject(NationRec^.NationCode));)
          end;
        finally
          CloseFile(DataFile);
        end;
      end
      else Application.MessageBox(Pchar('没找到设置文件'+ FileName),'错误',MB_OK);
    end;procedure TFrom1.Button1Click(Sender: TObject);
    var
      s:string;
    begin
      s:=PNationRec(cmbNation.Items.Objects[cmbNation.ItemIndex])^.NationCode;
    (s:=string(cmbNation.Items.Objects[cmbNation.ItemIndex]);)
      showmessage(s);
    end;
      

  2.   

    你们的方法是可以,谢谢但是如果我把代码变成:
    NName := NationRec.NationName;
    Code := '123';
    cmbNation.Items.AddObject(NName,TObject(Code));这样在下面显示的时候就不会出错
    procedure TFrom1.Button1Click(Sender: TObject);
    var
      s: string;
    begin
      s:=string(cmbNation.Items.Objects[cmbNation.ItemIndex]);
      showmessage(s);
    end;为什么直接给一个字符串就可以呢?