Как исправить E2033 Типы фактических и формальных параметров var должны быть идентичны в Delphi? - PullRequest
0 голосов
/ 29 октября 2018

Я написал собственную процедуру, которая включает в себя 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 голосов
/ 29 октября 2018

Вы объявляете два разных типа массива.

Ваша процедура ожидает параметры типа Form1.Array, но вместо этого вы передаете ей переменные типа Form2.Array. И вы передаете параметры по ссылке var, поэтому передаваемые переменные ДОЛЖНЫ ТОЧНО СООТВЕТСТВОВАТЬ типу параметров. Вот на что жалуется ошибка компилятора.

Даже если вы не использовали var ссылки, эти два типа массивов, тем не менее, по-прежнему являются разными типами, НЕ совместимыми с присвоением друг с другом.

Вам необходимо избавиться от одного из типов массивов и использовать другой тип массива в обеих единицах. Например:

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.
...