Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.03.21;
Скачать: [xml.tar.bz2];

Вниз

TDBGrid при Requery смещаються отображаемые записи.   Найти похожие ветки 

 
Андрей Пл   (2010-01-18 16:24) [0]

Проблема в следующем в гриде отображены данные из ADOQuery  некоторой таблицы, которая постоянно меняется в смысле меняются периодически значения полей всех записей.
Так вот при отображении этой таблицы посредством грида приходиться с определенной периодичностью делать обновление данных что бы у пользователя была оперативная информация о значениях ее полей.
ADOQuery1.Requery

и когда это происходит в гриде смещаются записи что бы этого избежать я сделал так:

var
 Bookmark1:TBookmark;
begin
 Bookmark1:=ADOQuery1.GetBookmark;
 DataSource1.Enabled:=false;
 ADOQuery1.Requery;
 ADOQuery1.GotoBookmark(Bookmark1);
 DataSource1.Enabled:=true;

это в каком то смысле помогло но все равно не то, потому что если текущая запись была в самомо низу грида то теперь она становится в центре грида. А мне надо что бы записи в гриде не прыгаля а оставались на прежнем месте.
Подскажите как это сделать???


 
clickmaker ©   (2010-01-18 16:29) [1]

Bookmark может стать невалидным после перезапроса.
Лучше запоминать первичный ключ и делать Locate


 
Андрей Пл   (2010-01-18 16:34) [2]

и в таком варианте сделал))

var
 Bookmark1:integer;
begin
 Bookmark1:=ADOQuery1.FieldValues["id"]
 ADOQuery1.Requery;
 ADOQuery1.Locate("id",Bookmark1,[loCaseInsensitive])
end;

но эффект от этого не поменяется ....


 
clickmaker ©   (2010-01-18 16:41) [3]

ну как вариант, позицию скроллбара еще запоминать


 
Sergey13 ©   (2010-01-18 16:48) [4]

ИМХО если в постановке задачи поменять "приходиться с определенной периодичностью делать обновление данных" на "у пользователя есть кнопка для обновления данных" проблема уйдет сама собой.
Если например критически важные данные не находятся в данный момент на экране, то само такое "обновление" только сбивает с толку.


 
Андрей Пл   (2010-01-18 17:04) [5]


> ну как вариант, позицию скроллбара еще запоминать

это вариант. Только не могу сообразить как получить доступ к вертикальному скрулу в DBGrid ???


 
Андрей Пл   (2010-01-18 17:23) [6]

хотя такой вариант тоже не подойдет я заметил если в рамках отображаемого количества записей выбирать то одну то другую запись, то скрул перемещается в соответствии с выбранной записью, т.е. он жестко привязан к текущей записи...и запоминать его положение бессмысленно....


 
MonoLife ©   (2010-01-18 17:57) [7]


> что если текущая запись была в самомо низу грида то теперь
> она становится в центре грида.

А почему бы ей не становиться в центре грида, если на момент запроса произошло обновление таблицы и добавились, например, новые записи..?
Всегда использую > clickmaker ©   (18.01.10 16:29) [1] и курсор в поле зрения найденной записи, что еще надо..


 
Плохиш ©   (2010-01-18 19:33) [8]

http://www.sql.ru/forum/actualthread.aspx?bid=20&tid=169750


 
Андрей Пл   (2010-01-19 11:54) [9]


> А почему бы ей не становиться в центре грида, если на момент
> запроса произошло обновление таблицы ..?
>и курсор в поле зрения найденной записи, что еще надо..

я с этим не спорю но мне не это надо....мне не нужно что бы курсор становился в центре грида, мне нужно что бы он оставался на своем месте!!!
У меня  Requery происходит каждые 5  секунд и как то не удобно получается следить оператору за таблицей когда он по ней ходит, а изображение на ней прыгает (курсор перемещается в ценр) каждые 5 сек....


 
Sergey13 ©   (2010-01-19 12:17) [10]

> [9] Андрей Пл   (19.01.10 11:54)

