Форум: "Базы";
Текущий архив: 2007.04.22;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.073 c