Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.22;
Скачать: CL | DM;

Вниз

Vertical scroll в DbGrid   Найти похожие ветки 

 
Tex ©   (2007-01-31 07:15) [0]

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


 
ЮЮ ©   (2007-01-31 09:31) [1]

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


 
Ega23 ©   (2007-01-31 10:18) [2]

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


 
Desdechado ©   (2007-01-31 11:27) [3]

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


 
Ega23 ©   (2007-01-31 11:34) [4]


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


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


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

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


 
Ega23 ©   (2007-01-31 11:41) [6]

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

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


 
Ega23 ©   (2007-01-31 11:43) [7]

Из 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) [8]

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


 
Tex ©   (2007-01-31 11:46) [9]

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


 
Ega23 ©   (2007-01-31 11:53) [10]


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 12:51) [11]


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


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

Да и

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

тоже...

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


 
ЮЮ ©   (2007-01-31 13:16) [12]

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


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


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


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

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

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


 
Tex ©   (2007-01-31 13:22) [14]

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


 
Ega23 ©   (2007-01-31 13:22) [15]


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


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



Страницы: 1 вся ветка

Текущий архив: 2007.04.22;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.042 c
15-1174738380
Углук
2007-03-24 15:13
2007.04.22
Как сменить окно частот в БПФ?


15-1175171673
ArtemESC
2007-03-29 16:34
2007.04.22
Mail.ru у всех глючит?


15-1173046249
Суслик
2007-03-05 01:10
2007.04.22
Вот завел себе блог


15-1174584158
tesseract
2007-03-22 20:22
2007.04.22
суббота и пиво


8-1154706561
alex_bog
2006-08-04 19:49
2007.04.22
Как во время запуска плеера воспроизвести более одного файла?