А что за предметная область? Что за данные?
ИМХО следить за гридом - это очень ненадежный и неудобный интерфейс. Тем более данные, как я понял, в него целиком не влезают.
Наверняка у наблюдаемых значений есть критические пределы, выход за которые - авария. Зачем следить за мелкими цифирьками, если можно поставить одну сигнальную лампу. Горит значит плохо и надо детализировать проблемный участок. Не горит - чего на экран вообще зря пялиться и зрение портить.


 
Андрей Пл   (2010-01-19 13:00) [11]

Данные показания некоторых приборов.
Оператор может просто просматривать бегло значения его интересующие не обязательно искать аварию(к тому же это уже реализовано и тут все удовлетворяет по аварии )... и вообще это уже отдельная дискуссия.... на эту тему можно долго спорить...

у меня есть конкретное задание и описана проблема....если что то можешь подсказать подскажи, а так поболтать я не за этим сюда обратился...


 
Медвежонок Пятачок ©   (2010-01-19 13:18) [12]

очевидно же, что ты выбрал не тот интерфейсный контрол для отображения показателей.
грид не предполагает, что при рефреше интересующая запись должна остаться текущей, да и еще и ее высота над уровнем носа юзера чтобы была неизменна.


 
Медвежонок Пятачок ©   (2010-01-19 13:26) [13]

при проектировании интерфейса программер может задаваться вопросами.
ни бывают правильными и неправильными.

например правильные вопосы:
- что же все таки хочет видеть юзер и в каком виде?

напрмер неправильные вопросы:
- что я обычно для визуализации данных тупо кидаю на форму если мои данные в БД и там несколько строк?


 
Медвежонок Пятачок ©   (2010-01-19 13:31) [14]

и как то не удобно получается следить оператору за таблицей когда он по ней ходит

то есть какой вывод надо сделать?
если юзеру неудобно бегать глазами по гриду, значит надо сделать так, чтобы то, чего его в первую очередь волнует, было в самом его начале (вверху). И чтобы это правило сохранялось при каждом рефреше.


 
Плохиш ©   (2010-01-19 13:35) [15]


> Андрей Пл   (19.01.10 13:00) [11]

Так, что [8] не помогло?
По ссылки даже код для копи-паст дан...


 
Андрей Пл   (2010-01-19 14:09) [16]


> Так, что [8] не помогло?
> По ссылки даже код для копи-паст дан...

к сожалению не помогло, но я сейчас еще пытаюсь копаться в том направлении но пока безуспешно...(


 
Андрей Пл   (2010-01-22 11:40) [17]

пока вот какой выход нашел (понимаю что может быть не идеальный но работает):

TDBGrid = class(DBGrids.TDBGrid);

VAR
 RecNo1, ActiveRecord1, Delta: Integer;

begin
 RecNo1:=DBGrid1.DataLink.DataSet.RecNo;
 ActiveRecord1:=DBGrid1.DataLink.ActiveRecord;
 ADOQuery1.Requery;

 if DBGrid1.DataLink.Active and (DBGrid1.DataLink.DataSet.RecordCount <> 0) then
 begin
   Delta:=DBGrid1.DataLink.BufferCount -1-ActiveRecord1;

   DBGrid1.DataLink.DataSet.MoveBy(RecNo1-1+Delta);
   DBGrid1.DataLink.DataSet.MoveBy(-Delta);
   end;
 end;


Если у кого то еще будут советы пишите буду очень благодарен!


 
Андрей Пл   (2010-01-22 11:52) [18]

правда есть недостаток маленькое мигание экрана когда делаем
MoveBy(....);

может подскажите  как отключить перерисовку грида на этот момент а потом к конце её сделать?


 
Sergey13 ©   (2010-01-22 12:02) [19]

> [18] Андрей Пл   (22.01.10 11:52)

disable[enable]control ?



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2010.03.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.004 c
1-1242910957
Unknown user
2009-05-21 17:02
2010.03.21
TTypeInfo


1-1241068432
MultIfleX
2009-04-30 09:13
2010.03.21
"Global" exception handler


2-1263991727
nordlink19
2010-01-20 15:48
2010.03.21
Рисование окружности в free pascal


15-1262293207
Anatoly Podgoretsky
2010-01-01 00:00
2010.03.21
С Новым 2010 годом! Релиз.


15-1262278818
qaz
2009-12-31 20:00
2010.03.21
Новогодняя





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