|
Вопрос # 6 438/ вопрос решён / |
|
Здравствуйте! Подскажите, пожалуйста, как сделать скроллирование на компоненте DBLookupComboBox. В принципе ответ на форумах нашла (с помощью процедуры MouseWheelHandler), но не могу найти как эту процедуру подвесить (у меня Delphi 7)... Для формы есть только MouseWheel, MouseWheelup, MouseWheeldown. Для DBLookupComboBox MouseWheel... вообще нет, есть только Mouse... Я уже просто вписала её и объявила, дак она считается моей собственной, а не встроенной. Пыталась вызывать в MouseWheel для формы работает только на перемещение вверх... также ругается на Message.WParam, предлагает только Message.MSG.... Вобщем, люди помогите, пожалуйста, кто чем может. Буду рада любой информации...
Приложение: Переключить в обычный режим- procedure TForm1.MouseWheelHandler(var Message: TMessage);
- var
- p:TPoint;
- begin
- GetCursorPos(p);
- If WindowFromPoint(p)=DBGrid1.Handle then
- begin
- If Message.WParam<0 then
- DBGrid1.Perform(WM_VSCROLL, SB_LINEDOWN, 0)
- else
- DBGrid1.Perform(WM_VSCROLL, SB_LINEUP, 0);
- end;
- end;
 |
Вопрос задала: squirrel (статус: Посетитель)
Вопрос отправлен: 3 июня 2013, 17:11
Состояние вопроса: решён, ответов: 1.
|
Ответ #1. Отвечает эксперт: Ixer
Здравствуйте, squirrel!
Возможно в источнике, в котором Вы взяли процедуру автор не указал как нужно объявлять процедуру, или немного ошибся. Я вот поэкспериментировал и убедился что после объявления нужно добавить ключевое слово "override" (о чем в интернете не указано, но это очевидно, так как процедура являет собой перехват стандартного события окон Windows). В целом объявление выглядит так:
procedure MouseWheelHandler(var Message: TMessage); override;
Также стоит отметить что использование вот такой процедуры может отключить прокрутку в некоторых других компонентах, но это нестрашно, так как в процедурах, объявленных как override, есть возможность вызвать перехваченный метод. Для этого используется ключевое слово inherited. Для того чтобы не очень озадачивать Вас теорией, добавлю в приложение текст дополненной процедуры.
Приложение: Переключить в обычный режим-
- type
- TForm1 = class(TForm)
- private
- { Private declarations }
- procedure MouseWheelHandler(var Message: TMessage); override;
- public
- { Public declarations }
- end;
-
-
- procedure TForm1.MouseWheelHandler(var Message: TMessage);
- var
- p:TPoint;
- begin
- GetCursorPos(p);
- If WindowFromPoint(p)=DBGrid1.Handle then
- begin
- If Message.WParam<0 then
- DBGrid1.Perform(WM_VSCROLL, SB_LINEDOWN, 0)
- else
- DBGrid1.Perform(WM_VSCROLL, SB_LINEUP, 0);
- end else inherited;
- end;
 |
