Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Vertical scroll в DbGrid [D7]


Tex ©   (2007-01-31 07:15:00) 

Здравствуйте! Возможен ли скрол DB-грида без изменения текущей записи, мастера?


Tex   (2007-01-31 13:22:00) [1]

Да я думал про огромный скроллбокс, но тоже считаю извращением. Жаль что нельзя, думал что-то можно придумать. Ладно, пожалуй, попробую с закладками. Все равно, спасибо за ответы!


Ega23   (2007-01-31 13:22:00) [2]


> Остается сделать DBGrid таклй высоты, чтобы вошел весь НД,
>  а его поместить в ScrollBox.


Ну или так. Но это изврат, согласен с ЮЮ ©.


Ega23   (2007-01-31 13:21:00) [3]


> Прокручиваем бегунок скрола куда угодно, например, вконец,
>  потом - назад, и видим, что первая строка так и осталась
> там выделенной (текущей), а не так как по стандарту - текущая
> строка носится след за скролом!


Нет. Почему - очень долго объяснять. Для этого тебе сначала надо понять взаимодействие DB-Aware контрола с набором данных. Т.е. всю связку TDataSet -> TdataSource -> TDataLink -> Отрисовка данных в контроле.

Если вкратце, то DBGrid "берёт" от DataSet в данный момент времени только те данные, которые находятся в области отрисовки грида. Например, выборка у тебя - 100 записей. Фонт грида и его высота такие, что в нём помещается не больше, например, 20 записей за раз. Так вот, он (DBGrid) в этот момент "знает" только об этих записях. Если хочешь увидеть следующую порцию, то гриду надо "подсосать" эти данные из DataSet. А это приведёт к сдвигу курсора на DataSet'е.

Вариант один: писать потомка TCustomGrid, с собственной реализацией TDataLink, такой, чтобы он брал сразу ВСЕ данные из набора данных и держал их у себя в памяти.
Сам понимаешь, при больших выборках памяти может жрать просто немеряно.


ЮЮ   (2007-01-31 13:16:00) [4]

Сказали же, что нельзя, ибо текущая запись находится среди записей DataLink-а.
Остается сделать DBGrid таклй высоты, чтобы вошел весь НД, а его поместить в ScrollBox. Но это, ИМХО, извращение. Зачем, скажи, пользователю, шарясь по тысячам записей поннить, где он  последний раз кликал по гриду? Если пользоватьель хочет быструю навигацию в определенное место, дай ему понятный интерфейс создания закладок и перемещения по ним.


Tex   (2007-01-31 12:51:00) [5]


> У DBGrid.Options свойство dgMultiSelect выстави в True.Выделять
> с зажатым Control


Да я знаю как выделять несколько строк, но причем тут это? Речь же вообще не об этом. У меня отключен в DBgrid.Options мультиселект, он мне не нужен!

Да и

> Label1.Caption := IntToStr(DBGrid1.SelectedRows.Count);

тоже...

Пожалуйста ответьте по теме. Представим 1 форму и 1 Dbgrid (С подключенной базой) без чего либо типа listbox, label и т.п. Так вот.
Сабж - можно ли отменить не нужное мне свойство - изменение текущей строки при скролировании собственным скролом DBGrid'a, т.е. чтобы при прокручивании скролом (таская бегунок его мышкой), в окне DBGrida единожды установленное выделение строки так и оставалось на этом номере записи. Т.е. щелкаем мышкой на 1 запись. Прокручиваем бегунок скрола куда угодно, например, вконец, потом - назад, и видим, что первая строка так и осталась там выделенной (текущей), а не так как по стандарту - текущая строка носится след за скролом!


Ega23   (2007-01-31 11:53:00) [6]


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, Db, ADODB, Grids, DBGrids;

type
 TForm1 = class(TForm)
   DBGrid1: TDBGrid;
   ADOConnection1: TADOConnection;
   ADODataSet1: TADODataSet;
   DataSource1: TDataSource;
   Button1: TButton;
   Button2: TButton;
   Label1: TLabel;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
