Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.015 c
3-81558
OlkaGTS
2003-07-30 18:50
2003.08.25
Не открывается таблица FoxPro


1-81732
Mishenka
2003-08-07 15:53
2003.08.25
Запись информации.


1-81692
Yuliya
2003-08-11 09:55
2003.08.25
типизированный файл


3-81550
dd
2003-07-30 14:22
2003.08.25
регистрация сервера и пользователей


14-81922
Е-Моё имя
2003-08-07 11:23
2003.08.25
ржать





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский