Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.09.25;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.015 c
1-82272
MakNik
2003-09-15 12:03
2003.09.25
QRDBText & StringGrid


14-82501
Rouse_
2003-08-31 04:46
2003.09.25
Перепись (Уже нормальная)


14-82500
Vlad Oshin
2003-08-26 10:06
2003.09.25
Калькулятор MK-61. Как бы что-то типа массива получить?


4-82567
YY
2003-07-21 22:53
2003.09.25
Transparent icons and Active Desktop


14-82502
data
2003-09-05 14:30
2003.09.25
сказка о сисадмине - 2





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский