Команда Scio предоставила решение этой проблемы. В основном добавьте --nullableCoders=true
в аргумент командной строки.
Ну, вы можете использовать такой подход:
// implement:
type
TSimpleMethod = procedure of object;
function GetThis(const pr: TSimpleMethod): TObject;
begin
Result := TMethod(pr).Data;
end;
// usage:
with TStringList.Create do
try
CommaText := '1,2,3,4,5,6,7,8,9,0';
ShowText(TStringList(GetThis(Free)));
finally
Free;
end;
или помощники класса:
type
TObjectHelper = class helper For TObject
private
function GetThis: TObject; Inline;
public
property This: TObject read GetThis;
end;
...
function TObjectHelper.GetThis: TObject;
begin
Result := Self;
end;
Но, на самом деле, предыдущие ответы верны: вам лучше забыть об утверждении «с».
Вы никогда не должны использовать с
, потому что будущие изменения могут внести в эту область больше, чем вы предполагали.
Возьмите это, например:
procedure Test;
var
x: Integer;
begin
with TSomeObject.Create do
begin
DoSomethingWithX(x);
Free;
end;
end;
, а затем позже вы добавляете свойство X в класс TSomeObject. Теперь, какой X вы думаете, он будет использовать? Локальная переменная или свойство X объекта?
Лучшее решение всегда состоит в том, чтобы просто создать локальную переменную с коротким именем и присвоить объекту псевдоним этой переменной.
procedure Test;
var
x: Integer;
o: TSomeObject;
begin
o := TSomeObject.Create;
o.DoSomethingWithX(x);
o.Free;
end;
Вы сами ответили: объявите локальную переменную. Если вы хотите, вы можете использовать для этого ключевое слово с .
var
MyInstance: TMyObject;
begin
MyInstance := TMyObject.Create;
with MyInstance do
try
Foo;
Bar;
DoSomething(MyInstance);
finally
Free;
end;
end;
В приведенном выше примере единственной причиной использования с является читаемость кода, которая очень субъективна, вы также можете отказаться от с ключевым словом и используйте MyInstance напрямую. Это просто вопрос личного вкуса. Я не согласен с ответами «никогда не использовать с», но вы должны знать о его недостатках.
См. Также этот вопрос: Является ли ключевое слово delphi «with» плохой практикой?
В дополнение к примеру Брайана о обработчике уведомлений используется абсолютная переменная (только для win32):
procedure Notify( Sender : TObject );
var
Something : TSomeThing absolute Sender;
begin
if Sender is TSomething then
begin
VerySimpleProperty := Something.Something;
OtherProperty := Something.SomethingElse;
end;
end;
Он в основном избегает необходимости присваивать локальную переменную или иметь много типов типов.
Я усвоил трудный путь - используйте «С» только в следующих сценариях:
With TMyForm.Create( Owner ) do
try
ShowModal
finally
Free;
end;
procedure Notify( Sender : TObject );
begin
With Sender as TSomething do
VerySimpleProperty := Something
end;
, т.е. сохраняйте видимость С как можно более простой.