Форум: "Основная";
Текущий архив: 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.01 c