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;
データベース「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)を保存します。
| TFDConnection | 1個 | Form1の上に配置 |
| TFDPhysMySQLDriverLink | 1個 | Form1の上に配置 |
| TFDQuery | 1個 | Form1の上に配置 |
| TDataSource | 3個 | Form1の上に配置 |
| TFDTable | 2個 | Form1の上に配置 |
| TJvDBGrid | 1個 | Form1の上に配置 |
| TPanel | 1個 | Form1の上に配置 |
| TLabel | 6個 |
Panel1の上に配置し、Captionプロパティを以下6つに設定しておく
|
| TDBText | 1個 | Panel1の上に配置 |
| TDBEdit | 1個 | Panel1の上に配置 |
| TDBMemo | 1個 | Panel1の上に配置 |
| TJvDBDatePickerEdit | 1個 | Panel1の上に配置 |
| TJvDBLookupCombo | 2個 | Panel1の上に配置 |
| TDBNavigator | 1個 | Panel1の上に配置 |
ここで一旦、[プロジェクト] ⇒ [全てのプロジェクトをコンパイル] をクリックします。
プロジェクトフォルダ内に「\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」の右側の「...」ボタンをクリックします。
上記で配置したlibmysql.dll(MySQL)又はlibmariadb.dll(MariaDB)を選択して[開く]ボタンを押します。
FDConnection1 をダブルクリックします。
ドライバIDを「MySQL」に設定します。
[Database] をdb_task に設定します。
[User_Name] を task_user に設定します。
[Password] を password に設定します。
[Server] を localhost に設定します。
[Port] を 3306 に設定します。
[CharacterSet] を utf8mb4 に設定します。
設定できたら「OK」ボタンを押して閉じます。
コンポーネントのプロパティを設定します。
| コンポーネント.プロパティ | 値 |
|---|---|
| FDConnection1.LoginPrompt | False |
| FDQuery1.Connection | FDConnection1 |
| DataSource1.Dataset | FDQuery1 |
| JvDBGrid1.DataSource | DataSource1 |
| JvDBGrid1.ReadOnly | True JvDBGrid1は一覧とレコード選択だけに使うので読み取り専用とする |
| FDTable1.Connection | FDConnection1 |
| FDTable1.TableName | tm_status |
| DataSource2.Dataset | FDTable1 |
| FDTable2.Connection | FDConnection1 |
| FDTable2.TableName | tm_priority |
| DataSource3.Dataset | FDTable2 |
| DBNavigator1.DataSource | DataSource1 |
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
FDQuery1、FDTable1、FDTable2コンポーネントのプロパティを設定し、データベースへ接続します。
(SQLなどを変更した場合に以下プロパティは自動的にFalseになるので、接続されていないと感じたら以下プロパティを確認しましょう。)
| コンポーネント.プロパティ | 値 |
|---|---|
| FDQuery1.Active | True |
| FDTable1.Active | True |
| FDTable2.Active | True |
JvDBGrid1をダブルクリックします。
表示されたウィンドウの上にある「全てのフィールドを追加」ボタンをクリックします。
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) | 優先度 |
入力用コンポーネントのプロパティを設定します。
| DBText1.DataSource | DataSource1 |
| DBText1.DataField | task_id |
| DBEdit1.DataSource | DataSource1 |
| DBEdit1.DataField | task_title |
| DBMemo1.DataSource | DataSource1 |
| DBMemo1.DataField | task_text |
| JvDBDatePickerEdit1.DataSource | DataSource1 |
| JvDBDatePickerEdit1.DataField | task_limit |
ルックアップフィールド(TJvDBLookupCombo1) コンポーネントの設定
ルックアップフィールドを使うと、別のデータセット(マスタテーブル)の一覧を表示しながらレコードにキー値を設定することが出来ます。
| JvDBLookupCombo1.DataSource | DataSource1 (このデータソースに値を設定する) |
| JvDBLookupCombo1.DataField | task_status_id (このカラムに値を設定する) |
| JvDBLookupCombo1.LookupSource | DataSource2 (一覧として表示するデータソースを指定する) |
| JvDBLookupCombo1.LookupField | status_id (このカラムの値を設定する) |
| JvDBLookupCombo1.LookupDisplay | status_name (このカラムの値を一覧表示する) |
| JvDBLookupCombo2.DataSource | DataSource1 |
| JvDBLookupCombo2.DataField | task_priority_id |
| JvDBLookupCombo2.LookupSource | DataSource3 |
| JvDBLookupCombo2.LookupField | priority_id |
| JvDBLookupCombo2.LookupDisplay | priority_name |
ソースコードの記述
ソースコードを1行だけ記述します。
[FDQuery1]をクリックして選択し、左下ペイン「オブジェクト インスペクタ」を[イベント]タブに切り替え、
[AfterPost]の右側欄の空白箇所をダブルクリックします。
以下赤字のソースコードを入力します。
procedure TForm1.FDQuery1AfterPost(DataSet: TDataSet);
begin
FDQuery1.Refresh; //表示更新
end;
実行する
実行ボタンを押して実行します。(デバッグ実行でもOK)
JvDBGridでデータを選択でき、DBNavigator1でレコードの移動などレコード操作が可能です。
下側のPanel1上のコンポーネントでレコードの編集が可能です。
TJvDBLookupCombo(JvDBLookupCombo1やJvDBLookupCombo2)でルックアップフィールドの編集が可能です。
