Форум: "Начинающим";
Текущий архив: 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