Форум: "Начинающим";
Текущий архив: 2007.07.15;
Скачать: [xml.tar.bz2];
Вниз
Обновление DBGRID по таймеру Найти похожие ветки
← →
Lokk83 (2007-06-22 02:25) [0]Ночь добрая!
Посдкажите, плиз, есть на форме dbgrid и таймер, который часто опрашивает базу на изменения(хранимые процедуры) и проверяет условия. если выполняется эти условия тогда выполняется запрос на выборку из таблицы привязанной к dbgrid.
Вопрос в том, что если условия не выполняются, то Grid получается пустой.....как бы это обойти
← →
Германн © (2007-06-22 02:32) [1]
> Lokk83 (22.06.07 02:25)
>
> Ночь добрая!
> Посдкажите, плиз, есть на форме dbgrid и таймер, который
> часто опрашивает базу на изменения(хранимые процедуры) и
> проверяет условия. если выполняется эти условия тогда выполняется
> запрос на выборку из таблицы привязанной к dbgrid.
> Вопрос в том, что если условия не выполняются, то Grid получается
> пустой.....как бы это обойти
>
Код давай! :)
Приведи свой код, найдут ошибку.
← →
Lokk83 (2007-06-22 10:22) [2]код следующий:
procedure opros;
datamodule3.qbefore.open;
before:=datamodule3.qBefore.fieldbyname("count").AsInteger;
//определяем количество записей в логе
try
spiItem.ddeitem :="b22:0.14";
dec:=spiConv.RequestData(spiItem.DDEItem);
finally
end;
//опрос по dde некоего устройства много много раз
datamodule3.qafter.open;
after:=datamodule3.qafter.fieldbyname("count").AsInteger;
if after>before then
datamodule3.qLogView.Open;
end;
procedure TmForm.realtimerTimer(Sender: TObject);
begin
RTlabel.Caption:=DateTimeToStr(Now);
opros(Self);
end;
realtimer.interval:=500;
в итого он у меня либо пустой, всмысле dbgrid
либо , если убрать проверку условия, начинает с частотой в 500мс моргать, как быть?
← →
Sergey13 © (2007-06-22 10:37) [3]> [2] Lokk83 (22.06.07 10:22)
> он у меня либо пустой
Может он не пустой, а закрытый?
← →
Jeer © (2007-06-22 10:40) [4]
> if after>before then
> datamodule3.qLogView.Open;
И в чем проблема ?
Почему он не должен быть пустым, если условие не выполнено ?
← →
Jeer © (2007-06-22 10:41) [5]
> Может он не пустой, а закрытый?
Разумеется у него grid пустой т.к. датасет закрытый.
Интересно, что еще надо сказать автору, чтобы это стало для него очевидным.
← →
ЮЮ © (2007-06-22 10:41) [6]if after>before then
datamodule3.qLogView.Open;
значит где-то ещё присутствкет datamodule3.qLogView.Close;
там его убрать и вставить в пару с Open.
← →
Sergey13 © (2007-06-22 10:45) [7]> [2] Lokk83 (22.06.07 10:22)
Кстати, а зачем с такой частотой проверять количество записей ДО? Не проще ли будет принять последнее значение ПОСЛЕ?
← →
Lokk83 (2007-06-22 10:52) [8]наверное я чего то не понимаю....
че сделать то???!!!
← →
Lokk83 (2007-06-22 10:53) [9]таких кусочков:
try
spiItem.ddeitem :="b22:0.14";
dec:=spiConv.RequestData(spiItem.DDEItem);
finally
end;
около двухсот
← →
ЮЮ © (2007-06-22 11:00) [10]> наверное я чего то не понимаю....
> че сделать то???!!!
if after>before then
datamodule3.qLogView.Open;
если к моменту проверки qLogView закрыт, то это где-то ведь делвется! В приведенноим тобой коде этого нет. Убрать закрытие там и сделать переоткрытие
if after>before then begin
datamodule3.qLogView.Close;
datamodule3.qLogView.Open;
// а где Locate? Или жаждещь встречи с пользователями?
end;
← →
Desdechado © (2007-06-22 11:00) [11]> Вопрос в том, что если условия не выполняются, то Grid получается
> пустой.....как бы это обойти
А чего надо-то? Оставить прежние данные? Так не закрывай датасет перед проверкой, закрывай перед переоткрытием (если оно есть).
ЗЫ вообще не понятно, зачем каждые полсекунды что-то проверять в БД
ЗЗЫ кстати, если за полсекунды все твои манипуляции не выполнятся,то стартует вторая копия процедуры, конфликтующая с первой, а там как снежный ком
← →
Lokk83 (2007-06-22 11:10) [12]если я не буду проверять каждые полсекунды, обновилось ли количество записей, то grid будет мерцать
datamodule3.qLogView.Close;
такого нет нигде!
> Или жаждещь встречи с пользователями?
это к чему?
Мне серьезно непонятно...
объясните че к чему
← →
Sergey13 © (2007-06-22 11:16) [13]> [12] Lokk83 (22.06.07 11:10)
> если я не буду проверять каждые полсекунды, обновилось ли
> количество записей, то grid будет мерцать
Наоборот, он будет стоять как влитой. 8-)
> это к чему?
Это к тому, что пользователь пролистав твой грид до какой то дальней, заинтересовавшей его, записи (сколько их кстати всего примерно?) "вдруг" переходит в начало. Я бы убил за это.
← →
fdsa (2007-06-22 11:18) [14]может у тебя есть
datamodule3.qrLogView.Active := false;
?
← →
ЮЮ © (2007-06-22 11:21) [15]> если я не буду проверять каждые полсекунды, обновилось ли
> количество записей, то grid будет мерцать
Никогда не проверяю - и не мерцает :)
> это к чему?
К тому, что если для отображения НД мне предоставлен грид, то я имею право полистоать его. После переоткрытия НД я не уверен, что останусь в том же месте глида, гди был раньше.
> datamodule3.qLogView.Close;
> такого нет нигде!
Если бы не было закрытия то не пришлось бы открывать.
Значит есть datamodule3.qLogView.Active := false. Или откат/подтверждение транзакции. В IB6.x это, кажется, тоже приводит к закрытиям НД.
← →
Lokk83 (2007-06-22 11:21) [16]
> Наоборот, он будет стоять как влитой. 8-)
так ведь не стоит....записей много, сейчас около 8000 тысяч
> может у тебя есть
> datamodule3.qrLogView.Active := false;
> ?
такого тоже нет нигде
← →
ЮЮ © (2007-06-22 11:23) [17]> такого тоже нет нигде
Тогда отладчик в зубы и брэкпоинт в метод закрытия DataSet-а.
← →
Jeer © (2007-06-22 11:24) [18]
> такого тоже нет нигде
Тогда начни с чтения книжек.
← →
Sergey13 © (2007-06-22 11:24) [19]> [16] Lokk83 (22.06.07 11:21)
> так ведь не стоит....записей много, сейчас около 8000 тысяч
И ты их все в грид?!!!!!!!!!!!!!
Садист.
← →
ЮЮ © (2007-06-22 11:35) [20]> И ты их все в грид?!!!!!!!!!!!!!
Все они в гриде не побывают. Датасет-то переоткрывается неспроста :)
← →
Desdechado © (2007-06-22 11:35) [21]> сейчас около 8000 тысяч
Интересно, а сколько потом будет? Ты их отфетчить-то за полсекунды успеешь? А то снова бумс будет.
← →
Sergey13 © (2007-06-22 11:37) [22]> [20] ЮЮ © (22.06.07 11:35)
> Все они в гриде не побывают. Датасет-то переоткрывается
> неспроста :)
Тогда я предлагаю их распечатывать. 8-)
← →
Lokk83 (2007-06-22 11:42) [23]записи я урежу, не проблема....
но что с мерцанием делать???
увеличил щас таймер до 1000
← →
Sergey13 © (2007-06-22 11:45) [24]> [23] Lokk83 (22.06.07 11:42)
> но что с мерцанием делать???
Разобраться с задачей. Зачем их выводить вообще? Зачем обновлять с частотой, которая не позволяет человеку (ведь это для человека выводится?) ничего понять - природа его не дает таких возможностей.
← →
Sergey13 © (2007-06-22 11:46) [25]> [23] Lokk83 (22.06.07 11:42)
+ Книжки читать конечно.
← →
Плохиш © (2007-06-22 11:49) [26]Про книжки уже в [18] сказали... Не пойму только, почему ветка всё ещё не в начинающим?
← →
Lokk83 (2007-06-22 11:50) [27]потому что это лог событий, вот зачем их выводить
← →
Плохиш © (2007-06-22 11:53) [28]
> Lokk83 (22.06.07 11:50) [27]
> потому что это лог событий, вот зачем их выводить
Дай возможность пользователю накладывать различные фильтры на этот вывод и он будет тебе очень благодарен...
← →
Sergey13 © (2007-06-22 11:56) [29]> [27] Lokk83 (22.06.07 11:50)
Ты лично можешь оценить объемный (очень) поток информации меняющийся каждые полсекунды? Как долго?
Что за события и что в них такого интересного, что на них надо смотреть постоянно?
← →
Lokk83 (2007-06-22 11:59) [30]события о состоянии датчиков в системе АПТ(авт. пожаротушение)
← →
ЮЮ © (2007-06-22 12:08) [31]> события о состоянии датчиков в системе АПТ(авт. пожаротушение)
Тогда не DBгрид показывать надо, а продумать нормальный интерфейс. В Виде тех же датчиков. Датчик то один, у него показания меняются. А у тебя замерянное значение атрибута в сущность превратилось.
← →
Плохиш © (2007-06-22 12:12) [32]
> Lokk83 (22.06.07 11:59) [30]
> события о состоянии датчиков в системе АПТ(авт. пожаротушение)
Хоть бы фильмом каких посмотрел, там много интерфейсов показано и ни одного в том виде как ты пытаешься реализовать.
[31] +1
← →
Sergey13 © (2007-06-22 12:58) [33]> [30] Lokk83 (22.06.07 11:59)
> авт. пожаротушение
Теперь понятно почему такие пожары в России стали происходить (типа недавнего в доме пристарелых). Автоматизировать взялись собственными силами.
Смешно. Если бы не было так грустно.
← →
Jeer © (2007-06-22 13:05) [34]
> Sergey13 © (22.06.07 12:58) [33]
Мне помнится тут пробегал какой-то "писатель" и спрашивал насчет win98 и атомной станции.
А вообще, таких примеров, когда дилетанты начинают ваять ответственный софт -все больше и больше.
← →
Lokk83 (2007-06-22 13:17) [35]если вы этим не занимались никогда не надо лажать остальных хорошо?
не представляете как это работает, никто не просит.
Я вопрос свой четко поставил, как заставить dbgrid нормально отображать данные, при изменении в логах, логи обновляются не часто
← →
Anatoly Podgoretsky © (2007-06-22 13:19) [36]Не по таймеру!
← →
Lokk83 (2007-06-22 13:23) [37]а как ещё предлагате опрашивать контроллер?
← →
Lokk83 (2007-06-22 13:42) [38]или что вы имели ввиду под
> Anatoly Podgoretsky © (22.06.07 13:19) [36]
> Не по таймеру!
← →
Virgo_Style © (2007-06-22 13:51) [39]Гм... а что, собственно, выдают датчики? Если на выходе 0 или 1 (нет пожара/есть пожар), то, может, не надо выдавать "8000 тысяч" сообщений об отсутствии пожара, а надо одно о наличии?))
← →
Плохиш © (2007-06-22 13:54) [40]
> Virgo_Style © (22.06.07 13:51) [39]
Так ему это и предложили в [31], но сразу пальцы распустились в [35] и сразу стало грустно и скучно...
← →
Virgo_Style © (2007-06-22 13:57) [41]Тогда использовать не DBGrid, а StringGrid, и пусть делает с ним когда и что хочет...
← →
Lokk83 (2007-06-22 13:57) [42]Работает так, у датчика есть несколько состояний(нрома, кз, пожар, обрыв, неисправность) каждый из них представляет собой на выходе либо 0 либо 1, в лог я заношу ТОЛЬКО изменения, и они действительно заносятся. мне нужно при наличи этих изменений перерисовывать dbgrid, чтобы оператор видел какой датчик во сколько изменил свое состояние напрмиер с норма на обрыв.
момент изменения я отлавливаю вычислением количества строк в начале процедуры и в конце и сравниваю их если больше тогда надо перезапрашивать данные, если нет то нет
Как мне сделать чтобы это нормально работало.....
← →
Плохиш © (2007-06-22 14:03) [43]
> момент изменения я отлавливаю вычислением количества строк
> в начале процедуры и в конце и сравниваю их если больше
> тогда надо перезапрашивать данные, если нет то нет
Так и сравнивай время последней записи с временем последнего изменения. + [6]
← →
Johnmen © (2007-06-22 14:04) [44]"ЭТО" никогда нормально работать не будет.
Прав Плохиш, грустно и скучно... А ещё немного тревожно...:)
← →
Sergey13 © (2007-06-22 14:04) [45]> [42] Lokk83 (22.06.07 13:57)
Сколько всего датчиков?
← →
Lokk83 (2007-06-22 14:15) [46]датчиков около 40, кстати, опрашивать она прекрасно успевает....
> Так и сравнивай время последней записи с временем последнего
> изменения. +
зачем это?
← →
Плохиш © (2007-06-22 14:21) [47]
> зачем это?
Чтобы не считать "количества строк"
← →
Lokk83 (2007-06-22 14:27) [48]это будет быстрее?
кстати, в стринг грид ручками получается надо забываить?
← →
Sergey13 © (2007-06-22 14:31) [49]> [46] Lokk83 (22.06.07 14:15)
> датчиков около 40
Ну и нарисуй 40 красных лампочек (можно компонентик какой нить красивый поискать для этого, можно просто Едит поставить с выводом кода состояния и выделением уветом) горящих или не горящих с указанием времени последней смнены состояния.
← →
Lokk83 (2007-06-22 14:35) [50]лампочки есть, все есть, а НАДО чтобы была таблица ещё!
← →
Sergey13 © (2007-06-22 14:38) [51]> [50] Lokk83 (22.06.07 14:35)
Раз есть лампочки - зачем таблицу то обновлять по таймеру?
← →
Mike Kouzmine © (2007-06-22 14:59) [52]Sergey13 © (22.06.07 14:38) [51] Чтобы быть уверенным, что оператор понял. Лучше перебдеть, чем недобдеть, а так же видеть, что программа не зависла, а выполняет серьезную раьоту.
← →
Sergey13 © (2007-06-22 15:00) [53]> [52] Mike Kouzmine © (22.06.07 14:59)
Не факт, что оператор что то поймет в гриде с обновлением 2 раза в секунду. 8-)
← →
Lokk83 (2007-06-22 15:26) [54]в том то и дело что не надо его обновлять два раза в секунду, а нужно только при изменениях в таблице, а изменения происходят не часто
← →
Sergey13 © (2007-06-22 15:29) [55]> [54] Lokk83 (22.06.07 15:26)
Ну так лампочка (которая есть) загорелась - пусть ткнет в нее мышой и посмотрит детализацию. Обмозговал увиденной, обновить захотел - пусть еще ткнет.
← →
Lokk83 (2007-06-22 15:48) [56]так не положено, положено чтобы была графическая индикация и табличный вид
← →
fdsa (2007-06-22 15:57) [57]Видел одну программу, фирма Спецавтоматика г.Тверь разрабатывает,
у них, есть графический интерфейс, где все красиво нарисовано. Если меняется состояние датчика - пишется событие в БД, меняется картинка отображающая состояние датчика, и есть что-то типа листбокса, который выскакивает поверх всех окон, куда добавляется сообщение вида:
22.06.2007 15:48:46 ШЛЕЙФ ХХХ ДАТЧИК УУУ - бла-бла-бла.
← →
Плохиш © (2007-06-22 16:02) [58]
> Lokk83 (22.06.07 15:48) [56]
АФФтар, ты уже нашёл, в какой момент твоя таблица закрывается и почему?
← →
Lokk83 (2007-06-22 17:11) [59]нет, не нашел, у меня примерно тоже самое что в [57].
работает все кроме нормального отображения списка событий
но у меня действительно почему то происходит очистка датасета
мне кажется
← →
Anatoly Podgoretsky © (2007-06-22 19:59) [60]> Lokk83 (22.06.2007 17:11:59) [59]
Плюнь, пойди выпей пива и стране полезно.
← →
Mike Kouzmine © (2007-06-22 21:58) [61]Поставь обновление в событик переключающее цвет в лампочке.
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.07.15;
Скачать: [xml.tar.bz2];
Память: 0.6 MB
Время: 0.055 c