Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.25;
Скачать: CL | DM;

Вниз

WindowProc для TToolButton   Найти похожие ветки 

 
Doid   (2003-09-12 14:22) [0]

Можно каким-нибудь способом установить функцию обработки событий на объект класса TToolButton?


 
mrcat ©   (2003-09-12 14:28) [1]

например, в OnCreate родителя сделать следующее:

procedure TfrmDoid.FormCreate(Sender: TObject);
begin
FOldToolButton := ToolButton.WindowProc;
ToolButton.WindowProc := NewToolButtonWindowProc;
end;

procedure TfrmDoid.NewToolButtonWindowProc(var Message: TMessage);
begin
if Assigned(FOldToolButton) then FOldToolButton(Message);
end;


---
{ Private declarations }
FOldToolButton: TWndMethod;
procedure NewToolButtonWindowProc(var Message: TMessage);


 
Doid   (2003-09-12 15:25) [2]

А если обработчик сообщения - простая функция(не лежит ни в каких классах) и она лежит в DLL?


 
mrcat ©   (2003-09-12 15:32) [3]

procedure TfrmDoid.NewToolButtonWindowProc(var Message: TMessage);
begin

if Assigned(FOldToolButton) then FOldToolButton(Message);
Функция_которая_лежит_в_DLL(Параметры);
end;


 
Doid ©   (2003-09-15 09:41) [4]

Честно говоря у меня проблема с BCB6 :). Просто здесь форум по Delphi. Вот я и решил спросить как это делается в Delphi. Дело в том, что в Builder при объявлении прототипа функции-обработчика участвует ключевое слово __closure, с которым объявить простую функцию-обработчик у меня не получилось. Если функция-обработчик является членом класса формы - проблем нет. Но если она является простой функцией (не принадлежит классу формы), то тут возникают проблемы. Видимо проблем с таким объявлением в Delphi нет. Тут возможны два варианта:
1. Найти способ как все-таки объявляется с этим ключевым словом прототип функции-обработчика.
2. Воспользоваться функцией SetWindowLong с параметром nIndex = GWL_WNDPROC (Данный вариант буду пробовать в самом ближайшем будущем).


 
NAlexey ©   (2003-09-15 09:50) [5]

>Doid ©
Скорее всего 2й вариант. Подменяй ей(кнопке) WndProc и обрабатывай как надо.


 
Doid ©   (2003-09-15 11:37) [6]

В процессе реализации возник вопрос: Как вытащить Handle у ToolButton`а? Смотрел иерархию классов: ToolBar наследуется от TWinControl(у этого класса как раз свойство Handle), а ToolButton - от TGraphicControl(у него что-то я не обнаружил хендлоподобного свойства :( ). Можно попробовать вешать обработчик на ToolBar, но как тогда узнать какой из ToolButton`ов был нажат?


 
dima_shapkin ©   (2003-09-15 11:56) [7]

TTollButton как бы просто рисунок на канве и никакое отношение к окну не имеет. Все свойства и события создаются программистами VCL.


 
nikkie ©   (2003-09-15 12:23) [8]

>Если функция-обработчик является членом класса формы - проблем нет. Но если она является простой функцией (не принадлежит классу формы), то тут возникают проблемы. Видимо проблем с таким объявлением в Delphi нет.
В дельфи точно такие же проблемы. Сделай членом класса. Однако, dima_shapkin уже сказал, Handle у TToolButton нет, поскольку это не окно. И хотя у него есть WindowProc, пронаследованный от TComponent, что он будет ловить, я не знаю.


 
Doid ©   (2003-09-15 16:04) [9]

В общем, проблему я решил следующим образом: создал в DLL-ке форму (показываться она не будет никогда). Кинул на нее тулбар с кнопками. Поместил ImageList с картинками( таким образом, я получил хранилище визуальных компонентов, которые будут добавляться в приложение). А в функции MountToolBar сделал следующую вещь:

...
DWORD MountToolBar(void* _AppToolBarContainer)
{
TWinControl* locAppToolBarContainer;

locAppToolBarContainer = static_cast<TWinControl*>(_AppToolBarContainer);
try
{
locAppToolBarContainer->InsertControl(fmTaskRess->tlbrTasking);
...

Обработчики событий в DLL вызываются из приложения корректно.
Всем спасибо!



Страницы: 1 вся ветка

Текущий архив: 2003.09.25;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.036 c
4-82545
R0man
2003-07-25 08:08
2003.09.25
Как изменить иконку программы не используя unit forms?


6-82349
Borealis
2003-07-20 17:02
2003.09.25
По имени компьютера в домене его IP-адрес


1-82221
Olvin
2003-09-12 11:21
2003.09.25
Как удалить переход на новую при вставке текста в МЕМО ???


8-82337
Nikos
2003-05-25 14:03
2003.09.25
Проблема с функцией PlaySound


7-82513
Xandr
2003-07-14 08:13
2003.09.25
Модем