我实际上希望能够做到以下
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.
答案 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;