ADODataSet1.Open;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 Label1.Caption := IntToStr(DBGrid1.SelectedRows.Count);
end;

end.


У DBGrid.Options свойство dgMultiSelect выстави в True.
Выделять с зажатым Control


Tex   (2007-01-31 11:46:00) [7]

Немного не ясно, а причем тут перенос в ListBox? Вы предлагаете использовать его чтоли в место дб-грид. Поясните плз.


Ega23   (2007-01-31 11:43:00) [8]

Из Delphi Help :

The following example copies the selected rows in a db grid to a list box.

procedure TForm1.Button1Click(Sender: TObject);
var
 i, j: Integer;
 s: string;
begin
 if DBGrid1.SelectedRows.Count>0 then
   with DBGrid1.DataSource.DataSet do
     for i:=0 to DBGrid1.SelectedRows.Count-1 do
     begin
       GotoBookmark(pointer(DBGrid1.SelectedRows.Items[i]));
       for j := 0 to FieldCount-1 do
       begin

         if (j>0) then s:=s+', ';
         s:=s+Fields[j].AsString;
       end;
       Listbox1.Items.Add(s);
       s:= '';
     end;
end;


Tex   (2007-01-31 11:43:00) [9]

Благодарю за ответ! Посмотрите пожалуйста!


Ega23   (2007-01-31 11:41:00) [10]

DBGrid.Options -> dgRowSelect и dgMutiSelect
+ SelectedCount + SeeAlsow

Где-то есть пример, если не долго надо будет искать, то найду...


Tex   (2007-01-31 11:38:00) [11]

Немного уточню как я себе это представляю. Допустим, пользователь выделил мышкой строку N'3 по счету сверху (всего записей пусть 1000). Далее "хватает" за скрол грида и тянет его вниз (пусть в самый конец). Хотелось бы, чтобы та самая третья строка так и оставалась выделенной (т.е. ее не видно, она висит выделенной там себе наверху :-). Просто при скроле текущая запись тоже меняется, а этого бы не хотелось. Скроллбар ДБгрида нужен только как инструмент просмотра вверх-вниз, без непосредственного "пробегания" по записям (и соответственно изменения текущей). Подскажите как реализовать это, заранее спасибо!


Ega23   (2007-01-31 11:34:00) [12]


> Возможен. У меня несколько раз такое случайно получалось.
>  Повторить и определить условия целью не задавался. Но видно
> это когда указатель текущей записи стоит на одной строке,
>  а синяя подсветка - на другой. Легко достижимо мышиным
> колесом. В принципе, как-то получалось текущую запись вообще
> за границы отображения загонять.
> Но, повторюсь, задачи такой не ставил и старательно от этого
> избавлялся.
>


Есть такой глюк. Вроде появляется при выставлении опций dgRowSelect и dgMutiSelect и при использовании прокрутки мышью.


Desdechado   (2007-01-31 11:27:00) [13]

Возможен. У меня несколько раз такое случайно получалось. Повторить и определить условия целью не задавался. Но видно это когда указатель текущей записи стоит на одной строке, а синяя подсветка - на другой. Легко достижимо мышиным колесом. В принципе, как-то получалось текущую запись вообще за границы отображения загонять.
Но, повторюсь, задачи такой не ставил и старательно от этого избавлялся.


Ega23   (2007-01-31 10:18:00) [14]

Теоретически возможен, если компонент не наследник TCustomDBGrid.
Но вот Eh-овский грид не наследник, а перерисовка видимой области один фиг на события DataLink завязана...


ЮЮ   (2007-01-31 09:31:00) [15]

Если имеется в виду, что среди отображаемых в гриде нет текущей записи (она вне экрана грида), то - нет. По, крайней мере, ни в одном из известных DBGrid-ов такое не наблюдалось. Ты, похоже, нашел новый путь в дизайне интерфейса.


Наверх

Титульная страница Поиск, карта сайта Написать письмо