トップへ(mam-mam.net/)

DelphiとMySQL/MariaDBで作る軽量タスク管理アプリ|実用的なVCLサンプル

DelphiとMySQL/MariaDBで作る軽量タスク管理アプリ

DelphiとMySQL/MariaDBを活用して、軽量な業務用タスク管理アプリを構築したい方へ。
このページでは、FireDACによるDB接続、VCLコンポーネントの配置などを丁寧に紹介します。
Delphiのプロパティ設定だけで殆ど完結する、実務に役立つ開発スタイルを提案します。
ただし、ソースコードを1行だけ記述します。

Delphiはコンポーネントとプロパティ設定だけで簡潔なデータベースアプリケーションを構築できる開発環境です。

データベースの作成

-- データベース「db_task」の作成
CREATE DATABASE IF NOT EXISTS db_task CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE db_task;

-- ステータス マスタ テーブルの作成
CREATE TABLE IF NOT EXISTS tm_status(
  status_id INTEGER PRIMARY KEY,
  status_name VARCHAR(20)
) ENGINE=InnoDB;
-- レコード挿入
INSERT INTO tm_status(status_id, status_name) VALUES(1,'未完了'),(2,'進行中'),(3,'完了');

-- 優先度 マスタ テーブルの作成
CREATE TABLE IF NOT EXISTS tm_priority(
  priority_id INTEGER PRIMARY KEY,
  priority_name VARCHAR(10)
) ENGINE=InnoDB;
-- 優先度 マスタ テーブルへレコード挿入
INSERT INTO tm_priority(priority_id, priority_name) VALUES(1,'高'),(2,'中'),(3,'低');


