如何修复E2033在Delphi上实际和形式var参数的类型必须相同?

时间:2018-10-29 09:45:43

标签: delphi-2010

我写了一个自己的过程,其中包括2个数组和一个TextFile。在我在其上编写的表单上可以工作,但是当我尝试在其他表单上使用它时,会出现此错误消息。 我在类型上声明了一个数组,并且过程中的两个数组都使用了该类型的数组,但在另一种形式上,它表示即使我以完全相同的方式声明了数组,它们也不相同。 我的代码示例:

Form1
Type
Array = array[1..20] of string; //declaring the type of array
... 
Private
ArrUser : Array;
ArrPassword : Array;
tFile: TextFile;
... 
Var
Procedure Write(var tFile; var arrUser, ArrPassword : 
Array) ;
... 
Procedure Write(var tFile; var arrUser, ArrPassword : 
Array) ;
Var
Count, position, length : integer;
Line : string;
Begin
Count := 0;
AssignFile(tFile, 'sign in.txt');
Reset (tFile);
While NOT EOF(tFile) do
  Begin
     Inc(count) ;
     ReadLn(tFile, line) ;
     Position := pos(' ', line) ;
     Length := length(line) ;
     ArrUser[count] := copy(line, 1, position - 1);
     Delete(line, 1, position) ;
     ArrPassword[count] := line;
  End;
Closefile(tFile) ;
End;

Form2
Type
Array = array[1..20] of string; //declaring the type of array
... 
Private
ArrUser : Array;
ArrPassword : Array;
tFile: TextFile ;
... 
Begin
  Write(tFile, arrUser, ArrPassword) ; //error is shown here 
at the arrays
End;

1 个答案:

答案 0 :(得分:0)

您要声明两种不同的数组类型。

您的过程期望使用Form1.Array类型的参数,但是您正在向其传递Form2.Array类型的变量。而且您正在通过var引用传递参数,因此传递的变量必须完全匹配参数的类型。这就是编译器错误所抱怨的。

即使您没有使用var引用,这两种数组类型仍然是彼此不同的类型,彼此之间不是assignment compatible

您需要摆脱一种数组类型,并在两个单元中使用另一种数组类型。例如:

unit Form1;

interface

type
  Array = array[1..20] of string;

...
private
  ArrUser : Array;
  ArrPassword : Array;
...

Procedure Write(var tFile; var arrUser, ArrPassword : Array);

implementation

...

Procedure Write(var tFile; var arrUser, ArrPassword : Array);
begin
  ...
end;

...

end. 

unit Form2;

uses
 ..., Form1;

...
private
  ArrUser : Form1.Array;
  ArrPassword : Form1.Array;
...

implementation

...

begin
  Write(tFile, ArrUser, ArrPassword) ;
end;

...

end.

为了获得更好的可维护性,您应该创建第三个单元来声明数组类型,然后在需要访问数组类型的位置use声明该单元。

unit MySharedUnit;

interface

type
  Array = array[1..20] of string;

implementation

end.

unit Form1;

interface

uses
  ..., MySharedUnit;

...
private
  ArrUser : MySharedUnit.Array;
  ArrPassword : MySharedUnit.Array;
...

Procedure Write(var tFile; var arrUser, ArrPassword : MySharedUnit.Array);

implementation

...

Procedure Write(var tFile; var arrUser, ArrPassword : MySharedUnit.Array);
begin
  ...
end;

...

end. 

unit Form2;

uses
 ..., MySharedUnit, Form1;

...
private
  ArrUser : MySharedUnit.Array;
  ArrPassword : MySharedUnit.Array;
...

implementation

...

begin
  Write(tFile, ArrUser, ArrPassword) ;
end;

...

end.