Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема с ScrollBar в DBgrid, неправильно работает 
:(
    Опции темы
T1000
Дата 18.1.2007, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 18.1.2007

Репутация: нет
Всего: нет



Здравствуйте. У меня проблема - неправильно работает вертикальный скроллинг у DBGrid.
Предисловие: работаю с dbf-файлами на Advantage Database Server. Для доступа к базе в Делфи  (6ой) использую ADSConnection ADSTable DataSource DBGrid. Кол-во записей в базе порядка 2500.
Проблема: У верт. скроллбара всего три положения - вверху, в центре, внизу. И все! При перемещении по записям скроллер всегда находится в серединке. Как только достигаю конечной записи, скроллер становится внизу. Как только достигаю нулевой записи, скроллер становится вверху.
Помогите, товарищи, кто сталкивался. Надеюсь понятно объяснил.

P.S. пробовал через ADO подконнектиться к базе access. При этом в DBGrid нормально работает скролл.

Это сообщение отредактировал(а) T1000 - 18.1.2007, 18:49
PM MAIL   Вверх
dimazu
Дата 18.1.2007, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 4.3.2006

Репутация: 1
Всего: 5



Поведение скрола зависит от датасета/базы (TDataset.IsSequenced=True)
Если у тебя ADO/BDE.Paradox, то датасет знает recordcount (считываются
ВСЕ записи и скрол будет плавным), а если BDE.DBase/Oracle/MS SQL/InterBase
и т.д. - то нет (считываются только те, что будут показаны на экране).

Цитата

 Надеюсь понятно объяснил.


 smile 



Это сообщение отредактировал(а) dimazu - 18.1.2007, 20:52
PM MAIL   Вверх
T1000
Дата 18.1.2007, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 18.1.2007

Репутация: нет
Всего: нет



Базы клиперовские. Так как же мне быть?

PM MAIL   Вверх
dimazu
Дата 18.1.2007, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 4.3.2006

Репутация: 1
Всего: 5



Используй сторонние компоненты или напиши наследника TTable. (ТМемTable)  smile 

ЗЫ.   Или конвертни в Парадокс, там все работает...

Это сообщение отредактировал(а) dimazu - 18.1.2007, 23:06
PM MAIL   Вверх
Vas
Дата 19.1.2007, 08:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Самый простой способ взять DBGridEh из библиотеки EhLib, до версии 4 бесплатный вот ссылка.


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
SergeBS
Дата 19.1.2007, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



dimazu, 
Цитата
ЗЫ.   Или конвертни в Парадокс, там все работает...

А если посмотреть исходники, то выяснится: скролл имеет только 3 положения на любой индексированной таблице. В том числе и парадоксовой.
Если же подправить чуть исходники, то будет работать как на Парадоксе на  любых НЕиндексированных таблицах. Но не в дизайнере, только в ран-тайм.
PM MAIL   Вверх
T1000
Дата 19.1.2007, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 18.1.2007

Репутация: нет
Всего: нет



Ребята, спасибо вам за ответы! Я не такой матёрый делфист как вы. Расскажите, что подправить в исходниках?
А DBGridEh обязательно попробую.

Это сообщение отредактировал(а) T1000 - 19.1.2007, 17:41
PM MAIL   Вверх
SergeBS
Дата 19.1.2007, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



DBTables.pas
Код

procedure TBDEDataSet.SetRecNo(Value: Integer);
begin
  CheckBrowseMode;
//  if (FRecNoStatus = rnParadox) and (Value <> RecNo) then//SSB:
  if ((FRecNoStatus = rnParadox) and (Value <> RecNo)) or
     ((FRecNoStatus = rnDbase) and (Value <> RecNo)) then
...
function TBDEDataSet.IsSequenced: Boolean;
begin
//  Result := (FRecNoStatus = rnParadox) and (not Filtered); SSB:
  Result := ((FRecNoStatus = rnParadox) and (not Filtered)) or
       ((FRecNoStatus = rnDbase) and (not Filtered)) ;
end;

Примерно так

PM MAIL   Вверх
dimazu
Дата 20.1.2007, 04:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 4.3.2006

Репутация: 1
Всего: 5



Можно и так.  

Но, ИМХО, работать правильно все равно не будет.
Paradox и dBase не одно и тоже.

Я думаю, что при движении по одной записи (Next/Prior) (Up/Down кнопки у скрола)
и PgUp/PgDn работать как-то будет (причем при первом нажатии, по логике,
должен быть прыжок вниз на кол-во видимых записей в гриде), а при переходе
на заданный номер за пределами видимых в гриде записей (GoTo (RecNo)) - работать не будет.
Для проверки, надо зацепить ползунок у скрола и попробовать подвигать
вверх вниз. 
Мне кажется, что перехода на другую запись, кроме первой и последней быть не должно.  smile 

T.е. будет практически тоже самое, что и до изменений... 

Все относится к dBase only (с Paradox-ом и так работает без проблем)...  

ЗЫ. Если так, то может лучше все-таки прикрутить самостоятельный ScrollBar к DBGrid 
и работать с ним?
Типа вот так:
Код

unit Unit1;

interface

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

type
  TDBGrid = class(DBGrids.TDBGrid)
    procedure WMNCCalcSize(var Msg: TMessage);
      message WM_NCCALCSIZE;
  end;

type
  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    Table1: TTable;
    procedure FormCreate(Sender: TObject);
    procedure MyScroll(Sender: TObject; ScrollCode: TScrollCode;
      var ScrollPos: Integer);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure _AfterScroll(DataSet: TDataSet);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  M_Scroll : TScrollBar;

implementation

{$R *.dfm}

var NoMove:Boolean;

procedure TDBGrid.WMNCCalcSize(var Msg: TMessage);
const
  Scrollstyles = WS_VSCROLL;// OR WS_HSCROLL;
var
  Style: Integer;
begin
  Style := GetWindowLong(Handle, GWL_STYLE);
  if (Style and Scrollstyles) <> 0 then
    SetWindowLong(Handle, GWL_STYLE, Style and not Scrollstyles);
  inherited;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 M_Scroll.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Table1.Close;
 Table1.Open;
 Table1.Last;
 DBGrid1.Ctl3D:=False;
 M_Scroll:=TScrollBar.Create(Self);
 With M_Scroll do
 Begin
    Parent:=Self;
    Visible:=True;
    Enabled:=True;
    Ctl3D:=False;
    Kind:= sbVertical;
    Left:=DbGrid1.Left+DBGrid1.Width-1;
    Top:=DbGrid1.Top+1;
    Height:=DbGrid1.Height-1;
    TabStop:=False;
    Max:=Table1.RecordCount;
    OnScroll:=MyScroll;
 End;
 Table1.AfterScroll:=_AfterScroll;
 Table1.First;
end;

procedure TForm1.MyScroll(Sender: TObject; ScrollCode: TScrollCode;
  var ScrollPos: Integer);
Const PageSize = 8;
var i, Pp  : LongInt;
begin
With Table1 do
Begin
  Pp:=RecNo;
  NoMove:=True;
  DisableControls;
  if ScrollCode  in [scLineUp] then Prior;
  if ScrollCode  in [scLineDown] then Next;
  if ScrollCode  in [scTop] then First;
  if ScrollCode  in [scBottom] then Last;
  if ScrollCode  in [scPageUp] then
    for i:=1 to PageSize do Prior;
  if ScrollCode  in [scPageDown] then
    for i:=1 to PageSize do Next;
  if ScrollCode  in [scPosition] then
   begin
    if pp < ScrollPos then
     for i := pp to ScrollPos do Next;
    if pp > ScrollPos then
     for i := ScrollPos to pp do Prior;
    end;
    EnableControls;
    NoMove:=False;
 end;//With
end;

procedure TForm1._AfterScroll(DataSet: TDataSet);
begin
 if NOT NoMove then
   M_Scroll.Position:=DataSet.RecNo;
end;

end.


Это сообщение отредактировал(а) dimazu - 20.1.2007, 18:53
PM MAIL   Вверх
SergeBS
Дата 22.1.2007, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



dimazu, 
Цитата
Все относится к dBase only (с Paradox-ом и так работает без проблем)...  

А ты попробуй. Я с Парадоксом уж лет 7 точно не работаю.
PM MAIL   Вверх
T1000
Дата 30.1.2007, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 18.1.2007

Репутация: нет
Всего: нет



Проблема решилась в полной (для меня) мере. У объекта adsTable есть свойство Sequenced. Устанавливаю true и вертикальный скролл начинает нормально работать.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0483 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.