Форум: "Базы";
Текущий архив: 2003.08.25;
Скачать: [xml.tar.bz2];
ВнизКак избежать скроллирования DBGrid при обновлении набора данных? Найти похожие ветки
← →
Afteam (2003-07-31 10:46) [0]Есть у меня подключенная к набору данных сетка. Как добиться того, чтобы при обновлении набора данных не происходило скролирование сетки? Сейчас код такой:
var N: Integer;
---
N:=qObject.RecNo;
qObject.DisableControls;
qObject.Close;
qObject.Open;
qObject.RecNo:=N;
qObject.EnableControls;
При выполнении этого кода текущая запись возвращается, но сетка прокручивается таким образом, что текущая запись находится ровно посередине сетки. Как избежать этой прокрутки?
← →
HSolo (2003-07-31 10:57) [1]А если так:
dbgrid.DataSource := nil;
<обновление набора данных>
dbgrid.DataSource := тот-что-был;
← →
Соловьев (2003-07-31 10:59) [2]
> При выполнении этого кода текущая запись возвращается, но
> сетка прокручивается таким образом, что текущая запись находится
> ровно посередине сетки. Как избежать этой прокрутки?
BookMark
← →
KSergey (2003-07-31 11:39) [3]При выполнении этого кода текущая запись возвращается, но сетка прокручивается таким образом, что текущая запись находится ровно посередине сетки. Как избежать этой прокрутки?
В смысле визуально по середине сетки? Ну это, наверное, "правильно" ;), и думаю, что BookMark тут не спасут - тоже самое получится.
Тут надо в самом гриде что-то делать
Есил не ошибаюсь, у него есть какая-то внутренняя переменная, хранящая верхнюю отображаемую строку. Точно не скажу, смотреть надо
Видимо куда-то туда рыть, если я правильно уловил проблему.
← →
Dred2k (2003-07-31 12:16) [4]Мда, есть такой неприятный эффект.
У предка TDBGrid есть проперти Row и VisibleRowCount. В TRxDBGrid они вынесены в public, поэтому задача решается манипулированием этими значениями и "подгоном" положения записи операциями Next и Prior. Вот пример таких манипуляций (процедура работает с TRxDBGrid и выравнивает строку с записью вниз или вверх - так удобно нашим юзерам).
procedure DBGridAlignSelection(ADBGrid : TRxDBGrid);
var ADataSet : TDataSet;
i : Integer;
BeforeScroll, AfterScroll : TDataSetNotifyEvent;
tmpRecNo : Integer;
OK : Boolean;
begin
if(not Assigned(ADBGrid)) then
exit;
if(not Assigned(ADBGrid.DataSource)) then
exit;
ADataSet := ADBGrid.DataSource.DataSet;
if(not ADataSet.Active) then
exit;
if(ADataSet.RecordCount <= 0) then
exit;
if((ADBGrid.Row = 1) or (ADBGrid.Row = ADBGrid.VisibleRowCount)) then
exit;
BeforeScroll := ADataSet.BeforeScroll;
ADataSet.BeforeScroll := nil;
AfterScroll := ADataSet.AfterScroll;
ADataSet.AfterScroll := nil;
ADataSet.DisableControls;
try
if(Assigned(BeforeScroll)) then
BeforeScroll(ADataSet);
tmpRecNo := ADataSet.RecNo;
i := ADBGrid.VisibleRowCount;
ADBGrid.Row := 1;
OK := (ADataSet.RecordCount - ADataSet.RecNo + 1) >= i;
if(OK) then begin
while((not ADataSet.EOF) and (i > 0)) do begin
ADataSet.Next;
Dec(i);
end;
while((not ADataSet.BOF) and (ADataSet.RecNo <> tmpRecNo)) do
ADataSet.Prior;
end else begin
while((not ADataSet.BOF) and (i > 0)) do begin
ADataSet.Prior;
Dec(i);
end;
while((not ADataSet.EOF) and (ADataSet.RecNo <> tmpRecNo)) do
ADataSet.Next;
end;
finally
ADataSet.EnableControls;
ADataSet.BeforeScroll := BeforeScroll;
ADataSet.AfterScroll := AfterScroll;
if(Assigned(AfterScroll)) then
( ADataSet)Мда, есть такой неприятный эффект.
У предка TDBGrid есть проперти Row и VisibleRowCount. В TRxDBGrid они вынесены в public, поэтому задача решается манипулированием этими значениями и "подгоном" положения записи операциями Next и Prior. Вот пример таких манипуляций (процедура работает с TRxDBGrid и выравнивает строку с записью вниз или вверх - так удобно нашим юзерам).
procedure DBGridAlignSelection(ADBGrid : TRxDBGrid);
var ADataSet : TDataSet;
i : Integer;
BeforeScroll, AfterScroll : TDataSetNotifyEvent;
tmpRecNo : Integer;
OK : Boolean;
begin
if(not Assigned(ADBGrid)) then
exit;
if(not Assigned(ADBGrid.DataSource)) then
exit;
ADataSet := ADBGrid.DataSource.DataSet;
if(not ADataSet.Active) then
exit;
if(ADataSet.RecordCount <= 0) then
exit;
if((ADBGrid.Row = 1) or (ADBGrid.Row = ADBGrid.VisibleRowCount)) then
exit;
BeforeScroll := ADataSet.BeforeScroll;
ADataSet.BeforeScroll := nil;
AfterScroll := ADataSet.AfterScroll;
ADataSet.AfterScroll := nil;
ADataSet.DisableControls;
try
if(Assigned(BeforeScroll)) then
BeforeScroll(ADataSet);
tmpRecNo := ADataSet.RecNo;
i := ADBGrid.VisibleRowCount;
ADBGrid.Row := 1;
OK := (ADataSet.RecordCount - ADataSet.RecNo + 1) >= i;
if(OK) then begin
while((not ADataSet.EOF) and (i > 0)) do begin
ADataSet.Next;
Dec(i);
end;
while((not ADataSet.BOF) and (ADataSet.RecNo <> tmpRecNo)) do
ADataSet.Prior;
end else begin
while((not ADataSet.BOF) and (i > 0)) do begin
ADataSet.Prior;
Dec(i);
end;
while((not ADataSet.EOF) and (ADataSet.RecNo <> tmpRecNo)) do
ADataSet.Next;
end;
finally
ADataSet.EnableControls;
ADataSet.BeforeScroll := BeforeScroll;
ADataSet.AfterScroll := AfterScroll;
if(Assigned(AfterScroll)) then
AfterScroll(ADataSet);
end;
end;
← →
Afteam (2003-07-31 12:51) [5]Большое спасибо :-))
← →
Afteam (2003-07-31 15:15) [6]И сразу возникла еще одна проблема. У меня а проге MDI-интерфейс. В каждом дочернем окне есть компонент Query. Если открыть несколько окон, то через некоторое время, в сетке активной оказывается 1-я запись. Что это еще за косяк на мою голову?
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.08.25;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.012 c