Главная страница
    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.01 c
1-81813
Yakudza
2003-08-13 19:24
2003.08.25
Как написать буквы форме ?


14-81921
RV_Raven
2003-07-28 20:49
2003.08.25
Можно ли с помощью Delphi отловить опасный HTML код до того как


3-81540
McSimm2
2003-07-31 09:55
2003.08.25
[Oracle] fields not is null


1-81795
ossa
2003-08-14 08:01
2003.08.25
можно ли в одном модуле ссылаться на переменую в другом и обратно


6-81861
GreatLesh
2003-06-19 07:55
2003.08.25
Обработка событий WInSock





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский