Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';在Delphi中在system.file类型之间分配_Delphi - Fatal编程技术网

为什么可以';在Delphi中在system.file类型之间分配

为什么可以';在Delphi中在system.file类型之间分配,delphi,Delphi,我非常希望能够做到以下几点 var x, y : system.file; begin x := y; end; 但是得到以下信息 [dcc32错误]单元3.pas(31):E2015运算符不适用于此操作数类型 背景:我正在尝试更新一些旧代码,使其更易于测试,并且有许多writelncode到globalsystem.text变量,通常输出到控制台或文件。我想通过创建一个logger类来删除这些全局变量,使它们更易于测试,在这个类中,我将system.text变量作为参数传递给它的构造

我非常希望能够做到以下几点

var
  x, y : system.file;
begin
  x := y;
end;
但是得到以下信息 [dcc32错误]单元3.pas(31):E2015运算符不适用于此操作数类型

背景:我正在尝试更新一些旧代码,使其更易于测试,并且有许多
writeln
code到global
system.text
变量,通常输出到控制台或文件。我想通过创建一个logger类来删除这些全局变量,使它们更易于测试,在这个类中,我将
system.text
变量作为参数传递给它的构造函数。然后替换
writeln('Some Message')
to
logger.log('Some Message'),其中我可以替换记录器的类型

这是完整的单元

UNIT TextLogger;

INTERFACE

USES
  LoggerInterface;

TYPE
  TTextLogger = CLASS(TInterfacedObject, ILogger)
  PROTECTED
    fOutPut : system.text;
    PROCEDURE Log (s : STRING);
    CONSTRUCTOR Create (const aOutPut : system.text);
  END;

IMPLEMENTATION

{ TTextLogger }

CONSTRUCTOR TTextLogger.Create (const aOutPut : system.text);
BEGIN
fOutPut := aOutPut; //compile error here
END;

PROCEDURE TTextLogger.Log (s : STRING);
BEGIN
Writeln (fOutPut, s);
END;

END.

将System.Text变量强制转换为TTextRec似乎允许赋值。正如其他一些评论者指出的那样,这可能仍然是一个坏主意,并且可能会产生在这个简单的测试用例中不明显的其他副作用

var
  x: System.Text;
  y: System.Text;

begin
  AssignFile(x, 'c:\localdata\temp.txt');
  Rewrite(x);

  WriteLn(x, 'hello from x');

  TTextRec(y) := TTextRec(x);
  WriteLn(y, 'hello from y');

  CloseFile(y); // Both x and y are sharing the same handle, only close 1
end;

如果你想使应用程序现代化,你应该完全放弃古老的Pascal IO(即
文件
文本
类型),并去掉那些难看的大写(叫喊)关键字。阅读这样的代码很痛苦(是的,我知道沃思也喜欢它)。@RudyVelthuis RE:全部大写-是的,试着整天使用它!(或者我应该说是整天!!!!!)有些代码可以追溯到Turbo Pascal之前,所以虽然我不喜欢格式,但它非常一致。你知道IDE有一个代码格式设置程序吗?如果代码被正确地突出显示,所有的大写字母都是无用的。但是按照@Andreas所说的去做,去掉旧的Pascal I/O。“是的,我同意你的观点,但那将是一项艰巨的工作”,因为他们到处都有重复的代码?如果是这样,我感觉到你的痛苦;-)此外,我更喜欢CnPack附带的代码格式化程序(Ctrl-W),它的工作非常出色。