powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Адрес функии
10 сообщений из 10, страница 1 из 1
Адрес функии
    #32465399
pacman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет.
Мне неоходимо передать указатель на фукцию в качестве параметра фунции
SetWindowLongA(Handle(this),-4,/*указатель на функцию*/ MyFunctionProc);
Я объявил функцию MyFunctionProc
Но не знаю как получить ее адрес или указатель на нее.
Речь идет о Subclassing a Window и мне нужно перехватить некоторое сообщение родителя для этого надо получить адрес функции DefProc заменить ее на свою а затем вызвать снова родную.
Может кто-нибудь знает как получить указатель на функцию или event ?
Спасибо !
...
Рейтинг: 0 / 0
Адрес функии
    #32465499
gerss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В PowerBuilder в принципе нет указателей. То, что ты хочешь, сделать невозможно. Именно поэтому мне приходилось писать dll с помощью других средств (Delphi) - для реализации функций, требующих работы с указателями.
...
Рейтинг: 0 / 0
Адрес функии
    #32465632
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если у тебя PB9, то напиши wrapper на С++ и через PBNI вызывай твою ф-ю на PbScript.
...
Рейтинг: 0 / 0
Адрес функии
    #32466201
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pacman, может поточнее напишешь, что именно ты хочешь сделать. Как тут правильно заметили, адресов функций и callbackов в РВ нет.
Теоретически можно сделать Subclassing имея экспортированную функцию в DLLе, которая зовётся в Open eventе окна и ей передается handle окна. Она в свою очередь зовёт
Код: plaintext
SetWindowLong(hWnd, GWL_WNDPROC, (DWORD) SubClassFunc)
, SubClassFunc же живёт в DLLе.

Судя по автормне нужно перехватить некоторое сообщение родителя, может быть можно сделать проще - через other event, messaging API и т.д. и т.п.
...
Рейтинг: 0 / 0
Адрес функии
    #32466735
pac1man
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вариант с отдельной dll( на другом языке) которая поможет сделать то что надо мне нравится.

Раз уж мир не не без добрых людей на этом форуме, то разрешите немного подробнее описать проблему.
Пишу на BP7.
Все началось с того что я захотел просто немного видоизменить стандартный button. Сделать что то типа Flat.
Создал новый объект наследуемый от commandbutton.Затем согласно тому что я понял из MSDN , для того что бы рисовать его самому, изменил style в консрукторе
Код: plaintext
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( функция обработки сообщений)
Затем присвоить этому указателю адрес своей функции обработать что что мне надо и вызвать родную его, предварительно запомнив ее где-то.

Как быть ?
Спасибо за внимание
...
Рейтинг: 0 / 0
Адрес функии
    #32467236
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторКак быть ?
Оставьте все как есть. Неужели так часто в PB вы рисуете формочки с кнопками и editbox-ами ? По любому весь основной интерфейс реализуется через DataWindow, всякие кнопки и edit-ы чисто вспомогательное средство и так мучаться по моему явно не стоит. Тем более что вместо flat-кнопкок можно спокойно организовать Toolbar. Плюс приложение PB можно переключить на XP схему, просто создав манифест или поставив соотвествующую галочку в PB9. Хотя опять же по XP-шному будут только стандартные контролсы выглядеть, DataWindow по любому будет рисоваться сам.

Так что зря Вы затеялись, PB не тот язык, чтобы универсальные компоненты катать. Я не сомневаюсь, что в конце концов и на нем можно сделать что хочешь, но кроме геммора и просто огромной кучи багов ничего больше не получится. Лучше все таки использовать PB по назначению :)
...
Рейтинг: 0 / 0
Адрес функии
    #32467624
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот тебе Flat Button

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
$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
...
Рейтинг: 0 / 0
Адрес функии
    #32468642
pac1man
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо.
Про BS_FLAT я и не подумал.

А как же быть с цветом? Например если я хочу надпись на кнопке вывести красным.Или Background color изменить.
...
Рейтинг: 0 / 0
Адрес функии
    #32469621
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА как же быть с цветом? Например если я хочу надпись на кнопке вывести красным.Или 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
...
Рейтинг: 0 / 0
Адрес функии
    #32469623
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... и вдогонку - Custom draw button using MFC and PBNI
http://powerbuilder.codexchange.sybase.com/files/documents/67/837/visualpbni.zip
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Адрес функии
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]