![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
Ak47black |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: 1 Всего: 0 |
Здравствуйте.
Меня интересует как в Delphi можно передать процедуру как параметр функции. А если подробней то вот такой код для примера. Объявляю тип
и делаю саму процедуру куда буду передавать
При нажатии кнопки например делаю так
Так вот как видно мне нужно передать не сам адрес по которому находиться функция(WndProc) ,а адрес переменной отвечающий за эту функцию. При выполнение выше приведенного кода у меня эррор
Как на Delphi это правильно сделать? |
||||||||
|
|||||||||
Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
зачем of object ? -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. ![]() |
|||
|
||||
Ak47black |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: 1 Всего: 0 |
Romikgy, ну так пишется вроде.
А что он означает? |
|||
|
||||
Yanis |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2937 Регистрация: 9.2.2004 Где: Москва Репутация: 72 Всего: 111 |
Забыл. Надо @@ вместо @ использовать, что бы получить адрес переменной-процедуры/функции. И всего делов.
|
|||
|
||||
Ak47black |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: 1 Всего: 0 |
Ну например так
и так
Не работает. |
||||
|
|||||
Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
ИМХО это говорит о том что эта процедура является частью объекта -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. ![]() |
|||
|
||||
Ak47black |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: 1 Всего: 0 |
Мм так как-тут бы сделать тогда?
|
|||
|
||||
Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 49 Всего: 76 |
Ak47black, я так и не понял проблемы...
![]() Так не катит?
-------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Это говорит о том что процедура является методом объекта я является записью из двух указателей, указателя на функцию и указателя на экземпляр объекта. Такой тип несовместим с обычным процедурным типом, потому при передаче обычной функции "of Object" нужно опускать. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Bose |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
Ak47black, определись что тебе надо передавать как параметр
метод класса
или процедуру
|
||||
|
|||||
Ak47black |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: 1 Всего: 0 |
Rennigth, ты передаёшь адрес функции ,а мне нужно передать адрес переменной в которой храниться адрес функции в этот проблема и заключается.
Bose, тут метод класса как я вижу. |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Ak47black, так писать неправильно, адрес функции должен оставаться адресом функции, зачем же его приводить к типу Pointer?
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Yanis |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2937 Регистрация: 9.2.2004 Где: Москва Репутация: 72 Всего: 111 |
|
||||
|
|||||
Bose |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
да =) По-моему вы тут всё перемудрили с этими адресами. Вот простейший 100% работающий код из моего проекта(упрощённый вариант):
ForEachComponent вызывает процедуру-параметр aActionProcedure для каждого дочернего компонента aParent. А вот так вот этим всем пользуюсь:
И никаких явных манипуляций с адресами! ![]() Это сообщение отредактировал(а) Bose - 1.8.2007, 18:31 |
||||
|
|||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
а на кой ляд тут var-параметр? -------------------- There are always someone smarter than you... |
|||
|
||||
Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
||||
|
||||
Ak47black |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: 1 Всего: 0 |
Yanis, ты можешь привести пример с WndProc ,ато я тут попробовал и невыход.
Ну надеюсь вы поняли что я хочу передать WndProc - главная процедура обработки сообщений окна, так вот я хочу передать в компонент чтобы он перенаправил её на свою процедура ,а та вызывала-бы настояшию, конечно я могу сделать это и на прямую(через присвоение), но ради спортивного интереса хочу научиться передавать переменную-процедуру. Почему-то например Integer можно так передать ,а почему с функцией нето? Тот код который в первом сообщении отражает суть проблемы. Это сообщение отредактировал(а) Ak47black - 1.8.2007, 17:18 |
|||
|
||||
Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
Ak47black, убери у себя var и посмотри мой пример. |
|||
|
||||
Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 49 Всего: 76 |
эт как? ![]() Как я понимаю то, что ты подразумеваешь под этим есть не что иною как адресс на точку входа в процедуру. И вот скажи мне какая разница, будешь ты передавать через дополнительну переменную на эту процедуру или сразу указывать @Someproc.
Чесслово, себе и другим морочишь мозги. А на счет var параметра как Bose тебе правильно уже сказал, убери его. Просто компилятор немного боиться таких маневров ![]() -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
Ak47black |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: 1 Всего: 0 |
Неа. У каждой формы есть переменная в которой храниться адрес процедуры обработки сообщений, вот я эту переменную и хочу передать. ![]() Это сообщение отредактировал(а) Ak47black - 1.8.2007, 17:59 |
|||
|
||||
Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 49 Всего: 76 |
Ну а что тебя останавлявает?
-------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
Yanis |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2937 Регистрация: 9.2.2004 Где: Москва Репутация: 72 Всего: 111 |
Была в своё время задачка на интерес:
Отгадайте как она решалась? |
|||
|
||||
Ak47black |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: 1 Всего: 0 |
Rennigth, не мне навороты не нужны.
Я могу тогда просто прямым способом присвоить, я просто хочу узнать как передать переменную в которой храниться адрес обработки сообщений окна. Тут Yanis писал чтото близкое к ответу.
Только мне не адрес нужен ,а переменную, хотя можно приравнять адрес к переменной. Я надеюсь чётко написал что я хочу сделать, если нет то извиняюсь, скажите если что. |
|||
|
||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 3 Всего: 9 |
Ak47black,
Читал усиленно всю тему. Но так и не понял, что в конце концов ты хочешь?! Но то что я понял, это CALLBACK ф-ция при регистрации окна. Если это так, то рекомендую обрабратиться к DRKB или DelphiWorld и поглядеть, как же там реализовано создание и отображение окна на чистом WinAPI. Да думаю ради увеличения знаний стоит туда глянуть очень даже стоит. ЗЫ: Я вероятно не понял темы, прошу выразить задачу более отчетливо! |
|||
|
||||
Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
Я так и не понял, в чем проблема. Примеров приведено достаточно. Так или иначе вот ещё один вариант:
Я только одного не понимаю: на хрена тебе именно переменная-то сдалась. Это сообщение отредактировал(а) Bose - 1.8.2007, 20:16 |
|||
|
||||
Yanis |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2937 Регистрация: 9.2.2004 Где: Москва Репутация: 72 Всего: 111 |
||||
|
||||
Ak47black |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: 1 Всего: 0 |
Ну попробую так объяснить проблему, ок. на простых данных сначала.
Есть вот такой код
Этот код передаёт переменную i в процедуру SomeProc там её приравниваем 5. Это надеюсь все поймут. Теперь тоже самое с переменной которая содержит процедуру обработки окон.
Вот так надеюсь понятно ![]() Добавлено через 2 минуты и 7 секунд Yanis,
Так чтоли. |
||||||
|
|||||||
Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
Ну да. Потому что WndProc - это не переменная, которую мы могли бы изменить, а процедура. Ясно. Насколько я понял ты хочешь заменить стандартную оконную процедуру WndProc. Единственный способ который мне приходит в голову: Это создать наследника у которого перекрыт(overriden) метод WndProc. Всегда убивают такие постановки задачи. Тут прежде чем найти решенить задачу, нужно найти что именно решать. Ребус в ребусе... |
|||
|
||||
Yanis |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2937 Регистрация: 9.2.2004 Где: Москва Репутация: 72 Всего: 111 |
Ну ты попробуй этот код запусти ;) Надо добиться, что бы мой код работал -- два раза показал MessageBox. Добавлено @ 20:50 Как мне кажется я понял, что хочет Ak47black и моя задачка является самым ярким примером. Гипотетически Ak47black именно её и надо решить. Это сообщение отредактировал(а) Yanis - 1.8.2007, 20:50 |
|||
|
||||
MetalFan |
|
||||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
ну еще шляпу снять нафиг
Это сообщение отредактировал(а) MetalFan - 1.8.2007, 20:58 -------------------- There are always someone smarter than you... |
||||
|
|||||
Bose |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
Насколько я понял решение ты сам и приводил сегодня тут
Хммм... посмотрим Мне больше интересно понимает ли Ak47black сам чего хочет и как он это всё-таки реализует ![]() |
||||
|
|||||
Yanis |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2937 Регистрация: 9.2.2004 Где: Москва Репутация: 72 Всего: 111 |
А ты не снимай ;) Так же интересней. Добавлено через 1 минуту и 18 секунд Ak47black Мож забьёшь на задачу? ![]() |
|||
|
||||
Ak47black |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: 1 Всего: 0 |
Yanis, ну к этому дело идёт
![]() Наверно тут нереально сделать так. Но просто интересно.
Сохраняю старую процедуру->приравниваю свою которая процеживает сообшения->вызываю старую Только это всё хочу в классе сделать. Это сообщение отредактировал(а) Ak47black - 1.8.2007, 21:40 |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
две собаки не катят. компилятор ругаецца. если только еще одну переменную вводить. иначе - никак -------------------- There are always someone smarter than you... |
|||
|
||||
Ak47black |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: 1 Всего: 0 |
Ну да некатит ![]() По логике если можно передать Integer переменную, то почему нельзя переменную в которой храниться адрес процедуры. Они вроде даже и по размеру одинаковые. Это сообщение отредактировал(а) Ak47black - 1.8.2007, 21:36 |
|||
|
||||
Yanis |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2937 Регистрация: 9.2.2004 Где: Москва Репутация: 72 Всего: 111 |
2 MetalFan, Ak47black
addr := @@proc; |
|||
|
||||
Ak47black |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: 1 Всего: 0 |
Yanis, блин извращения
![]() Я что на Test процедуру посмотрел ![]() |
|||
|
||||
Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
Занудно: Не приравниваю а присваиваю. Нельзя так просто взять и присвоить что-то процедуре. Присваивать можно только переменным. В данном топике все мои примеры касались переменных процедурного типа. Чтобы решить твою задачу через попу, можно попробовать поковыряцца с таблицей адресов методов( не помню как она называется), может быть можно повесить хук(в них я вообще ничего не понимаю). А идеальный и верный с моей точки зрения вариант - это написать наследника который перекрывает WndProc и фильтрует сообщения. Хотя если тебе нужно реализовать такую фильрацию для кучи чужих разнородных компонент, то это тоже не вариант. ![]() |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
мда) аналогично) ну да, я просто "пропустил" первую строку -------------------- There are always someone smarter than you... |
|||
|
||||
Ak47black |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: 1 Всего: 0 |
Bose, лан я тут просто могу напрямую присвоить.
Просто хотел убедиться что так нельзя. |
|||
|
||||
Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
Если ты изначально хотел присвоить, то почему не написал так в вопросе? ![]() Гони плюс как компенсацию за потраченные нервы и время! ![]() Это сообщение отредактировал(а) Bose - 2.8.2007, 00:29 |
|||
|
||||
Yanis |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2937 Регистрация: 9.2.2004 Где: Москва Репутация: 72 Всего: 111 |
||||
|
||||
Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 49 Всего: 76 |
Yanis,
Так нагляднее чем через две собаки ![]()
пысы: Сорь что переименовал переменную, но есть такая (Addr) функция которой как раз можно воспользоваться ![]() -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
Rennigth, да те же яйца... я бы не сказал, что нагляднее)
-------------------- There are always someone smarter than you... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |