with конструкция
От: vterekh  
Дата: 07.06.04 04:18
Оценка: 1 (1)
Привет,

Возможно в следующей конструкции получить указатель на объект, созданный в with


type
TMyObject = class(TObject)
.....
end;


with TMyObject.Create do
try
  .....

  // Здесь хочется узнать указатель на "TMyObject.Create" для передачи его
  // например в какую-либо процедуру.
  .....
finally
  Free;
end;
Re: with конструкция
От: Softwarer http://softwarer.ru
Дата: 07.06.04 06:51
Оценка: +1
Здравствуйте, vterekh, Вы писали:

V>Возможно в следующей конструкции получить указатель на объект, созданный в with

V>with TMyObject.Create do

Я такого способа не знаю. Мало того, это было бы нелогично и неконцептуально; если нужен неавтоматический объект — нужно и явно его называть. Это все равно, что делать:

function X (i: integer): string ;
....
C := X(1)[2];
// а здесь хочу обратиться к другим символам, которые вернула X.
Re: with конструкция
От: Alex_Sudakov Россия  
Дата: 07.06.04 07:26
Оценка: 15 (1)
Здравствуйте, vterekh.

Вы писали 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;




--
С уважением,
Alexandr mailto:alex_sudakov@mail.spbnit.ru
Posted via RSDN NNTP Server 1.9 alpha
Re: with конструкция
От: kavlad Россия http://www.wavesoft.ru
Дата: 08.06.04 06:47
Оценка: 85 (11) +1
Здравствуйте, vterekh, Вы писали:

V>Возможно в следующей конструкции получить указатель на объект, созданный в with


Можно. Используй указатель на метод этого объекта без параметров (например, Free). В поле Data этого метода будет ссылка на объект (знаменитый Self).

var
  StrList: TStringList;
berin
    with TStrinList.Create do
    begin
        ...
        StrList := TMethod(Free).Data;
        ...
    end;
end;
237135176
Re[2]: with конструкция
От: akasoft Россия  
Дата: 08.06.04 16:32
Оценка: :)
Здравствуйте, kavlad, Вы писали:

K>Используй указатель на метод этого объекта без параметров (например, Free)...


Грязный хак!

Так и думал, что до Selfa можно достучаться, но лень было ковырять исходники...
... << RSDN@Home 1.1.4 beta 2 >>
Re[2]: with конструкция
От: Spaider Верблюд  
Дата: 09.06.04 06:33
Оценка: :)
Здравствуйте, 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>


Вот, и не фиг придумывать "грязные хаки" (С)

Всё бы вам, господа, заниматься любовью стоя на лыжах в гамаке.
... << RSDN@Home 1.1.3 stable >>
--
К вашим услугам,
Re[3]: with конструкция
От: kavlad Россия http://www.wavesoft.ru
Дата: 09.06.04 07:03
Оценка:
Здравствуйте, akasoft, Вы писали:

A>Грязный хак!


Не согласен, что хак Тем более грязный.
Но изврат однозначно, хотя может быть кому-то пригодится
237135176
Re[3]: with конструкция
От: akasoft Россия  
Дата: 09.06.04 08:04
Оценка: :)
Здравствуйте, Spaider, Вы писали:

S>Всё бы вам, господа, заниматься любовью стоя на лыжах в гамаке.


Зато как вставляет...
... << RSDN@Home 1.1.4 beta 2 >>
Re[2]: with конструкция
От: Oleg A. Bachin Украина  
Дата: 09.06.04 08:33
Оценка: 6 (1)
Здравствуйте, 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;


а предыдущий код у меня вообще не собрался...
Best regards,
Oleg A. Bachin
Re[3]: with конструкция
От: Oleg A. Bachin Украина  
Дата: 09.06.04 09:13
Оценка:
нормально! минусанули и ветку ответа прибили!
а я пишу-пишу, а мне "У Вас нет прав доступа писать в этот форум!"

хоть бы ошибку нормальную писали...
Best regards,
Oleg A. Bachin
Re[3]: with конструкция
От: kavlad Россия http://www.wavesoft.ru
Дата: 09.06.04 09:15
Оценка:
Здравствуйте, 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.
237135176
Re[4]: with конструкция
От: Oleg A. Bachin Украина  
Дата: 09.06.04 09:19
Оценка:
Здравствуйте, 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 за счет лишнего вызова не совсем нормально...
Best regards,
Oleg A. Bachin
Re[4]: with конструкция
От: Oleg A. Bachin Украина  
Дата: 09.06.04 09:35
Оценка: 18 (2)
Здравствуйте, kavlad, Вы писали:

Чуток оптимизируем:

K>
K>type
K>  TObjectMethod = procedure of object;

убираем
K>function WithSelf(const MethodPointer: TObjectMethod): TObject;
K>begin
K>  Result := TMethod(MethodPointer).Data;
K>end;

function WithSelf(const MethodPointer: TObjectMethod): TObject; register;
asm
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);
        SL.Assign(TStringList(WithSelf(Free)));
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>
Best regards,
Oleg A. Bachin
Re[5]: with конструкция
От: kavlad Россия http://www.wavesoft.ru
Дата: 09.06.04 09:46
Оценка:
Здравствуйте, Oleg A. Bachin, Вы писали:

>>вообще-то не понятно за что ты минусанул... то что я написал — правильно (а то народ подумает что я неверный код привел)...


Минус снял, больше так себя вести не буду
Написал правильно — но это совсем другой случай.

OAB>и хотелось бы увидеть вариант без лишнего вызова процедуры (как изначально показывалось)

OAB>иначе экономить на лишнем объявлении в секции var за счет лишнего вызова не совсем нормально...

Об экономии речи и не шло
237135176
Re[5]: with конструкция
От: kavlad Россия http://www.wavesoft.ru
Дата: 09.06.04 10:30
Оценка:
Здравствуйте, Oleg A. Bachin, Вы писали:

OAB>и хотелось бы увидеть вариант без лишнего вызова процедуры (как изначально показывалось)

OAB>иначе экономить на лишнем объявлении в секции var за счет лишнего вызова не совсем нормально...

Я без вызова процедуры и лишнего объявления не смог — либо вызов либо переменная procedure of object.
237135176
Re[6]: with конструкция
От: Leonid Troyanovsky  
Дата: 09.06.04 17:02
Оценка: 61 (4)
Здравствуйте, kavlad, Вы писали:

K>Я без вызова процедуры и лишнего объявления не смог — либо вызов либо переменная procedure of object.


Каноническое решение задачи как-то предложил Андрей Лобанов: для объектов,
нуждающихся в самопознании, создается потомок, которому добавляется функция This:


type
  TSomeObjectRef = class (TSomeObject)
  public
    function This: TSomeObjectRef;
  end;

function TSomeObjectRef.This: TSomeObjectRef;
begin
  Result := Self;
end;


Учитывая то, что объекты предполагается создавать динамически,
предварительное описание требуемого потомка выглядит ненапряжно.

Предложенный метод WithSelf также можно сравнить с

http://groups.google.com/groups?selm=638292266%40p2.f175.n5020.z2.ftn
--
С уважением, LVT
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.