Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PowerBuilder Новый топик    Ответить
 Адрес функии  [new]
pacman
Guest
Привет.
Мне неоходимо передать указатель на фукцию в качестве параметра фунции
SetWindowLongA(Handle(this),-4,/*указатель на функцию*/ MyFunctionProc);
Я объявил функцию MyFunctionProc
Но не знаю как получить ее адрес или указатель на нее.
Речь идет о Subclassing a Window и мне нужно перехватить некоторое сообщение родителя для этого надо получить адрес функции DefProc заменить ее на свою а затем вызвать снова родную.
Может кто-нибудь знает как получить указатель на функцию или event ?
Спасибо !
1 апр 04, 13:08    [607752]     Ответить | Цитировать Сообщить модератору
 Re: Адрес функии  [new]
gerss
Member

Откуда: Москва
Сообщений: 1002
В PowerBuilder в принципе нет указателей. То, что ты хочешь, сделать невозможно. Именно поэтому мне приходилось писать dll с помощью других средств (Delphi) - для реализации функций, требующих работы с указателями.
1 апр 04, 13:47    [607884]     Ответить | Цитировать Сообщить модератору
 Re: Адрес функии  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6610
Если у тебя PB9, то напиши wrapper на С++ и через PBNI вызывай твою ф-ю на PbScript.
1 апр 04, 14:41    [608055]     Ответить | Цитировать Сообщить модератору
 Re: Адрес функии  [new]
Филипп
Member

Откуда: Boston, MA, USA (c 1989 ) б. Москва
Сообщений: 1880
Pacman, может поточнее напишешь, что именно ты хочешь сделать. Как тут правильно заметили, адресов функций и callbackов в РВ нет.
Теоретически можно сделать Subclassing имея экспортированную функцию в DLLе, которая зовётся в Open eventе окна и ей передается handle окна. Она в свою очередь зовёт
SetWindowLong(hWnd, GWL_WNDPROC, (DWORD) SubClassFunc)
, SubClassFunc же живёт в DLLе.

Судя по
автор
мне нужно перехватить некоторое сообщение родителя
, может быть можно сделать проще - через other event, messaging API и т.д. и т.п.
1 апр 04, 20:21    [608806]     Ответить | Цитировать Сообщить модератору
 Re: Адрес функии  [new]
pac1man
Member

Откуда:
Сообщений: 9
Вариант с отдельной dll( на другом языке) которая поможет сделать то что надо мне нравится.

Раз уж мир не не без добрых людей на этом форуме, то разрешите немного подробнее описать проблему.
Пишу на BP7.
Все началось с того что я захотел просто немного видоизменить стандартный button. Сделать что то типа Flat.
Создал новый объект наследуемый от commandbutton.Затем согласно тому что я понял из MSDN , для того что бы рисовать его самому, изменил style в консрукторе
SetWindowLongA( Handle(this), GWL_STYLE,GetWindowLongA(Handle(this),GWL_STYLE )+ BS_OWNERDRAW )
В этом случае я отвечаю за дальнейшую прорисовку кнопки.
И здесь я задумался, а как же я поймаю сообщение
WM_DRAWITEM
This message is sent to the owner window of an owner-drawn button or menu when a visual aspect of the button or menu has changed.
( но и это еще не все)
Мой класс этого сообщения не получает , его получает владелец.
Согласно логике надо что бы вся реализация находилась в одном классе.( Кнопка должна быт универсальной , кинул на форму и все).
С этой проблемой я справился просто, написал всю прорисовку кнопки в событии pbm_paint(все отлично рисуется , кнопка получилась просто прелесть)
А затем я подумал а что если кнопка должна быть Default or Cancel( т.е. в случае если она лежит на форме с неким sle (editbox) то при нажатии Enter
должен сработать click event.
И тут я столкнулся вот с чем если Установить свойство Default =true
то кнопка получит стиль BS_DEFPUSHBUTTON соответственно , а MSDN пишет

Do not combine the BS_OWNERDRAW style with any other button styles.

А как же реализовать свою прорисовку и что бы механизм обработки кнопки по умолчанию не менять?
Может кто-нибудь знает подскажите.

Хотя на этот вопрос я кажется нашел ответ.
Извините что так много пишу.
В момент когда в sle жмем Enter ...
An application sends a DM_GETDEFID message to retrieve the identifier of the default push button control for a dialog box.

и происходит вот что...

If a default push button exists, the high-order word of the return value contains the value DC_HASDEFID and the low-order word contains the control identifier. Otherwise, the return value is zero.

Если поймать это сообщение то тогда я могу обмануть и вернуть идентификатор той кнопки которой я пожелаю.Поверив если моя переменная MyDefault =true
А для того что бы поймать это и другие сообщения владельца я должен получить указатель на функцию WindowDefaultProc( функция обработки сообщений)
Затем присвоить этому указателю адрес своей функции обработать что что мне надо и вызвать родную его, предварительно запомнив ее где-то.

Как быть ?
Спасибо за внимание
2 апр 04, 11:25    [609471]     Ответить | Цитировать Сообщить модератору
 Re: Адрес функии  [new]
ASCRUS
Member

Откуда: МО Электросталь
Сообщений: 5994
автор
Как быть ?

Оставьте все как есть. Неужели так часто в PB вы рисуете формочки с кнопками и editbox-ами ? По любому весь основной интерфейс реализуется через DataWindow, всякие кнопки и edit-ы чисто вспомогательное средство и так мучаться по моему явно не стоит. Тем более что вместо flat-кнопкок можно спокойно организовать Toolbar. Плюс приложение PB можно переключить на XP схему, просто создав манифест или поставив соотвествующую галочку в PB9. Хотя опять же по XP-шному будут только стандартные контролсы выглядеть, DataWindow по любому будет рисоваться сам.

Так что зря Вы затеялись, PB не тот язык, чтобы универсальные компоненты катать. Я не сомневаюсь, что в конце концов и на нем можно сделать что хочешь, но кроме геммора и просто огромной кучи багов ничего больше не получится. Лучше все таки использовать PB по назначению :)
2 апр 04, 15:14    [610200]     Ответить | Цитировать Сообщить модератору
 Re: Адрес функии  [new]
