为什么我不能在Delphi

时间:2018-01-14 22:32:53

标签: delphi

我实际上希望能够做到以下

var
  x, y : system.file;
begin
  x := y;
end;

但请收到以下消息 [dcc32错误] Unit3.pas(31):E2015运算符不适用于此操作数类型

背景:我正在尝试对一些旧代码进行现代化并使其更易于测试,并且全局writeln变量有很多system.text代码,这些代码通常输出到控制台或者文件。我想删除这些全局变量,以便通过创建一个记录器类来更容易测试,我将system.text变量作为参数传递给它的构造函数。然后将writeln('Some Message');替换为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.

1 个答案:

答案 0 :(得分:1)

将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;