Приложение напоминаний - Триггер - PullRequest
0 голосов
/ 29 октября 2018

Я новичок в Lazarus, и мне было интересно, сможет ли кто-нибудь из вас решить проблему с барьером, с которым я столкнулся.

Мое приложение разбито на фреймы. Существует рамка напоминаний, которая позволяет создавать напоминания. Это мой код в этом кадре.

reminder_frame.pas:


   unit reminder_frame;

    {$mode objfpc}{$H+}

    interface

    uses
      Classes, SysUtils, sqlite3conn, sqldb, FileUtil, Forms, Controls, StdCtrls,
      Buttons, ExtCtrls, ExtDlgs, dialogs;

    type

      { TReminderFrame }

      TReminderFrame = class(TFrame)
        Button1: TButton;
        btnCalendar: TButton;
        Button2: TButton;
        createdb: TButton;
        CalendarDialog1: TCalendarDialog;
        DescriptionMemo: TMemo;
        Image2: TImage;
        NameEdit: TEdit;
        HoursEdit: TEdit;
        Label2: TLabel;
        MinsEdit: TEdit;
        editDate: TEdit;
        Image1: TImage;
        Label1: TLabel;
        SQLiteConnection: TSQLite3Connection;
        SQLQuery: TSQLQuery;
        SQLTransaction: TSQLTransaction;
        procedure Button1Click(Sender: TObject);
        procedure btnCalendarClick(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure createdbClick(Sender: TObject);
      private
        { private declarations }
      public
        { public declarations }
      end;

    implementation

    {$R *.lfm}

    { TReminderFrame }

    uses dashboard_unit;

    procedure TReminderFrame.Button1Click(Sender: TObject);
    begin
      if NameEdit.Text = '' then
      begin
        showmessage('Name required.');
      end else
      if editDate.Text = '' then
      begin
        showmessage('Date required.');
      end else
      if HoursEdit.Text = '' then
      begin
        showmessage('Hour required.');
      end else
      if MinsEdit.Text = '' then
      begin
        showmessage('Mins required.');
      end else
      if DescriptionMemo.Text = '' then
      begin
        showmessage('Description required.');
      end else
      begin
        SQLTransaction.StartTransaction;
        SQLQuery.SQL.Clear;
        SQLQuery.SQL.Add('select * from reminders where reminder_name = "'+ NameEdit.Text +'"');
        SQLQuery.Open;
        SQLQuery.Edit;
        SQLQuery['reminder_name']:=NameEdit.Text;
        SQLQuery['reminder_date']:=StrToDateTime(editDate.Text+' '+HoursEdit.Text+':'+MinsEdit.Text+':00');
        SQLQuery['reminder_description']:=DescriptionMemo.Text;
        SQLQuery.Post;
        SQLQuery.ApplyUpdates;
        SQLQuery.Close;
        SQLTransaction.Commit;
        SQLTransaction.EndTransaction;
        Form1.showreminders;
        Self.Hide;
        Self.Free;
      end;
    end;

    procedure TReminderFrame.btnCalendarClick(Sender: TObject);
    begin
      if CalendarDialog1.Execute then
      begin
        editDate.Text:=DateTimeToStr(CalendarDialog1.Date);
      end;
    end;

    procedure TReminderFrame.Button2Click(Sender: TObject);
    begin
      Self.Hide;
      Self.Free;
    end;

    procedure TReminderFrame.createdbClick(Sender: TObject);
    var
      newFile : Boolean;
    begin
      SQLiteConnection.Close; // Ensure the connection is closed when we start

      try
        // Since we're making this database for the first time,
        // check whether the file already exists
        newFile := not FileExists(SQLiteConnection.DatabaseName);

        if newFile then
        begin
          // Create the database and the tables
          try
            SQLiteConnection.Open;
            SQLTransaction.Active := true;

            // Here we're setting up a table named "DATA" in the new database
            SQLiteConnection.ExecuteDirect('CREATE TABLE "reminders"('+
                        ' "id" Integer NOT NULL PRIMARY KEY AUTOINCREMENT,'+
                        ' "reminder_name" Char(128) NOT NULL,'+
                        ' "reminder_description" Char(128) NOT NULL,'+
                        ' "reminder_date" DateTime NOT NULL);');

            // Creating an index based upon id in the DATA Table
            // SQLiteConnection.ExecuteDirect('CREATE UNIQUE INDEX "Data_id_idx" ON "DATA"( "id" );');

            SQLTransaction.Commit;

            ShowMessage('Succesfully created database.');
          except
            ShowMessage('Unable to Create new Database');
          end;
        end;
      except
        ShowMessage('Unable to check if database file exists');
      end;
     end;

    end.

У меня есть база данных (SQLite3) со следующими данными:

    SQLiteConnection.ExecuteDirect('CREATE TABLE "reminders"('+
                ' "id" Integer NOT NULL PRIMARY KEY AUTOINCREMENT,'+
                ' "reminder_name" Char(128) NOT NULL,'+
                ' "reminder_description" Char(128) NOT NULL,'+
                ' "reminder_date" DateTime NOT NULL);'); 

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

Итак, к рассматриваемой проблеме: как мне уведомить пользователя (меня), когда «напоминание_дата» напоминания является реальной датой и временем (сейчас).

Я просто хочу получить следующую информацию о показе сообщения:

showmessage («У вас есть напоминание!» + [Имя должного напоминания] + «подлежит оплате». + [Описание должного напоминания])

Спасибо всем!

Хотите получить информацию? Не стесняйтесь спрашивать!

Харрисон

1 Ответ

0 голосов
/ 30 октября 2018

То, как значение «дата + время» хранится в внутренней базе данных, зависит от рассматриваемой RDMS и типа столбца, для которого она определена.

В коде Lazarus (и Delphi) TDateTime обрабатывается как десятичное число: часть перед десятичной точкой - это «число дней» (количество дней, прошедших с 30 декабря 1899 года) и часть после точки («мантисса» или «дробная часть») - это время суток.

Один из способов решения вашей проблемы - периодически выполнять SQL-запрос в форме

Select * from reminders where (reminder_date >= :date) and reminder_date < :date + 1)

где: дата - это параметр, который вы задали как now, предполагая, что вы хотите получить результаты для оставшейся части дня от текущего времени. Если ваши напоминания имеют разрешение, скажем, 15 минут, то в результатах запроса вы должны сделать предупреждение для каждой строки в результатах запроса, где

SqlQuery.FieldByName('reminder_date').AsDateTime - Now <= 1 / (24 * 4)

4 потому что в часе 4 пятнадцатиминутных периода.

...