procedure TForm1.getp(P: array of TVarRec; Args: array of const);
var i:integer;
begin
for I := Low(Args) to High (Args) do begin
    p[i].VType:=args[i].VType;
    case Args[I].VType of
      vtInteger: p[i].VInteger :=Args[I].VInteger;
      vtBoolean: p[i].VBoolean :=Args[i].VBoolean;
      VtChar: p[i].VPchar :=Args[i].VPchar;
    end; // case
    end;
end;然后测试:
var
 pp:array of TVarRec;
begin
getp(pp,[111,'str']);
showmessage(pp[1].VPChar);
showmessage(inttostr(pp[0].VInteger));
end;
为什么不行?

解决方案 »

  1.   

    var
     pp:array of TVarRec;
    begin
    getp(pp,[111,'str']);
    showmessage(pp[1].VPChar); //取不到值'str'
    showmessage(inttostr(pp[0].VInteger));//取不到值111
    end;
      

  2.   

    是你的书组没有分配空间不过我式了一下,也得不到答案,不过不报错,我在看看  setlength(pp, 2);
      getp(pp,[111,'str']);
      showmessage(string(pp[1].VPChar));
      showmessage(inttostr(pp[0].VInteger));
      

  3.   

    你的代码,我修改如下
    implementationtype
      TATV = array of TVarRec;procedure getp(var P: TATV; Args: array of const);
    var i:integer;
    begin
      Setlength(P, High(Args) + 1);
      for I := Low(p) to High (p) do
      begin
        p[i].VType := args[i].VType;
        case Args[I].VType of
          vtInteger:
            p[i].VInteger :=Args[I].VInteger;
          vtBoolean:
            p[i].VBoolean :=Args[i].VBoolean;
          VtChar:
            p[i].VPchar :=Args[i].VPchar;
          vtString:
            p[i].VString :=Args[i].VString;
          vtAnsiString:
            p[i].VAnsiString := Args[i].VAnsiString;
        end; // case
      end;
    end;
    {$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      pp: TATV; //array of TVarRec;
      n: integer;
    begin
      getp(pp, ['str', 111, 123, '222', 'qwe']);
      for n := low(pp) to high(pp) do
        case pp[n].VType of
          vtInteger:
            ShowMessage(IntToStr(pp[n].VInteger));
          vtBoolean:
            ;//pp[i].VBoolean;
          VtChar, vtString, vtAnsiString:
            ShowMessage(pp[n].VPchar);
        end; // case
    end;
      

  4.   

    其实函数可以简单的写为procedure getp(var P: TATV; Args: array of const);
    var i:integer;
    begin
      Setlength(P, High(Args) + 1);
      for I := Low(p) to High (p) do
        p[i] := Args[i];
    end;