Филипп
Member

Откуда: Boston, MA, USA (c 1989 ) б. Москва
Сообщений: 1880
Вот тебе Flat Button

$PBExportHeader$u_cbflat.sru

forward
global type u_cbflat from commandbutton
end type
end forward

global type u_cbflat from commandbutton
integer width = 402
integer height = 112
integer textsize = -10
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Arial"
string text = "Flat?"
end type
global u_cbflat u_cbflat

type prototypes
Function long GetWindowLongA (long hWindow, integer nIndex) Library
"user32.dll"
Function long SetWindowLongA (long hWindow, integer nIndex, long dwNewLong)
Library "user32.dll"

end prototypes

type variables
CONSTANT LONG BS_FLAT = 32768
CONSTANT int GWL_STYLE = -16

end variables

on u_cbflat.create
end on

on u_cbflat.destroy
end on

event constructor;ulong ll_style
ll_style = GetWindowLongA(handle(this), GWL_STYLE)

IF ll_style <> 0 THEN
SetWindowLongA(handle(this), GWL_STYLE, ll_style + BS_FLAT)
END IF

end event
2 апр 04, 18:08    [610709]     Ответить | Цитировать Сообщить модератору
 Re: Адрес функии  [new]
pac1man
Member

Откуда:
Сообщений: 9
Спасибо.
Про BS_FLAT я и не подумал.

А как же быть с цветом? Например если я хочу надпись на кнопке вывести красным.Или Background color изменить.
5 апр 04, 10:50    [611996]     Ответить | Цитировать Сообщить модератору
 Re: Адрес функии  [new]
Филипп
Member

Откуда: Boston, MA, USA (c 1989 ) б. Москва
Сообщений: 1880
автор
А как же быть с цветом? Например если я хочу надпись на кнопке вывести красным.Или Background color изменить.
Ну, собственно для этого существует UserObject Panter, что значительно проще чем упражнения с ownerdrawn controls :-) .

Вот пример (не очень универсальный) того как делать ownerdrawn combobox без PB9 и PBNI
http://www.xs4all.nl/~onkie/pbtip020.html

Вот пример того как делать Custom-drawn ListView and TreeView Controls с PB9 и PBNI
http://powerbuilder.codexchange.sybase.com/files/documents/67/1127/CustomDrawDemo.zip
5 апр 04, 18:32    [613283]     Ответить | Цитировать Сообщить модератору
 Re: Адрес функии  [new]
Филипп
Member

Откуда: Boston, MA, USA (c 1989 ) б. Москва
Сообщений: 1880
... и вдогонку - Custom draw button using MFC and PBNI
http://powerbuilder.codexchange.sybase.com/files/documents/67/837/visualpbni.zip
5 апр 04, 18:33    [613285]     Ответить | Цитировать Сообщить модератору
Все форумы / PowerBuilder Ответить