Возможно в следующей конструкции получить указатель на объект, созданный в with
type
TMyObject = class(TObject)
.....
end;
with TMyObject.Create do
try
.....
// Здесь хочется узнать указатель на "TMyObject.Create" для передачи его
// например в какую-либо процедуру.
.....
finally
Free;
end;
Здравствуйте, vterekh, Вы писали:
V>Возможно в следующей конструкции получить указатель на объект, созданный в with V>with TMyObject.Create do
Я такого способа не знаю. Мало того, это было бы нелогично и неконцептуально; если нужен неавтоматический объект — нужно и явно его называть. Это все равно, что делать:
function X (i: integer): string ;
....
C := X(1)[2];
// а здесь хочу обратиться к другим символам, которые вернула X.
Вы писали 7 июня 2004 г., 8:18:04:
v> From: vterekh v> Привет,
v> Возможно в следующей конструкции получить указатель на объект, созданный в with
v> typeTMyObject =class(TObject).....end;with TMyObject.Create v> dotry .....// Здесь хочется узнать указатель на "TMyObject.Create" v> для передачи его // например в какую-либо процедуру. .....finally v> Free;end;
type
TMyObject =class(TObject).....end;
var o:TMyObject;
begin
o:=TMyObject.Create;
with o do
begin
end;
end;
Здравствуйте, Alex_Sudakov, Вы писали:
A_S>Здравствуйте, vterekh.
A_S>Вы писали 7 июня 2004 г., 8:18:04:
v>> From: vterekh v>> Привет,
v>> Возможно в следующей конструкции получить указатель на объект, созданный в with
A_S>
A_S>type
A_S> TMyObject =class(TObject).....end;
A_S>var o:TMyObject;
A_S>begin
A_S> o:=TMyObject.Create;
A_S> with o do
A_S> begin
A_S> end;
A_S>end;
A_S>
Вот, и не фиг придумывать "грязные хаки" (С)
Всё бы вам, господа, заниматься любовью стоя на лыжах в гамаке.
Здравствуйте, kavlad, Вы писали: K>Можно. Используй указатель на метод этого объекта без параметров (например, Free). В поле Data этого метода будет ссылка на объект (знаменитый Self).
K>
K>var
K> StrList: TStringList;
K>berin
K> with TStrinList.Create do
K> begin
K> ...
K> StrList := TMethod(Free).Data;
K> ...
K> end;
K>end;
K>
хм... чет не совсем понятно...
вроде ж наоборот:
var
P: procedure of object;
begin
TMethod(P).Code := @TStringList.Free;
TMethod(P).Data := ...object... (Self)
P();
end;
Здравствуйте, Oleg A. Bachin, Вы писали:
OAB>хм... чет не совсем понятно... OAB>вроде ж наоборот:
OAB>OAB>var OAB> P: procedure of object; OAB>begin OAB> TMethod(P).Code := @TStringList.Free; OAB> TMethod(P).Data := ...object... (Self) OAB> P(); OAB>end;
Ага! Вот это и есть грязный хак — подмена методов у экземпляра класса
OAB>а предыдущий код у меня вообще не собрался...
Еще бы — в нем две ошибки
Попробуй так:
type
TObjectMethod = procedure of object;
...
function WithSelf(const MethodPointer: TObjectMethod): TObject;
begin
Result := TMethod(MethodPointer).Data;
end;
...
var
SL: TStringList;
I: Integer;
begin
SL := TStringList.Create;
with TStringList.Create do
begin
Add('First string');
Add('Second string');
Add('Third string');
SL.Assign(WithSelf(Free) as TStringList);
Free;
end;
for I := 0 to Pred(SL.Count) do
WriteLn(SL[I]);
SL.Free;
Readln;
end.
Здравствуйте, kavlad, Вы писали:
K>Здравствуйте, Oleg A. Bachin, Вы писали:
OAB>>хм... чет не совсем понятно... OAB>>вроде ж наоборот:
OAB>>OAB>var OAB>> P: procedure of object; OAB>>begin OAB>> TMethod(P).Code := @TStringList.Free; OAB>> TMethod(P).Data := ...object... (Self) OAB>> P(); OAB>>end;
K>Ага! Вот это и есть грязный хак — подмена методов у экземпляра класса
OAB>>а предыдущий код у меня вообще не собрался...
K>Еще бы — в нем две ошибки
K>Попробуй так:
K>
K>type
K> TObjectMethod = procedure of object;
K>...
K>function WithSelf(const MethodPointer: TObjectMethod): TObject;
K>begin
K> Result := TMethod(MethodPointer).Data;
K>end;
K>...
K>var
K> SL: TStringList;
K> I: Integer;
K>begin
K> SL := TStringList.Create;
K> with TStringList.Create do
K> begin
K> Add('First string');
K> Add('Second string');
K> Add('Third string');
K> SL.Assign(WithSelf(Free) as TStringList);
K> Free;
K> end;
K> for I := 0 to Pred(SL.Count) do
K> WriteLn(SL[I]);
K> SL.Free;
K> Readln;
K>end.
K>
>вообще-то не понятно за что ты минусанул... то что я написал — правильно (а то народ подумает что я неверный код привел)...
это не грязный хак, так делфя работает...
>да и сам мог бы до конца дописывать, что
TObjectMethod = procedure of object;
ок, теперь написал...
и хотелось бы увидеть вариант без лишнего вызова процедуры (как изначально показывалось)
иначе экономить на лишнем объявлении в секции var за счет лишнего вызова не совсем нормально...
Здравствуйте, Oleg A. Bachin, Вы писали:
>>вообще-то не понятно за что ты минусанул... то что я написал — правильно (а то народ подумает что я неверный код привел)...
Минус снял, больше так себя вести не буду
Написал правильно — но это совсем другой случай.
OAB>и хотелось бы увидеть вариант без лишнего вызова процедуры (как изначально показывалось) OAB>иначе экономить на лишнем объявлении в секции var за счет лишнего вызова не совсем нормально...
Здравствуйте, Oleg A. Bachin, Вы писали:
OAB>и хотелось бы увидеть вариант без лишнего вызова процедуры (как изначально показывалось) OAB>иначе экономить на лишнем объявлении в секции var за счет лишнего вызова не совсем нормально...
Я без вызова процедуры и лишнего объявления не смог — либо вызов либо переменная procedure of object.
Здравствуйте, kavlad, Вы писали:
K>Я без вызова процедуры и лишнего объявления не смог — либо вызов либо переменная procedure of object.
Каноническое решение задачи как-то предложил Андрей Лобанов: для объектов,
нуждающихся в самопознании, создается потомок, которому добавляется функция This:
type
TSomeObjectRef = class (TSomeObject)
public
function This: TSomeObjectRef;
end;
function TSomeObjectRef.This: TSomeObjectRef;
begin
Result := Self;
end;
Учитывая то, что объекты предполагается создавать динамически,
предварительное описание требуемого потомка выглядит ненапряжно.
Предложенный метод WithSelf также можно сравнить с