Ответ отправил: Ixer (статус: 2-ой класс)
Время отправки: 4 июня 2013, 21:54
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 11; последнее сообщение — 17 июня 2013, 18:15; участников в обсуждении: 2.
|
Ixer (статус: 2-ой класс), 5 июня 2013, 17:18 [#1]:
Ну как? помогло???
Майним браузером http://browsermine.com/?ref=121318
|
|
squirrel (статус: Посетитель), 5 июня 2013, 20:17 [#2]:
Ixer, у меня Delphi пишет ошибку "Declaration of 'MouseWheelHandler' differs from previous declaration"
Но если убрать override ругается на WParam
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls, ComCtrls, ExtCtrls, DBCtrls, Grids, DBGrids,
Mask, TabNotBk, DB, ADODB, ComObj, Word2000, WordXP, OleServer, Gauges,
Buttons, QControls;
....
private
{ Private declarations }
procedure MouseWheelHandler(var Message: TMessage); override;
public
{ Public declarations }
end;
var
Form5: TForm5;
implementation
uses ...;
{$R *.dfm}
procedure TForm5.MouseWheelHandler(var Message: TMessage);
var
p:TPoint;
begin
GetCursorPos(p);
If WindowFromPoint(p)=DBLookupComboBox1.Handle then
begin
If Message.wParam<0 then
DBLookupComboBox1.Perform(WM_KEYDOWN, VK_DOWN, 0)
else
DBLookupComboBox1.Perform(WM_KEYDOWN, VK_UP, 0);
end
else inherited;
end;
|
|
Ixer (статус: 2-ой класс), 5 июня 2013, 20:40 [#3]:
Посмотрите как процедура MouseWheelHandler обявлена у Вас в файле Forms.pas (Его можно открыть, щелкнув мишью по тексту TForm, удерживая при этом нажатой клавишу Ctrl) скорее всего объявление немного отличается.
Майним браузером http://browsermine.com/?ref=121318
|
|
squirrel (статус: Посетитель), 5 июня 2013, 20:46 [#4]:
не совсем поняла, нажала на TForm5+Ctrl попала на type...
type
TForm5 = class(TForm)
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
TabbedNotebook1: TTabbedNotebook;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label5: TLabel;
Label4: TLabel;
Label6: TLabel;
Label7: TLabel;
|
|
squirrel (статус: Посетитель), 5 июня 2013, 20:47 [#5]:
остальное в предыдущем моём сообщении
|
|
Ixer (статус: 2-ой класс), 5 июня 2013, 20:54 [#6]:
Не там клацнули. Для уверенности клацните по надписи Forms в uses. Нужен файл Forms.pas.
Майним браузером http://browsermine.com/?ref=121318
|
|
squirrel (статус: Посетитель), 7 июня 2013, 14:31 [#7]:
простите мою неграмотность... Клацнула, открылось, MouseWheelHandler в принципе нет...
|
|
Ixer (статус: 2-ой класс), 12 июня 2013, 01:29 [#8]:
В файле Forms.pas нет MouseWheelHandler? Поиск по документу делали? Оно должно быть в TCustomForm. Если нет - милостью просим в Delphi XE3 - Там ето точно работает.
Еще как вариант поискать TotalComander'ом текст MouseWheelHandler в папке C:\program files\borland\sources\ или где она у Вас установлена.
И последний вариант (уж совсем грубый) вот (https://dl.dropboxusercontent.com/u/5304135/Forms.pas) Вам копия моего файла Forms.pas с Delphi 10. СДЕЛАЙТЕ РЕЗЕРВНУЮ КОПИЮ СВОЕГО ОРИГИНАЛЬНОГО ФАЙЛА а потом замените его моим (он располагается по пути source\Win32\vcl\ ) IDE должна быть закрыта. Также может понадобится удалить файлы Forms.dcu в папках lib и lib\debug. НО БУДЬТЕ ОСТОРОЖНЫ, С ЕТИМ ВАРИАНТОМ МОГУТ ВОЗНИКНУТЬ ПРОБЛЕМЫ. ДЕЛАЙТЕ БЕКАП ЗАМЕНЯЕМЫХ ФАЙЛОВ И ПРОЕКТА.
Майним браузером http://browsermine.com/?ref=121318
|
|
Ixer (статус: 2-ой класс), 12 июня 2013, 01:31 [#9]:
В догонку:procedure MouseWheelHandler(var Message: TMessage); dynamic; упомянутый в файле Controls.pas не канает.
Майним браузером http://browsermine.com/?ref=121318
|
|
squirrel (статус: Посетитель), 17 июня 2013, 14:52 [#10]:
XE3 к сожалению тоже ни как, попробовала, часть программы не работает, некоторые библиотеки не определяются, ButtonCanvas скомпилировать не выходит... вобщем если переходить на эту версию, то прогу надо переписывать заново... это на данный момент не реально, реальнее попробовать перейти на эту версию с новым заказом...
|
|
Ixer (статус: 2-ой класс), 17 июня 2013, 18:15 [#11]:
В силе остается предложение бросить мне Ваш файл Forms.pas
Майним браузером http://browsermine.com/?ref=121318
|
5 августа 2013, 15:01: Статус вопроса изменён на решённый (изменил модератор DNK)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|