在 Simulating class properties in (Win32) Delphi ,有一个定义“类属性”以及类方法的技巧:
unit myObjectUnit;
interface
type
TMyObject = Class
private
class function GetClassInt: integer;
class procedure SetClassInt(const Value: integer);
public
property ClassInt : integer read GetClassInt
write SetClassInt;
end;
implementation
{$WRITEABLECONST ON}
const TMyObject_ClassInt : integer = 0;
{$WRITEABLECONST OFF}
class function TMyObject.GetClassInt: integer;
begin
result := TMyObject_ClassInt;
end;
class procedure TMyObject.SetClassInt(
const Value: integer);
begin
TMyObject_ClassInt := value;
end;
end.
我的代码中只会有一个这样的对象,因此 GetClassInt 和 SetClassInt 始终对同一类型常量 *TMyObject_ClassInt* 进行操作的警告不适用:
procedure TForm1.Button1Click(Sender: TObject);
var
myObject : TMyObject;
begin
myObject.ClassInt := 2005;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
myObject : TMyObject;
begin
ShowMessage(IntToStr(myObject.ClassInt));
end;
(这说明了警告:单击 1,然后单击 2,消息显示 2005,而不是 0)。
不过,这段代码还是有点可疑。 我可能会遇到问题(除了上面的警告之外)? 有更好的方法吗?。
顺便说一句,我不是在谈论强力 $WRITEABLECONST OFF - 而不是返回到之前的状态。可以通过以下方式规避:
{$IFOPT J-}
{$DEFINE WC_WAS_OFF}
{$ENDIF}
{$WRITEABLECONST ON}
const TMyObject_ClassInt : integer = 0;
{$IFDEF WC_WAS_OFF}
{$WRITEABLECONST OFF}
{$ENDIF}
最佳答案
这里需要指定一些事情:
首先,由于您已将其标记为 XE2,因此它支持 Class Properties正确地,与 Class Field Variables 。自(我认为)Delphi 2009 年以来一直是这种情况。
type
TMyClass = class
strict private
class var // Note fields must be declared as class fields
FRed: Integer;
FGreen: Integer;
FBlue: Integer;
public // ends the class var block
class property Red: Integer read FRed write FRed;
class property Green: Integer read FGreen write FGreen;
class property Blue: Integer read FBlue write FBlue;
end;
可以通过以下方式访问:
TMyClass.Red := 0;
TMyClass.Blue := 0;
TMyClass.Green := 0;
对于旧版本的 Delphi,此解决方法是有效的,尽管我会使用单位变量而不是 Uli 建议的可写常量。在所有情况下,您的主要问题是多线程访问。
关于delphi - 在 (Win32) Delphi 中模拟类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16320306/