-- タスク テーブルの作成
CREATE TABLE IF NOT EXISTS t_task(
  task_id INTEGER PRIMARY KEY AUTO_INCREMENT,
  task_title VARCHAR(100) NOT NULL,
  task_text VARCHAR(1000),
  task_limit DATETIME,
  task_status_id INTEGER NOT NULL DEFAULT 1,
  task_priority_id INTEGER NOT NULL DEFAULT 1,
  task_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  task_regdate TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
-- インデックス作成
CREATE INDEX IF NOT EXISTS idx_task_limit ON t_task(task_limit);

-- ユーザー「task_user」をパスワード「password」で作成
CREATE USER 'task_user'@'localhost' IDENTIFIED BY 'password';

-- 権限付与(db_task に対して全権限)
GRANT ALL PRIVILEGES ON db_task.* TO 'task_user'@'localhost';

-- 権限の即時反映
FLUSH PRIVILEGES;
MariaDB(MySQL)のデータベース作成

データベース「db_task」

tm_status(ステータスマスタテーブル)

status_id INTEGER ステータスID
status_name VARCHAR ステータス

tm_priority(優先度 マスタテーブル)

priority_id INTEGER 優先度ID
priority_name VARCHAR 優先度

t_task(タスク テーブル)

task_id INTEGER タスクID
task_title VARCHAR タスク名
task_text VARCHAR タスク詳細
task_limit DATETIME タスク期限
task_status_id INTEGER タスク ステータスID
task_priority_id INTEGER タスク 優先度ID
task_update TIMESTAMP 更新日
task_regdate TIMESTAMP 登録日

ER図

t_task(タスク テーブル)
  task_id         tm_status(ステータスマスタテーブル)
  task_status_id  ─── status_id
  task_priority_id ─┐
            │  tm_priority(優先度 マスタテーブル)
            └─ priority_id

JCL、JVCLのインストール

Delphiでデータベースアプリケーションを作成する場合、JCL及びJVCLをインストールしておくと便利です。
[GetItパッケージマネージャー]から 「JCL(JEDI Component Library)」と「JVCL(JEDI Visual Component Library)」をインストールすることが出来ます。
(Delphi Community Edition 12.1の場合、GetItでインストールできませんでした。不足ファイルなどもあり別途ダウンロードやファイルのコピーなど手作業が必要でした。)

libmysql.dll(MySQL) 又は libmariadb.dll(MariaDB)クライアント(コネクター)

MySQLのコネクターは以下のURLから
https://downloads.mysql.com/archives/c-c/
例えば、
Product Version: 6.1.11
Operation System: Microsoft Windows
OS Version: Windows(x86, 32-bit)
等を選択して、ZIP Archive の Download ボタンをクリックすればダウンロードできます。

MariaDBのコネクターは以下からダウンロードできるようです。
https://mariadb.com/downloads/connectors/
例えば、
Product: C connector
Version: 3.4.7-GA
OS Version: MS Windows(32-bit x86)
等を選択して、Download ボタンをクリックすればmsiインストーラー形式ファイルがダウンロードできます。

又はMariaDBサーバーをダウンロードしてインストールした場合は以下のような位置にバイナリのコネクター(3.3.6の64bit)も存在しています。
C:\Program Files\MariaDB 11.1\lib\libmariadb.dll

お使いのDelphiが対応しているバージョン、及び、開発するアプリのビット数(32ビットコンパイルなら32ビットのDLLを、64ビットコンパイルなら64ビットのDLL)に合わせて使用する必要があります。
ちなみに、libmysql.dll(MySQL)を使ってMariaDBサーバーに接続することもバージョンが合えば可能で、その逆(libmariadb.dllでMySQLサーバー接続)も可能です。

32bit版DLLファイルは「プロジェクトフォルダ\Win32\Debug」と「プロジェクトフォルダ\Win32\Release」に配置します。
64bit版DLLファイルは「プロジェクトフォルダ\Win64\Debug」と「プロジェクトフォルダ\Win64\Release」に配置します。

プロジェクトの作成と画面設計

プロジェクトを新規作成(VCLアプリケーション)します。
フォーム(Form1)上に以下のようにコンポーネントをドラッグ&ドロップで配置配置します。
「すべて保存」をクリックして、任意のディレクトリを作成し、ユニット(Unit1.pas)とプロジェクト(Project1.dproj)を保存します。

TFDConnection1個Form1の上に配置
TFDPhysMySQLDriverLink1個Form1の上に配置
TFDQuery1個Form1の上に配置
TDataSource3個Form1の上に配置
TFDTable2個Form1の上に配置
TJvDBGrid1個Form1の上に配置
TPanel1個Form1の上に配置
TLabel 6個 Panel1の上に配置し、Captionプロパティを以下6つに設定しておく
  • タスクID:
  • タスク名:
  • タスク詳細:
  • 期限:
  • 状態:
  • 優先度:
TDBText1個Panel1の上に配置
TDBEdit1個Panel1の上に配置
TDBMemo1個Panel1の上に配置
TJvDBDatePickerEdit1個Panel1の上に配置
TJvDBLookupCombo2個Panel1の上に配置
TDBNavigator1個Panel1の上に配置
MariaDB(MySQL)のデータベース作成

ここで一旦、[プロジェクト] ⇒ [全てのプロジェクトをコンパイル] をクリックします。
プロジェクトフォルダ内に「\Win32\Debug」フォルダが生成されます。
上記でダウンロードした32Bit版のlibmysql.dll(MySQL)又はlibmariadb.dll(MariaDB)を「プロジェクトフォルダ\Win32\Debug」にコピーしておきます。
また、64Bit版の場合はIDEから64bitに切り替えてからコンパイルし、64Bit版のlibmysql.dll(MySQL)又はlibmariadb.dll(MariaDB)を「プロジェクトフォルダ\Win64\Debug」にコピーしておきます。

画面設計の続き

FDPhysMySQLDriverLink1をクリックして選択します。
左下ペインの「オブジェクト インスペクタ」のプロパティの「VendorLib」の右側の「...」ボタンをクリックします。

MariaDB(MySQL)のデータベース作成

上記で配置したlibmysql.dll(MySQL)又はlibmariadb.dll(MariaDB)を選択して[開く]ボタンを押します。

MariaDB(MySQL)のデータベース作成

FDConnection1 をダブルクリックします。
ドライバIDを「MySQL」に設定します。
[Database] をdb_task に設定します。
[User_Name] を task_user に設定します。
[Password] を password に設定します。
[Server] を localhost に設定します。
[Port] を 3306 に設定します。
[CharacterSet] を utf8mb4 に設定します。
設定できたら「OK」ボタンを押して閉じます。

MariaDB(MySQL)のデータベース作成

コンポーネントのプロパティを設定します。

コンポーネント.プロパティ
FDConnection1.LoginPromptFalse
FDQuery1.ConnectionFDConnection1
DataSource1.DatasetFDQuery1
JvDBGrid1.DataSourceDataSource1
JvDBGrid1.ReadOnlyTrue
JvDBGrid1は一覧とレコード選択だけに使うので読み取り専用とする
FDTable1.ConnectionFDConnection1
FDTable1.TableNametm_status
DataSource2.DatasetFDTable1
FDTable2.ConnectionFDConnection1
FDTable2.TableNametm_priority
DataSource3.DatasetFDTable2
DBNavigator1.DataSourceDataSource1

FDQuery1 をダブルクリックします。
以下のSQLを入力します。「OK」を押して閉じます。

SELECT 
  task_id, task_title, task_text, 
  task_limit, task_status_id, status_name, 
  task_priority_id, priority_name
FROM t_task
  LEFT OUTER JOIN tm_status 
    ON t_task.task_status_id=tm_status.status_id
  LEFT OUTER JOIN tm_priority 
    ON t_task.task_priority_id=tm_priority.priority_id
Delphi+SQLiteでアプリケーション作成(Delphi IDEで画面設計)

FDQuery1、FDTable1、FDTable2コンポーネントのプロパティを設定し、データベースへ接続します。
(SQLなどを変更した場合に以下プロパティは自動的にFalseになるので、接続されていないと感じたら以下プロパティを確認しましょう。)

コンポーネント.プロパティ
FDQuery1.ActiveTrue
FDTable1.ActiveTrue
FDTable2.ActiveTrue

JvDBGrid1をダブルクリックします。
表示されたウィンドウの上にある「全てのフィールドを追加」ボタンをクリックします。

Delphi+MySQL/MariaDBでアプリケーション作成(Delphi IDEで画面設計)

JvDBGrid1のフィールドのプロパティを設定します。

コンポーネント.プロパティ
JvDBGrid1.Columns[0].Width (task_id)40
JvDBGrid1.Columns[0].Title.Caption (task_id)タスクID
JvDBGrid1.Columns[1].Width (task_title)160
JvDBGrid1.Columns[1].Title.Caption (task_title)タスク名
JvDBGrid1.Columns[2].Width (task_text)160
JvDBGrid1.Columns[2].Title.Caption (task_text)タスク詳細
JvDBGrid1.Columns[3].Width (task_limit)112
JvDBGrid1.Columns[3].Title.Caption (task_limit)期限
JvDBGrid1.Columns[4].Width (task_status_id)0
JvDBGrid1.Columns[5].Title.Caption (status_name)80
JvDBGrid1.Columns[5].Width (status_name)状態
JvDBGrid1.Columns[6].Title.Caption (task_priority_id)0
JvDBGrid1.Columns[7].Width (priority_name)80
JvDBGrid1.Columns[7].Title.Caption (priority_name)優先度
Delphi+MySQL/MariaDBでアプリケーション作成(Delphi IDEで画面設計)


入力用コンポーネントのプロパティを設定します。

DBText1.DataSourceDataSource1
DBText1.DataFieldtask_id
DBEdit1.DataSourceDataSource1
DBEdit1.DataFieldtask_title
DBMemo1.DataSourceDataSource1
DBMemo1.DataFieldtask_text
JvDBDatePickerEdit1.DataSourceDataSource1
JvDBDatePickerEdit1.DataFieldtask_limit


ルックアップフィールド(TJvDBLookupCombo1) コンポーネントの設定
ルックアップフィールドを使うと、別のデータセット(マスタテーブル)の一覧を表示しながらレコードにキー値を設定することが出来ます。

JvDBLookupCombo1.DataSourceDataSource1
(このデータソースに値を設定する)
JvDBLookupCombo1.DataFieldtask_status_id
(このカラムに値を設定する)
JvDBLookupCombo1.LookupSourceDataSource2
(一覧として表示するデータソースを指定する)
JvDBLookupCombo1.LookupFieldstatus_id
(このカラムの値を設定する)
JvDBLookupCombo1.LookupDisplaystatus_name
(このカラムの値を一覧表示する)
JvDBLookupCombo2.DataSourceDataSource1
JvDBLookupCombo2.DataFieldtask_priority_id
JvDBLookupCombo2.LookupSourceDataSource3
JvDBLookupCombo2.LookupFieldpriority_id
JvDBLookupCombo2.LookupDisplaypriority_name

ソースコードの記述

ソースコードを1行だけ記述します。
[FDQuery1]をクリックして選択し、左下ペイン「オブジェクト インスペクタ」を[イベント]タブに切り替え、
[AfterPost]の右側欄の空白箇所をダブルクリックします。
以下赤字のソースコードを入力します。

procedure TForm1.FDQuery1AfterPost(DataSet: TDataSet);
begin
    FDQuery1.Refresh; //表示更新
end;

実行する

実行ボタンを押して実行します。(デバッグ実行でもOK)
JvDBGridでデータを選択でき、DBNavigator1でレコードの移動などレコード操作が可能です。
下側のPanel1上のコンポーネントでレコードの編集が可能です。
TJvDBLookupCombo(JvDBLookupCombo1やJvDBLookupCombo2)でルックアップフィールドの編集が可能です。

Delphi+MySQL/MariaDBでアプリケーション作成(Delphi IDEで画面設計)