为什么可以';在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到globalsystem.text
变量,通常输出到控制台或文件。我想通过创建一个logger类来删除这些全局变量,使它们更易于测试,在这个类中,我将system.text
变量作为参数传递给它的构造函数。然后替换writeln('Some Message')
tologger.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),它的工作非常出色。