![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| takedo |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: нет Всего: 3 |
Добрый день. Три дня маялся и понял в чем была заковыка: адрес Self не равен адрусу объекта!!!!
Привожу примерный поясняющий код
В программе получится примерно так:
Так вот получатеся, что B не равно @A! Я хочу спросить, может смещение к @Self надо применять? И вообще в дельфи можно делать делегатов как в C++? PS примеры утрированы и приведены ради объяснения проблемы. Это сообщение отредактировал(а) takedo - 1.11.2008, 10:32 -------------------- я не гольфист - я хоккеист |
||||
|
|||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
Переменная-объект сама является неявным указателем на экземпляр класса(если он конечно создан)... а какой смысл получать ее адрес
-------------------- There are always someone smarter than you... |
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: нет Всего: 3 |
Смысл такой:
Если есть объект "Е", содержащий массив фреймов и массив кнопок, а по нажатию кнопки нужно сменить фрейм. Мне в этот раз не захотелось делать через сообщения, поэтому пошёл по такому пути: в кнопке есть указатель на объект "Е", по которому вызываем функцию E^.ChfngeFrame. Вот собственно пример того, что это бывает нужно. Неспроста я спросил про делегатов в дельфи - это их задача, только в Си делегат это указатель на функцию если не ошибаюсь. В шарпе на этом основана обработка сообщений (я только начинаю изучать шарп, да и дельфи всего пару недель назад начал -------------------- я не гольфист - я хоккеист |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
нет никакого смысла брать @Self... Self и сам по сути является указателем.
-------------------- There are always someone smarter than you... |
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: нет Всего: 3 |
попробуй возьми, или набери примерчик в первом посте и удивись.
Добавлено через 3 минуты и 31 секунду да и вообще вопрос не в том какой смысл, а в том что с этим делать. -------------------- я не гольфист - я хоккеист |
|||
|
||||
| MetalFan |
|
||||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
зачем мне его набирать, если там написан бред? а с чего оно должно быть равным??? адрес VMT класса и адрес объекта? Добавлено @ 13:26
так а что мешает написать както так:
повторюсь: вообще неясно, зачем нужен "указатель на объект", если переменная-объект и так является указателем??? Это сообщение отредактировал(а) MetalFan - 1.11.2008, 13:29 -------------------- There are always someone smarter than you... |
||||
|
|||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: нет Всего: 3 |
ничего не мешает, однако массив TSomeObject в TSomeObjectList создается из метода TSomeObjectList и как ни крути там нужно будет работать с Self. Да, можно попробовать без @Self.
Добавлено через 11 минут и 8 секунд Переделал так как ты посоветовал. Работает, но есть минус - не получается сделать каждый класс в одном файле - путанно. Ну и дальше, я чего не пойму: когда я храню адрес - трачу 4 байта, а когда я в каждом объекте TSomeObject храню по TSomeObjectList я типа тоже храню ссылку(указатель)? Конечно, получив ответ на последний вопрос, я наверное не буду париться по @Self -------------------- я не гольфист - я хоккеист |
|||
|
||||
| MetalFan |
|
||||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
при таком подходе - да. и что в этом плохого? под каждый класс отдельный юнит - непутанно??? ну-ну...
я тебе про это уже не раз говорил в предыдущих постах. еще вариант: если тебе нужен только один метод из класса-списка, то можешь хранить ссылку на него в объектах-элементах (но это уже будет по 8 байт) -------------------- There are always someone smarter than you... |
||||
|
|||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
тут ты наверное имел в виду "A:=objecticus.Addr"
Если так, то
Это демонстрация "какой указатель равен какому", а не руководство к действию. Self это указатель на объект, а @Self адрес указателя. Ежу понятно что если один и тот же указатель кранить по десяти адресам, то они будут указывать на один объект, но адреса самих указателей будут не равны, поэтому в твоем примере и не вышло равенства. Но это так, технические подробности. А по сути: на то оно и объектно-ориентированое, чтобы писать на нем объектно-ориентировано. -------------------- Обижено школьников: 8 |
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: нет Всего: 3 |
Спасибо всем. Проблема возникла вот в результате чего: В Си есть переменная, указатель на переменную(адрес) и ссылка. В паскале есть только переменная и указатель, а ссылка есть неявно - она испошльзуется "умным" паскалем, а раз ее нет - я по простоте душевной прибегнул к указателю. Но сейчас я разобрался с вашей помощью более или менее.
-------------------- я не гольфист - я хоккеист |
|||
|
||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |