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

Вниз

Как избежать скроллирования 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.018 c
1-81703
Yuraz
2003-08-11 11:17
2003.08.25
Как в Font.Color = clBlac вместо clBlack написать цифрами (0,0,0)


1-81831
dataMaster
2003-08-13 12:58
2003.08.25
OpenDialog и его размеры


14-81955
NetKnight
2003-08-06 12:43
2003.08.25
Написание FireWall


1-81740
Abelisto
2003-08-13 23:06
2003.08.25
Спрятать главную форму


1-81616
hawkins
2003-08-13 08:09
2003.08.25
В TImage вместо текста появляется черная полоса