You've already forked lazarus-ccr
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@5169 8e941d3f-bd1b-0410-a28a-d453659cc2b4
317 lines
10 KiB
ObjectPascal
317 lines
10 KiB
ObjectPascal
unit Unit1;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
|
|
StdCtrls, ComCtrls,
|
|
db, DBGrids, DbCtrls, sqldb, sqlite3conn,
|
|
VpBaseDS, VpDayView, VpWeekView, VpTaskList, VpContactGrid, VpMonthView,
|
|
VpResEditDlg, VpContactButtons, VpData, VpFlxDS;
|
|
|
|
type
|
|
|
|
{ TForm1 }
|
|
|
|
TForm1 = class(TForm)
|
|
BtnNewRes: TButton;
|
|
BtnEditRes: TButton;
|
|
DsTasks: TDataSource;
|
|
DsEvents: TDataSource;
|
|
DsContacts: TDataSource;
|
|
DsResources: TDataSource;
|
|
PageControl1: TPageControl;
|
|
Panel1: TPanel;
|
|
Panel2: TPanel;
|
|
Splitter1: TSplitter;
|
|
Splitter2: TSplitter;
|
|
Splitter3: TSplitter;
|
|
QryResources: TSQLQuery;
|
|
QryContacts: TSQLQuery;
|
|
QryEvents: TSQLQuery;
|
|
QryTasks: TSQLQuery;
|
|
SQLite3Connection1: TSQLite3Connection;
|
|
SQLTransaction1: TSQLTransaction;
|
|
TabSheet1: TTabSheet;
|
|
TabSheet2: TTabSheet;
|
|
VpContactButtonBar1: TVpContactButtonBar;
|
|
VpContactGrid1: TVpContactGrid;
|
|
VpControlLink1: TVpControlLink;
|
|
VpDayView1: TVpDayView;
|
|
VpFlexDataStore1: TVpFlexDataStore;
|
|
VpMonthView1: TVpMonthView;
|
|
VpResourceCombo1: TVpResourceCombo;
|
|
VpResourceEditDialog1: TVpResourceEditDialog;
|
|
VpTaskList1: TVpTaskList;
|
|
VpWeekView1: TVpWeekView;
|
|
procedure BtnNewResClick(Sender: TObject);
|
|
procedure BtnEditResClick(Sender: TObject);
|
|
procedure Button1Click(Sender: TObject);
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure FormDestroy(Sender: TObject);
|
|
private
|
|
procedure CreateContacts;
|
|
procedure CreateDB(AFileName: String);
|
|
procedure CreateEvents;
|
|
procedure CreateResources;
|
|
procedure CreateTasks;
|
|
public
|
|
{ public declarations }
|
|
end;
|
|
|
|
var
|
|
Form1: TForm1;
|
|
|
|
implementation
|
|
|
|
{$R *.lfm}
|
|
|
|
uses
|
|
LazFileUtils;
|
|
|
|
const
|
|
DB_NAME = 'data.db';
|
|
|
|
// More information on the use of these values is below.
|
|
// They need not be set as constants in your application. They can be any valid value
|
|
APPLICATION_ID = 1189021115; // must be a 32-bit Unsigned Integer (Longword 0 .. 4294967295)
|
|
USER_VERSION = 23400001; // must be a 32-bit Signed Integer (LongInt -2147483648 .. 2147483647)
|
|
|
|
|
|
{ TForm1 }
|
|
|
|
// Adds a new resource
|
|
procedure TForm1.BtnNewResClick(Sender: TObject);
|
|
begin
|
|
VpResourceEditDialog1.AddNewResource;
|
|
end;
|
|
|
|
// Edits the currently selected resource
|
|
procedure TForm1.BtnEditResClick(Sender: TObject);
|
|
begin
|
|
// Open the resource editor dialog, everything is done here.
|
|
VpResourceEditDialog1.Execute;
|
|
end;
|
|
|
|
procedure TForm1.Button1Click(Sender: TObject);
|
|
begin
|
|
VpFlexDatastore1.Load;
|
|
end;
|
|
|
|
procedure TForm1.CreateDB(AFileName: String);
|
|
begin
|
|
SQLite3Connection1.Close; // Ensure the connection is closed when we start
|
|
|
|
// Create the database and the tables
|
|
try
|
|
SQLite3Connection1.DatabaseName := AFileName;
|
|
SQLite3Connection1.Open;
|
|
SQLTransaction1.Active := true;
|
|
|
|
// Per the SQLite Documentation (edited for clarity):
|
|
// The pragma user_version is used to set or get the value of the user-version.
|
|
// The user-version is a big-endian 32-bit signed integer stored in the database header at offset 60.
|
|
// The user-version is not used internally by SQLite. It may be used by applications for any purpose.
|
|
// http://www.sqlite.org/pragma.html#pragma_schema_version
|
|
SQLite3Connection1.ExecuteDirect('PRAGMA user_version = ' + IntToStr(user_version) + ';');
|
|
|
|
// Per the SQLite Documentation:
|
|
// The application_id PRAGMA is used to query or set the 32-bit unsigned big-endian
|
|
// "Application ID" integer located at offset 68 into the database header.
|
|
// Applications that use SQLite as their application file-format should set the
|
|
// Application ID integer to a unique integer so that utilities such as file(1) can
|
|
// determine the specific file type rather than just reporting "SQLite3 Database".
|
|
// A list of assigned application IDs can be seen by consulting the magic.txt file
|
|
// in the SQLite source repository.
|
|
// http://www.sqlite.org/pragma.html#pragma_application_id
|
|
SQLite3Connection1.ExecuteDirect('PRAGMA application_id = ' + IntToStr(application_id) + ';');
|
|
|
|
CreateContacts;
|
|
CreateEvents;
|
|
CreateTasks;
|
|
CreateResources;
|
|
|
|
SQLTransaction1.Commit;
|
|
SQLite3Connection1.Close;
|
|
|
|
except
|
|
ShowMessage(Format('Unable to create database "%s".', [AFileName]));
|
|
end;
|
|
end;
|
|
|
|
procedure TForm1.CreateContacts;
|
|
begin
|
|
SQLite3Connection1.ExecuteDirect(
|
|
'CREATE TABLE Contacts (' +
|
|
'"RecordID" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, '+
|
|
'"ResourceID" INTEGER NOT NULL, ' +
|
|
'"FirstName" VARCHAR(50), '+
|
|
'"LastName" VARCHAR(50), '+
|
|
'"Birthdate" DATETIME, '+
|
|
'"Anniversary" DATETIME, '+
|
|
'"Title" VARCHAR(50), '+
|
|
'"Company" VARCHAR(50), '+
|
|
'"Department" VARCHAR(50), '+
|
|
'"Job_Position" VARCHAR(30), '+
|
|
'"AddressType1" INTEGER, '+
|
|
'"Address1" VARCHAR(100), '+
|
|
'"City1" VARCHAR(50), '+
|
|
'"State1" VARCHAR(25), '+
|
|
'"Zip1" VARCHAR(10), '+
|
|
'"Country1" VARCHAR(25), '+
|
|
'"AddressType2" INTEGER, '+
|
|
'"Address2" VARCHAR(100), '+
|
|
'"City2" VARCHAR(50), '+
|
|
'"State2" VARCHAR(25), '+
|
|
'"Zip2" VARCHAR(10), '+
|
|
'"Country2" VARCHAR(25), '+
|
|
'"Notes" VARCHAR(1024), '+
|
|
'"Category" INTEGER, '+
|
|
'"Phone1" VARCHAR(25), '+
|
|
'"Phone2" VARCHAR(25), '+
|
|
'"Phone3" VARCHAR(25), '+
|
|
'"Phone4" VARCHAR(25), '+
|
|
'"Phone5" VARCHAR(25), '+
|
|
'"PhoneType1" INTEGER, '+
|
|
'"PhoneType2" INTEGER, '+
|
|
'"PhoneType3" INTEGER, '+
|
|
'"PhoneType4" INTEGER, '+
|
|
'"PhoneType5" INTEGER, '+
|
|
'"EMail1" VARCHAR(100), '+
|
|
'"EMail2" VARCHAR(100), '+
|
|
'"EMail3" VARCHAR(100), '+
|
|
'"EMailType1" INTEGER, '+
|
|
'"EMailType2" INTEGER, '+
|
|
'"EMailType3" INTEGER, '+
|
|
'"Website1" VARCHAR(100), '+
|
|
'"Website2" VARCHAR(100), '+
|
|
'"WebsiteType1" INTEGER, '+
|
|
'"WebsiteType2" INTEGER, '+
|
|
'"Custom1" VARCHAR(100), '+
|
|
'"Custom2" VARCHAR(100), '+
|
|
'"Custom3" VARCHAR(100), '+
|
|
'"Custom4" VARCHAR(100)); '
|
|
);
|
|
SQLite3Connection1.ExecuteDirect(
|
|
'CREATE UNIQUE INDEX "Contacts_RecordID_idx" ON "Contacts" ("RecordID");'
|
|
);
|
|
SQLite3Connection1.ExecuteDirect(
|
|
'CREATE INDEX "Contacts_ResourceID_idx" ON "Contacts" ("ResourceID");'
|
|
);
|
|
end;
|
|
|
|
procedure TForm1.CreateEvents;
|
|
begin
|
|
SQLite3Connection1.ExecuteDirect(
|
|
'CREATE TABLE Events (' +
|
|
'"RecordID" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, ' +
|
|
'"ResourceID" INTEGER NOT NULL, ' +
|
|
'"StartTime" DATETIME NOT NULL, ' +
|
|
'"EndTime" DATETIME NOT NULL, ' +
|
|
'"Description" VARCHAR (255), ' +
|
|
'"Location" VARCHAR (255), ' +
|
|
'"Notes" VARCHAR (1024), ' +
|
|
'"Category" INTEGER, ' +
|
|
'"AllDayEvent" BOOLEAN, ' +
|
|
'"DingPath" VARCHAR (255), ' +
|
|
'"AlarmSet" BOOLEAN, ' +
|
|
'"AlarmAdvance" INTEGER, ' +
|
|
'"AlarmAdvanceType" INTEGER, ' +
|
|
'"SnoozeTime" DATETIME, ' +
|
|
'"RepeatCode" INTEGER, ' +
|
|
'"RepeatRangeEnd" DATETIME, ' +
|
|
'"CustomInterval" INTEGER );'
|
|
);
|
|
SQLite3Connection1.ExecuteDirect(
|
|
'CREATE UNIQUE INDEX "Events_RecordID_idx" ON "Events" ("RecordID");'
|
|
);
|
|
SQLite3Connection1.ExecuteDirect(
|
|
'CREATE INDEX "Events_ResourceID_idx" ON "Events" ("ResourceID");'
|
|
);
|
|
SQLite3Connection1.ExecuteDirect(
|
|
'CREATE INDEX "Events_StartTime_idx" ON "Events" ("StartTime");'
|
|
);
|
|
SQLIte3Connection1.ExecuteDirect(
|
|
'CREATE INDEX "Events_EndTime_idx" ON "Events" ("EndTime");');
|
|
end;
|
|
|
|
procedure TForm1.CreateResources;
|
|
begin
|
|
SQLite3Connection1.ExecuteDirect(
|
|
'CREATE TABLE Resources (' +
|
|
'"ResourceID" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, '+
|
|
'"Description" VARCHAR (255), ' +
|
|
'"Notes" VARCHAR (1024), ' +
|
|
'"ImageIndex" INTEGER, ' +
|
|
'"ResourceActive" BOOLEAN );'
|
|
);
|
|
SQLite3Connection1.ExecuteDirect(
|
|
'CREATE UNIQUE INDEX "Resources_ResourceID_idx" ON "Resources" ("ResourceID");'
|
|
);
|
|
end;
|
|
|
|
procedure TForm1.CreateTasks;
|
|
begin
|
|
SQLite3Connection1.ExecuteDirect(
|
|
'CREATE TABLE Tasks (' +
|
|
'"RecordID" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, ' +
|
|
'"ResourceID" INTEGER NOT NULL, ' +
|
|
'"Complete" BOOLEAN, ' +
|
|
'"Description" VARCHAR(255), ' +
|
|
'"Details" VARCHAR(1024), ' +
|
|
'"CreatedOn" DATETIME, ' +
|
|
'"Priority" INTEGER, ' +
|
|
'"Category" INTEGER, ' +
|
|
'"CompletedOn" DATETIME, ' +
|
|
'"DueDate" DATETIME);'
|
|
);
|
|
SQLite3Connection1.ExecuteDirect(
|
|
'CREATE UNIQUE INDEX "Tasks_RecordID_idx" ON "Tasks" ("RecordID");'
|
|
);
|
|
SQLite3Connection1.ExecuteDirect(
|
|
'CREATE INDEX "Tasks_ResourceID_idx" ON "Tasks" ("ResourceID");'
|
|
);
|
|
end;
|
|
|
|
// Setting up the database connection and the datastore. Preselect a resource
|
|
// in the resource combo.
|
|
procedure TForm1.FormCreate(Sender: TObject);
|
|
begin
|
|
try
|
|
// Connection
|
|
Sqlite3Connection1.DatabaseName := DB_NAME;
|
|
|
|
// Transaction
|
|
SQLTransaction1.DataBase := Sqlite3Connection1;
|
|
|
|
if not FileExists(AppendPathDelim(Application.Location) + DB_NAME) then
|
|
CreateDB(AppendPathDelim(Application.Location) + DB_NAME);
|
|
|
|
// Connect the datastore. This opens the datasets and loads them into the store.
|
|
VpFlexDatastore1.Connected := true;
|
|
|
|
// Pre-select the first resource item
|
|
if VpFlexDatastore1.Resources.Count > 0 then
|
|
VpFlexDatastore1.Resource := VpFlexDatastore1.Resources.Items[0];
|
|
|
|
PageControl1.ActivePageIndex := 0;
|
|
|
|
except
|
|
on E:Exception do
|
|
begin
|
|
MessageDlg('ERROR', mtError, [mbOK], 0);
|
|
Close;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TForm1.FormDestroy(Sender: TObject);
|
|
begin
|
|
Sqlite3Connection1.Connected := false;
|
|
end;
|
|
|
|
end.
|
|
|