Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.11.2012, 16:42
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию Получить адрес объекта из метода класса

Код:
 TMyClass = class
  public
    constructor Create;
    destructor Destroy; override;
 end;

destructor TMyClass.Destroy;
begin
 Showmessage(Integer(@Self));
 Inherited Destroy;
end;

Код:
 var
  Obj: TMyClass;
 begin
  Obj := TMyClass.Create;
  Showmessage(Integer(@Obj));
  Obj.Free;
 end;

Получаю разные значения @Self и @Obj, а мне нужно, чтобы в методе Destroy узнать @Obj. Как это сделать? Почитал тут http://stackoverflow.com/questions/3...-pointer-usage , но ничего не понял.

Последний раз редактировалось ART, 11.11.2012 в 16:44.
Ответить с цитированием
  #2  
Старый 11.11.2012, 16:57
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от ART
Код:
 TMyClass = class
  public
    constructor Create;
    destructor Destroy; override;
 end;

destructor TMyClass.Destroy;
begin
 Showmessage(Integer(@Self));
 Inherited Destroy;
end;

Код:
 var
  Obj: TMyClass;
 begin
  Obj := TMyClass.Create;
  Showmessage(Integer(@Obj));
  Obj.Free;
 end;

Получаю разные значения @Self и @Obj, а мне нужно, чтобы в методе Destroy узнать @Obj. Как это сделать? Почитал тут http://stackoverflow.com/questions/3...-pointer-usage , но ничего не понял.
Self - это и есть адрес объекта. Т.е. получать нужно так:
Код:
ShowMessage(IntToStr(Integer(Self))); // В первом случае

ShowMessage(IntToStr(Integer(Obj))); // Во втором случае
Ты же вместо этого пытаешься получить адрес "переменной" Self в первом случае и адрес переменной Obj во втором - конечно же ты будешь получать разные значения - это же разные переменные и находятся они в разных местах.
Ответить с цитированием
  #3  
Старый 11.11.2012, 17:41
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

[asm]
lea eax, obj
mov eax, [eax]
[/asm]
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #4  
Старый 11.11.2012, 17:50
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
[asm]
lea eax, obj
mov eax, [eax]
[/asm]
Ну это тоже самое что и я написал, только на ассемблере

p.s. Ещё одно замечание: На Win64 тип Integer остался 32-битным, а Pointer стал 64-битным. Поэтому под Win64 нельзя преобразовывать указатели к типу Integer.
Ответить с цитированием
  #5  
Старый 11.11.2012, 18:27
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

Так есть ли возможность мне в destroy узнать именно @Obj ?
Ответить с цитированием
  #6  
Старый 11.11.2012, 18:30
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от ART
Так есть ли возможность мне в destroy узнать именно @Obj ?
Obj - это локальная переменная. После выхода из той (второй) процедуры эта переменная больше не существует. Как же ты узнаешь её адрес в другой процедуре?
Ответить с цитированием
  #7  
Старый 11.11.2012, 19:07
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Сообщение от ART
Так есть ли возможность мне в destroy узнать именно @Obj ?
Образно говоря, вызов деструктора выглядит так:
Код:
var object: pointer;
...
Destroy(object);
; -------------------
mov ecx, [object]   
push ecx                ; пусть будет stdcall, в данном случае не важно
call Destroy
При этом конструкция @Obj выглядит как
Код:
mov ecx, obj
То есть в деструктор мы передаем значение, выдранное из памяти, а @Obj - это просто адрес.
Аналогия: в первом случае мы взяли книгу с полки и отнесли ее другу. Он никак не сможет узнать, где эта книга стояла ранее (без посторонней помощи).
Во втором случае мы сказали другу: "книга на такой-то полке, возьми сам".
В деструктор передается первым способом.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #8  
Старый 11.11.2012, 19:09
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

Нашел выход: в конструкторе передаю адрес переменной в property класса, а из метода Destroy его потом оттуда считываю ))
Ответить с цитированием
  #9  
Старый 11.11.2012, 19:17
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от ART
Нашел выход: в конструкторе передаю адрес переменной в property класса, а из метода Destroy его потом оттуда считываю ))
Если ты в конструкторе сохраняешь в свойстве адрес переменной таким образом "prop := @Obj", то это ошибка.
Нужно сохранять в свойстве не адрес этой переменной, а само значение этой переменной таким образом: "prop := Obj" (т.е. не указатель на указатель на объект, а просто указатель на объект)
Ответить с цитированием
  #10  
Старый 11.11.2012, 20:41
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Сообщение от ART
Нашел выход: в конструкторе передаю адрес переменной в property класса, а из метода Destroy его потом оттуда считываю ))
Всего один вопрос: зачем?
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #11  
Старый 11.11.2012, 22:56
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

Цитата:
Сообщение от poli-smen
Если ты в конструкторе сохраняешь в свойстве адрес переменной таким образом "prop := @Obj", то это ошибка.
Нужно сохранять в свойстве не адрес этой переменной, а само значение этой переменной таким образом: "prop := Obj" (т.е. не указатель на указатель на объект, а просто указатель на объект)

Спасибо, то что надо.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:25.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter