Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.05.2013, 14:43
ridvik ridvik вне форума
Прохожий
 
Регистрация: 27.05.2013
Сообщения: 10
Версия Delphi: Delphi 2010
Репутация: 10
Вопрос Помогите правильно настроить таймер

Добрый день пользователи данного портала. Пишу сюда с просьбой о помощи, т.к. какой уже день подряд не могу решить одну проблему.
Проблема заключается в таймере. Что нужно от таймера: каждые 5 минут делать запрос в бд сайта(mysql) и проверять значения в одном столбце, если количество результатов больше 0, то выводить messagebox, если нет то нет. Проблема заключается в том, что messagebox выводится в не зависимости от условия, если быть более точным. То если условие сработает хоть один раз, то окошко это будет вылазить постоянно, пока не закроется программа. Помогите пожалуйста решить данную проблему. Код прилагаю. код немного упрощен от идеала, но суть думаю понятна.
Код:
procedure TForm1.Timer3Timer(Sender: TObject);
begin
    MyQuery1.SQL.Clear;
    MyQuery1.SQL.Add('SELECT COUNT(*) FROM dynamit_test WHERE status=3');
    MyQuery1.Open;
    j:=MyQuery1.FieldByName('count(*)').AsInteger;
      if j>0 Then
        Timer3.Enabled:=False;
        MyQuery1.SQL.Clear;
        MyQuery1.SQL.Add('SELECT * FROM dynamit_test WHERE status=3');
        MyQuery1.Open;
        MessageBox(Handle, 'вам пришло новое сообщение','Оповещение',MB_OK);
        try
            MyQuery1.Edit;
            MyQuery1.FieldByName('status').AsString := '2';
            MyQuery1.Post;
            finally
        end;
        Timer3.Enabled:=True;
end;
Ответить с цитированием
  #2  
Старый 27.05.2013, 14:49
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от ridvik
Что нужно от таймера: каждые 5 минут делать запрос в бд сайта(mysql) и проверять значения в одном столбце, если количество результатов больше 0, то выводить messagebox, если нет то нет.
Непонятно что нужно: проверять значение в столбце или же проверять количество результатов (т.е. записей) - это разные вещи.
Ответить с цитированием
  #3  
Старый 27.05.2013, 15:22
ridvik ridvik вне форума
Прохожий
 
Регистрация: 27.05.2013
Сообщения: 10
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Непонятно что нужно: проверять значение в столбце или же проверять количество результатов (т.е. записей) - это разные вещи.
нужно сделать, что бы таймер работал точно по условию. Т.е. если в таблице, количество строк с данным условием больше 0, то выводить окошко и таймер останавливать, пока не будет нажата клавиша ок. После того как она будет нажата, снова запустить таймер на проверку количества строк. Просто я хочу отслеживать, прочитал ли пользователь сообщение или же проигнорировал его.
Ответить с цитированием
  #4  
Старый 27.05.2013, 15:27
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от ridvik
нужно сделать, что бы таймер работал точно по условию. Т.е. если в таблице, количество строк с данным условием больше 0, то выводить окошко и таймер останавливать, пока не будет нажата клавиша ок. После того как она будет нажата, снова запустить таймер на проверку количества строк. Просто я хочу отслеживать, прочитал ли пользователь сообщение или же проигнорировал его.
Попробуй перед очередной выборкой закрывать предыдущую.
Т.е. вместо такого:
Код:
    MyQuery1.SQL.Clear;
    MyQuery1.SQL.Add('SELECT COUNT(*) FROM dynamit_test WHERE status=3');
    MyQuery1.Open;
делай так:
Код:
    MyQuery1.Close; // Закрыть предыдущую выборку
    MyQuery1.SQL.Text:='SELECT COUNT(*) FROM dynamit_test WHERE status=3'; // Изменить запрос
    MyQuery1.Open; // Открыть новую выборку
Ответить с цитированием
  #5  
Старый 27.05.2013, 15:43
ridvik ridvik вне форума
Прохожий
 
Регистрация: 27.05.2013
Сообщения: 10
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Попробуй перед очередной выборкой закрывать предыдущую.
Т.е. вместо такого:
Код:
    MyQuery1.SQL.Clear;
    MyQuery1.SQL.Add('SELECT COUNT(*) FROM dynamit_test WHERE status=3');
    MyQuery1.Open;
делай так:
Код:
    MyQuery1.Close; // Закрыть предыдущую выборку
    MyQuery1.SQL.Text:='SELECT COUNT(*) FROM dynamit_test WHERE status=3'; // Изменить запрос
    MyQuery1.Open; // Открыть новую выборку
не работает(((
Ответить с цитированием
  #6  
Старый 27.05.2013, 15:44
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

а так?
Код:
procedure TForm1.Timer3Timer(Sender: TObject);
begin
  MyQuery1.Close;
  MyQuery1.SQL.Text := 'SELECT COUNT(*) FROM dynamit_test WHERE status=3';
  MyQuery1.Open;
  if MyQuery1.Fields[0].AsInteger > 0 then
  begin
    Timer3.Enabled:=False;
    MyQuery1.Close;
    MyQuery1.SQL.Text := 'SELECT * FROM dynamit_test WHERE status=3';
    MyQuery1.Open;
    MessageBox(Handle, 'вам пришло новое сообщение','Оповещение',MB_OK);
    try
      MyQuery1.Edit;
      MyQuery1.FieldByName('status').AsString := '2';
      MyQuery1.Post;
    finally
    end;
    Timer3.Enabled:=True;
  end;
end;
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
Ответить с цитированием
  #7  
Старый 27.05.2013, 15:47
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Здесь тоже неправильно:
Код:
j:=MyQuery1.FieldByName('count(*)').AsInteger;
Нужно делать так:
Код:
j:=MyQuery1.Fields[0].AsInteger;
Ответить с цитированием
  #8  
Старый 27.05.2013, 17:07
ridvik ridvik вне форума
Прохожий
 
Регистрация: 27.05.2013
Сообщения: 10
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию

спасибо огромное, вроде работает))) чувствуется у меня будет еще пару вопросов от новичков)))
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:35.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter