//定义
  PArrFields = ^TArrFields;
  TArrFields = record
    F1: string;
    F2: string;
  end;ArrFields: array of TArrFields;const
  AFieldS: array[0..1] of TArrFields = ((F1:'FGoodsNo';F2:'FGoodsNo'),(F1:'FPrice';F2:'FInPri'));
begin
  SetFields(@AFieldS);
end;procedure SetFields(arr: PArrFields);
begin
  ArrFields := @arr; //这边要给record数组赋值就出错
end;我的目的是用自定义的record数组做参数,并赋值给数组ArrFields,需要使用时就这样取出值,
for i := Low(ArrFields) to High(ArrFields) do
  begin
    showmessage(ArrFields[i].F1).AsString);
  end; 
但是赋值的时候就会出错,请问大虾们这是怎么回事?先谢谢了

解决方案 »

  1.   

    PArrFields是^TArrFields,不是数组的指针
      

  2.   

    procedure SetFields(arr: PArrFields);
     begin 
      ArrFields := @arr; //这边要给record数组赋值就出错
     end;procedure SetFields(arr: PArrFields); 
     begin  
      ArrFields :=arr; 
     end;
      

  3.   

    [Error] U_GoodsSel.pas(186): Incompatible types: 'TArrFields' and 'Array'编译不过
      

  4.   

    复制数组:SetLength(ArrFields,2);
    Move(AFields[0],ArrFields[0],SizeOf(Tarrfields)*2);
    showmessage(ArrFields[0].F1);
      

  5.   

    是要写:
    Move(arr[0],ArrFields[0],SizeOf(Tarrfields)*2);//编译报错[Error] U_GoodsSel.pas(188): Array type required
    SetFields 里面没有AFields参数
      

  6.   

    复制数组的时候直接写
    SetLength(ArrFields,2);
    Move(AFields[0],ArrFields[0],SizeOf(Tarrfields)*2);
    showmessage(ArrFields[0].F1);不在SetFields 函数里调用了
      

  7.   

    SetFields 是再另一根窗体里面的做赋值用的,所以需要写,主要问题就是怎么把
    一个静态的AFieldS: array[0..1] of TArrFields传给另一个动态的
    ArrFields: array of TArrFields;
      

  8.   

    看这里,单元代码unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
      PArrFields = ^TArrFields;
      TArrFields = record
        F1: string;
        F2: string;
      end;
    var
      Form1: TForm1;
      ArrFields: array of TArrFields;
      AFieldS: array[0..1] of TArrFields = ((F1: 'FGoodsNo'; F2: 'FGoodsNo'), (F1: 'FPrice'; F2: 'FInPri'));
    implementation{$R *.dfm}
    //数组本来就是指针呢。procedure SetFields(arr: PArrFields);
    begin
      ArrFields := @arr; //这边要给record数组赋值就出错
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin  SetLength(ArrFields, 2);
      Move(AFields[0], ArrFields[0], SizeOf(Tarrfields) * 2);  showmessage(ArrFields[0].F1);
    end;end.
      

  9.   


    这样确实可以,但是能否通过参数传AFieldS: array[0..1] of TArrFields呢?
      

  10.   

    这样确实可以,但是能否通过参数传AFieldS: array[0..1] of TArrFields呢?
      

  11.   

    这里有一篇文章和我的情况差不多,不过也没说怎么解决的
    http://topic.csdn.net/u/20081128/14/1558d17f-dc24-41a2-98ec-df43882a3fa6.html?1076911347
      

  12.   

    传参数需要这样
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
      PArrFields = ^TArrFields;
      TArrFields = record
        F1: string[20];
        F2: string[20];
      end;  taaa=array[0..1] of TArrFields;var
      Form1: TForm1;
      ArrFields:array of TArrFields;
      AFieldS: Taaa = ((F1: 'FGoodsNo'; F2: 'FGoodsNo'), (F1: 'FPrice'; F2: 'FInPri'));
    implementation{$R *.dfm}
    //数组本来就是指针呢。procedure SetFields(arr: taaa);
    begin  //ArrFields :=@arr; //这边要给record数组赋值就出错  showmessage(ArrFields[0].F1);
      Move(AFields[0], ArrFields[0], SizeOf(Tarrfields) * 2);
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin  SetLength(ArrFields, 2);
      FillChar(ArrFields,0,SizeOf(Tarrfields)*2);
     { Move(AFields[0], ArrFields[0], SizeOf(Tarrfields) * 2);
      }
      SetFields(afields);
      showmessage(ArrFields[0].F1);
    end;end.
      

  13.   

    ArrFields: array of TArrFields;ArrFields:PArrFields;
    procedure SetFields(arr: PArrFields);   
     begin    
      ArrFields :=arr; 
      end;
      

  14.   

    procedure SetFields(arr: taaa);
    begin  //ArrFields :=@arr; //这边要给record数组赋值就出错 showmessage(ArrFields[0].F1);
      Move(AFields[0], ArrFields[0], SizeOf(Tarrfields) * 2);
    end;
    这句的arr参数完全没用了
      

  15.   

    晕,修改一下啊,AFields改成arr不就行了么
      

  16.   

    我把SetFields改成
    procedure SetFields(arr: array of TArrFields);
    begin
      SetLength(ArrFields, 2);
      Move(arr[0], ArrFields[0], SizeOf(Tarrfields) * 2);
    end;
    就可以了,谢谢lanyun2