Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2010, 09:40   #1
Сергей089
Форумчанин
 
Регистрация: 22.09.2008
Сообщений: 214
По умолчанию Прокрутка таблицы колесом мышки

Здравствуйте. Как прокручивать таблицу колесиком мышки? В таблице находится около 1000 записей. В DBGrid-е отображается часть записей, и колесом получается пробегать только эту часть записей.

Пробовал такое:
Код:
procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean);
 var
   i: SmallInt;
 begin
   {Mouse wheel behaves strangely with dgbgrids - this proc sorts this out}
   if Msg.message = WM_MOUSEWHEEL then
   begin
     Msg.message := WM_KEYDOWN;
     Msg.lParam := 0;
     i := HiWord(Msg.wParam);
     if i > 0 then
       Msg.wParam := VK_UP
     else
       Msg.wParam := VK_DOWN;

     Handled := False;
   end;
 end;

procedure TForm1.FormShow(Sender: TObject);
begin
Application.OnMessage := Form1.AppMessage;
...
end;
Но тогда вертикальная полоса прокрутки работает только в три положения: 1-ая запись, середина, последняя запись.
Сергей089 вне форума Ответить с цитированием
Старый 12.07.2010, 09:53   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Msg.wParam := VK_UP замени на dbgrid.DataSource.DataSet.findNext;
Msg.wParam := VK_DOWN; замени на dbgrid.DataSource.DataSet.findPrior ;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.07.2010, 10:12   #3
Сергей089
Форумчанин
 
Регистрация: 22.09.2008
Сообщений: 214
По умолчанию

Прикольно, но не то. Полоса также работает на 3 положения, и приходится определять с какой таблицей работает пользователь. А что в DBGrid вообще нельзя колесом ползоваться?

Нашел тему
Научите, пожалуйста, работать с колесом мыши и DBGrid'ом.. А что за "Faq Михалыха"?

Последний раз редактировалось Сергей089; 12.07.2010 в 10:35.
Сергей089 вне форума Ответить с цитированием
Старый 12.07.2010, 10:47   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
А что в DBGrid вообще нельзя колесом ползоваться?
Да там не прикручивали эту фичку
Я вот для себя делал когда-то:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, DBGrids, DB, ADODB;

type
  TDBGrid = class(DBGrids.TDBGrid)
   procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
  end;

  TForm1 = class(TForm)
    ADOTable1: TADOTable;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}



{ TDBGrid }

procedure TDBGrid.WMVScroll(var Message: TWMVScroll);
begin
 Form1.Caption:=IntToStr(Message.Pos);
 Form1.ADOTable1.MoveBy(Message.Pos-Form1.ADOTable1.RecNo);
end;

end.
Тут правда про скролл идет речь, но и для ролера тоже можно подобное сделать.
Цитата:
А что за "Faq Михалыха"?
Ну видимо Михалыч собрал кучу тем и ответов. поищи, вполне возможно что там найдешь ответ
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.07.2010, 08:50   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Код:
Tform1=class(Tform)
private
    procedure DoMyWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
   procedure OnCreate(sender: TObject);
end;

procedure TForm1.DoMyWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
  if wheeldelta<0 then
    TDBGrid(sender).DataSource.DataSet.Next
  else if wheeldelta>0 then
    TDBGrid(sender).DataSource.DataSet.Prior;
  handled:=true;// обработка закончена. блокировать другие обработчики.
end;

procedure Tform1.Oncreate(sender:TObject);
begin
  dbgid1.onhweel:=self.domyWheel;
end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 13.07.2010, 16:56   #6
Korben5E
Форумчанин
 
Аватар для Korben5E
 
Регистрация: 13.07.2010
Сообщений: 346
По умолчанию

в старых ДБгридах колесо не работало - у меня БДС2006(турбо версия) в ней колесо работает нормально

может проще среду сменить?
Non est culpa vin, sed culpa bibentis
Korben5E вне форума Ответить с цитированием
Старый 14.07.2010, 07:46   #7
S@fer
Форумчанин
 
Аватар для S@fer
 
Регистрация: 29.01.2009
Сообщений: 411
По умолчанию

Установите библиотеку компонентов Ehlib
S@fer вне форума Ответить с цитированием
Старый 02.08.2018, 10:53   #8
Dron_Martin
Новичок
Джуниор
 
Регистрация: 04.09.2008
Сообщений: 1
По умолчанию

Как жаль, что я попал на эту тему так поздно.
Но может кому-то информация пригодится.

Если в качестве источника данных используются такие компоненты T*Query, T*DataSet (за исключением компонентов T*Table), то скроллинг в DBGrid работает не идеально, полоса прокрутки хромает (прыгает только по трем положениям), а свойство RecordCount у набора данных работает некорректно до тех пор, пока не будет найдена последняя запись.

Чтобы исключить все подобные глюки, достаточно после открытия набора данных выполнить метод .Last (при необходимости тут же вернуться .First).

У стандартного TDBGrid полоса прокрутки после этого начинает работать нормально. Но если нужна полноценная прокрутка колесом мыши, то использовать компонент TDBGridEh (из библиотеки EHLib 3.6 например), как писал S@fer
Dron_Martin вне форума Ответить с цитированием
Старый 02.08.2018, 11:18   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
свойство RecordCount у набора данных работает некорректно
Все корректно, в нем количество записей в датасете на клиенте, а когда выполнишь last, то с курсора на сервере все записи на клиент попадут, поэтому так и происходит. Если курсор клиентский в датасете, то сразу все записи на клиенте будут
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 04.08.2018, 13:15   #10
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,755
По умолчанию

Цитата:
Сообщение от Dron_Martin Посмотреть сообщение
Если в качестве источника данных используются такие компоненты T*Query, T*DataSet (за исключением компонентов T*Table), то скроллинг в DBGrid работает не идеально, полоса прокрутки хромает (прыгает только по трем положениям), а свойство RecordCount у набора данных работает некорректно до тех пор, пока не будет найдена последняя запись.
На самом деле поведение зависит от используемых компонентов для доступа к БД. Продвинутые компоненты умеют грузить только первые ~50 записей при открытии запроса, чтобы уменьшить трафик между клиентом и сервером и ускорить отклик программы. В таких компонентах обычно есть отдельное свойство, отвечающее за получение полного числа записей запроса.

В компонентах ODAC это QueryRecordCount, если мне не изменяет память. Установка QueryRecordCount = True заставляет компонент отправлять на сервер отдельный вызов с запросом count(*), и RecordCount имеет актуальное значение. Или же можно поставить FetchAll = True, чтобы при открытии запроса вытягивались все записи. Актуально для итоговых или аналитических запросов, которые могут выполняться долго, но не содержат данных, подлежащих редактированию.
Vapaamies вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
прокрутка диаграммы в c++ Elenka89 Общие вопросы C/C++ 0 03.05.2010 20:27
Memo прокуртка колесом san72 Компоненты Delphi 3 08.06.2009 03:48
Скролирование списка колесом мыши в VBA bag Microsoft Office Excel 4 02.05.2009 13:01
Прокрутка nala HTML и CSS 0 29.09.2008 16:15
Научите, пожалуйста, работать с колесом мыши и DBGrid'ом. фЁдОр БД в Delphi 16 11.03.2008 13:44