Главная страница
    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.47 MB
Время: 0.012 c
1-82279
AllDer
2003-09-13 02:01
2003.09.25
Как использовать указатели в классах ?


3-82060
Alik$
2003-08-22 15:47
2003.09.25
Report как создать свою форму для принтера


14-82491
Basilio
2003-09-05 18:50
2003.09.25
Кто-нибудь знает более-менее живой форум по Kylix? (-)


3-82078
alex-ran
2003-09-05 15:23
2003.09.25
Проблема с функциями в SQL


6-82372
Calm
2003-07-25 17:15
2003.09.25
Сокеты - клиент не может стартовать раньше сервера?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский