Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 438

/ вопрос решён /

Здравствуйте! Подскажите, пожалуйста, как сделать скроллирование на компоненте DBLookupComboBox. В принципе ответ на форумах нашла (с помощью процедуры MouseWheelHandler), но не могу найти как эту процедуру подвесить (у меня Delphi 7)... Для формы есть только MouseWheel, MouseWheelup, MouseWheeldown. Для DBLookupComboBox MouseWheel... вообще нет, есть только Mouse... Я уже просто вписала её и объявила, дак она считается моей собственной, а не встроенной. Пыталась вызывать в MouseWheel для формы работает только на перемещение вверх... также ругается на Message.WParam, предлагает только Message.MSG.... Вобщем, люди помогите, пожалуйста, кто чем может. Буду рада любой информации...

Приложение:
  1. procedure TForm1.MouseWheelHandler(var Message: TMessage);
  2. var
  3. p:TPoint;
  4. begin
  5. GetCursorPos(p);
  6. If WindowFromPoint(p)=DBGrid1.Handle then
  7. begin
  8. If Message.WParam<0 then
  9. DBGrid1.Perform(WM_VSCROLL, SB_LINEDOWN, 0)
  10. else
  11. DBGrid1.Perform(WM_VSCROLL, SB_LINEUP, 0);
  12. end;
  13. end;


squirrel Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задала: squirrel (статус: Посетитель)
Вопрос отправлен: 3 июня 2013, 17:11
Состояние вопроса: решён, ответов: 1.

Ответ #1. Отвечает эксперт: Ixer

Здравствуйте, squirrel!
Возможно в источнике, в котором Вы взяли процедуру автор не указал как нужно объявлять процедуру, или немного ошибся. Я вот поэкспериментировал и убедился что после объявления нужно добавить ключевое слово "override" (о чем в интернете не указано, но это очевидно, так как процедура являет собой перехват стандартного события окон Windows). В целом объявление выглядит так:

procedure MouseWheelHandler(var Message: TMessage);  override;
Также стоит отметить что использование вот такой процедуры может отключить прокрутку в некоторых других компонентах, но это нестрашно, так как в процедурах, объявленных как override, есть возможность вызвать перехваченный метод. Для этого используется ключевое слово inherited. Для того чтобы не очень озадачивать Вас теорией, добавлю в приложение текст дополненной процедуры.

Приложение:
  1.  
  2. type
  3. TForm1 = class(TForm)
  4. private
  5. { Private declarations }
  6. procedure MouseWheelHandler(var Message: TMessage); override;
  7. public
  8. { Public declarations }
  9. end;
  10.  
  11.  
  12. procedure TForm1.MouseWheelHandler(var Message: TMessage);
  13. var
  14. p:TPoint;
  15. begin
  16. GetCursorPos(p);
  17. If WindowFromPoint(p)=DBGrid1.Handle then
  18. begin
  19. If Message.WParam<0 then
  20. DBGrid1.Perform(WM_VSCROLL, SB_LINEDOWN, 0)
  21. else
  22. DBGrid1.Perform(WM_VSCROLL, SB_LINEUP, 0);
  23. end else inherited;
  24. end;


Ответ отправил: Ixer (статус: 2-ой класс)
Время отправки: 4 июня 2013, 21:54
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 11; последнее сообщение — 17 июня 2013, 18:15; участников в обсуждении: 2.
Ixer

Ixer (статус: 2-ой класс), 5 июня 2013, 17:18 [#1]:

Ну как? помогло???
Майним браузером http://browsermine.com/?ref=121318
squirrel

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

Ixer (статус: 2-ой класс), 5 июня 2013, 20:40 [#3]:

Посмотрите как процедура MouseWheelHandler обявлена у Вас в файле Forms.pas (Его можно открыть, щелкнув мишью по тексту TForm, удерживая при этом нажатой клавишу Ctrl) скорее всего объявление немного отличается.
Майним браузером http://browsermine.com/?ref=121318
squirrel

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

squirrel (статус: Посетитель), 5 июня 2013, 20:47 [#5]:

остальное в предыдущем моём сообщении
Ixer

Ixer (статус: 2-ой класс), 5 июня 2013, 20:54 [#6]:

Не там клацнули. Для уверенности клацните по надписи Forms в uses. Нужен файл Forms.pas.
Майним браузером http://browsermine.com/?ref=121318
squirrel

squirrel (статус: Посетитель), 7 июня 2013, 14:31 [#7]:

простите мою неграмотность... Клацнула, открылось, MouseWheelHandler в принципе нет...
Ixer

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

Ixer (статус: 2-ой класс), 12 июня 2013, 01:31 [#9]:

В догонку:
procedure MouseWheelHandler(var Message: TMessage); dynamic;
упомянутый в файле Controls.pas не канает.
Майним браузером http://browsermine.com/?ref=121318
squirrel

squirrel (статус: Посетитель), 17 июня 2013, 14:52 [#10]:

XE3 к сожалению тоже ни как, попробовала, часть программы не работает, некоторые библиотеки не определяются, ButtonCanvas скомпилировать не выходит... вобщем если переходить на эту версию, то прогу надо переписывать заново... это на данный момент не реально, реальнее попробовать перейти на эту версию с новым заказом...
Ixer

Ixer (статус: 2-ой класс), 17 июня 2013, 18:15 [#11]:

В силе остается предложение бросить мне Ваш файл Forms.pas
Майним браузером http://browsermine.com/?ref=121318

5 августа 2013, 15:01: Статус вопроса изменён на решённый (изменил модератор DNK)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 16:28
Выполнено за 0.03 сек.