Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

Здравствуйте. Как прокручивать таблицу колесиком мышки? В таблице находится около 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,957
Репутация: 6832
По умолчанию

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
Репутация: 37
По умолчанию

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

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

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

Цитата:
А что в 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
Сообщений: 4,682
Репутация: 2097
По умолчанию

Код:

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
Адрес: Зеленогорск(45)
Сообщений: 346
Репутация: 52

icq: 7935888
По умолчанию

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

может проще среду сменить?
Korben5E вне форума   Ответить с цитированием
Старый 14.07.2010, 07:46   #7
S@fer
Форумчанин
 
Аватар для S@fer
 
Регистрация: 29.01.2009
Адрес: Казахстан, Усть-Каменогорск
Сообщений: 411
Репутация: 82

icq: 199167541
По умолчанию

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

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

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

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

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

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

skype: vapaa_mies
По умолчанию

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
прокрутка диаграммы в 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 14:44


17:56.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru