Я новичок в 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 в моей основной форме, в которой перечислены все мои напоминания. Я надеюсь в ближайшее время включить кнопку удаления, но пока мне просто нужно удалить свою базу данных: /
Итак, к актуальной проблеме: как я могу уведомить пользователя (меня), когда напоминание «Reminder_date» - это настоящая дата и время (сейчас).
Мне просто нужна следующая информация о шоу-сообщении:
showmessage ('У вас есть напоминание!' + [название должного напоминания] + 'необходимо.' + [описание должного напоминания])
Спасибо вам всем!
Хотите какую-нибудь информацию? Не стесняться спрашивать!
Харрисон





То, как значение даты и времени хранится в бэкэнд-базе данных, зависит от рассматриваемой RDMS и типа столбца, как он определен.
В коде Lazarus (и Delphi) TDateTime обрабатывается как число с десятичной точкой: часть перед десятичной точкой - это «номер дня» (количество дней, прошедших с 30 декабря 1899 г.), а часть после точка («мантисса» или «дробная часть») - время суток.
Один из способов решения вашей проблемы - периодически выполнять SQL-запрос в форме
Select * from reminders where (reminder_date >= :date) and reminder_date < :date + 1)
где: date - параметр, который вы установили как now, предполагая, что вы хотите получить результаты за остаток дня с текущего времени. Если ваши напоминания имеют разрешение, скажем, 15 минут, то в результатах запроса вам необходимо сделать предупреждение для каждой строки в результатах запроса, где
SqlQuery.FieldByName('reminder_date').AsDateTime - Now <= 1 / (24 * 4)
4, потому что в часе 4 пятнадцатиминутных периода.
Похоже, вас не интересует этот ответ. Удалить его?
добавить таймер и проверять каждый ххх раз.