「InstantObjects 2.0によるWin32モデルドリブン開発」
ボーランド株式会社
Developer Tools Group高橋智宏

Copyright (C) 2006, Borland Software Corporation. 本文書の一部または全部の転載を禁止します。

第３回 ボーランド デベロッパー キャンプ

講師紹介



高橋智宏
1973年生まれ、京都大学 法学部卒
学生の時購入したTurboC++2ndからの熱狂的なボーランドファン
参加しているメーリングリストやコミュニティ
 JBuilder ML,C++Builder ML,Delphi ML,C# ML,CORBA ML 等…
 ミクシィ http://mixi.jp/show_friend.pl?id=208738

 「Java読書会」を運営
 http://www.javareading.com/bof/

2
Copyright (C) 2006, Borland Software Corporation. 本文書の一部または全部の転載を禁止します。

1第３回 ボーランド デベロッパー キャンプアジェンダ
 InstantOjbect 2.0 セットアップ

 Companyクラスのモデリング InterBaseにテーブルを作成

 GUIアプリケーションの作成
 IBExpressを使って接続 dbExpressを使って接続

3
Copyright (C) 2006, Borland Software Corporation. 本文書の一部または全部の転載を禁止します。

データベースへのアクセス

Copyright (C) 2006, Borland Software Corporation. 本文書の一部または全部の転載を禁止します。

2

第３回 ボーランド デベロッパー キャンプ

伝統的なDelphiデータベースアプリケーション
 データベースコンポーネントを使い、テーブルやカラムに個別にアクセスする アプリケーション開発者は、Integerやstring等のレベルでコードを書く
 データベースコンポーネントの種類により、コーディングする内容が変化する
データベースアプリケーション

コードＡ

コードＢ

コードＣ

テーブル
カラム

コードＤ

テーブル
カラム

BDE

IBExpress

RDBMS

RDBMS

ADO

dbExpress

RDBMS
5

Copyright (C) 2006, Borland Software Corporation. 本文書の一部または全部の転載を禁止します。

InstantObjects 2.0

Copyright (C) 2006, Borland Software Corporation. 本文書の一部または全部の転載を禁止します。

3第３回 ボーランド デベロッパー キャンプ

InstantObjects 2.0 とは？
 Delphi 5〜Delphi 2006(Win32)に対応した、オープンソースの Object Persistence Framework
 Object/Relational マッピングツール
 http://www.instantobjects.org/
 http://sourceforge.net/projects/instantobjects/

 IDEのプラグインとして統合されて動作する
 Turbo Delphi Explorer版 では動作しません ライセンスは、MPL1.1。
 最新バージョンは、2006年8月7日リリースの Ver2.0

7Copyright (C) 2006, Borland Software Corporation. 本文書の一部または全部の転載を禁止します。

第３回 ボーランド デベロッパー キャンプ

Object Persistence Framework を導入すると
 アプリケーション開発者は、Delphiのclass単位でアクセスできる
 テーブルやカラムにアクセスするコードは、フレームワークに任せることができる
 データベースコンポーネントの種類に依存しないコードが書ける
データベースアプリケーション
Class AClass B

モデル化されたDelphiのclass

InstantObjects

BDE

IBExpress

RDBMS Class A

ADORDBMS

dbExpress

RDBMS

Class BClass AClass B
8

Copyright (C) 2006, Borland Software Corporation. 本文書の一部または全部の転載を禁止します。

4第３回 ボーランド デベロッパー キャンプ

InstantObjects 2.0 のセットアップ
 BDS 2006（Delphi 2006）を使います Sourceforgeのミラーサイトからソースコードをダウンロードする http://jaist.dl.sourceforge.net/sourceforge/instantobjects/InstantObjects-2.0-src.zip C:¥InstantObjects に解凍する いちおう、ヘルプファイルはHelpフォルダにありますが、とてもシンプルです…
 IOHelp.chm − 414KB IOHelp.hlp − 655KB
 そのかわり、Delphi 5を使ったチュートリアルビデオ(.avi)が提供されています

9
http://jaist.dl.sourceforge.net/sourceforge/instantobjects/iointro.exe
Copyright (C) 2006, Borland Software Corporation. 本文書の一部または全部の転載を禁止します。

第３回 ボーランド デベロッパー キャンプ

InstantObjects 2.0 のセットアップ（続き）
 IDEのメインメニューから、「実行時パッケージ」に関するプロジェクトグループ（.bdsgroup）を開いて、すべてのプロジェクトをビルドする C:¥InstantObjects¥Source¥PackageGroups¥D2006¥RunTimePackages.bdsgroup

 IDEのメインメニューから、「設計時パッケージ」に関するプロジェクトグループ（.bdsgroup）を開いて、すべてのプロジェクトをビルドする C:¥InstantObjects¥Source¥PackageGroups¥D2006¥DesignTimePackages.bdsgroup 次のフォルダに、各種の実行時パッケージ(.bpl)および設計時パッケージ(.bpl) が生成されることを確認する
 C:¥Documents and Settings¥ログイン名¥My Documents¥Borland Studio Projects¥Bpl

 次のフォルダ配下に、各種の.dcuファイルが生成されることを確認する
 C:¥InstantObjects¥Source

10
Copyright (C) 2006, Borland Software Corporation. 本文書の一部または全部の転載を禁止します。

5

第３回 ボーランド デベロッパー キャンプ

InstantObjects 2.0 のセットアップ（続き）
 IDEのメインメニューから［コンポーネント］-［パッケージのインストール…］と選択し、必要な設計時パッケージをインストールする






DclIOCore_D10.bpl − 共通部分（必須）
DclIOBDE_D10.bpl − BDE用
DclIOADO_D10.bpl − dbGO（ADO）用DclIOIBX_D10.bpl − IBExpress用
DclIODBX_D10.bpl − dbExpress用
DclIOXML_D10.bpl − XML用

 ツールパレットに「InstantObjects」カテゴリが追加される

11
Copyright (C) 2006, Borland Software Corporation. 本文書の一部または全部の転載を禁止します。

サンプルアプリケーションの作成「Companyクラスのモデリング」

Copyright (C) 2006, Borland Software Corporation. 本文書の一部または全部の転載を禁止します。

6

第３回 ボーランド デベロッパー キャンプ

モデルユニットの決定 「社名」、「住所」を持つ Companyクラス をモデリングしますが、その前に…
 VCLフォームアプリケーションの新規作成
 モデル化するクラスの定義を書き出すソースコード（モデルユニット）の新規作成
 Model Explorer を表示させる

 ユニットを選択する

13
Copyright (C) 2006, Borland Software Corporation. 本文書の一部または全部の転載を禁止します。

第３回 ボーランド デベロッパー キャンプCompanyクラスのモデリング Companyクラスを定義します Model Explorer で「New Class」を選択し、値をセットします Class Name Base Class Unit
 Persistence Storage Name

− クラス名− 通常はTInstantObjectクラス− モデルユニット− 永続化する− 永続化時のテーブル名

14
Copyright (C) 2006, Borland Software Corporation. 本文書の一部または全部の転載を禁止します。

7

第３回 ボーランド デベロッパー キャンプCompanyクラスのモデリング（続き）
 Companyクラスの属性として「社名（CName）」、「住所（CAddr）」を定義します 「Attributes」タブを選択し、値をセットします Name Type Size StrageName− 属性名− 型（String型など）− 属性のサイズ（32文字など）− 永続化時のテーブル名

15
Copyright (C) 2006, Borland Software Corporation. 本文書の一部または全部の転載を禁止します。

第３回 ボーランド デベロッパー キャンプ

モデルユニット（.pas）と、.mdrファイル
 モデリング情報は、モデルユニット（.pas）および.mdrファイルに生成され、プロジェク
ト内で利用されます

モデルユニット

unit Unit2;
interface

プロジェクトソース

uses
InstantPersistence;program Project1;

typeCampany = class(TInstantObject){IOMETADATA stored 'Campany';
CName: String(32);
CAddr: String(64); }_CAddr: TInstantString;_CName: TInstantString;privatefunction GetCAddr: string;
function GetCName: string;procedure SetCAddr(const Value: string);
procedure SetCName(const Value: string);
publishedproperty CAddr: string read GetCAddr write SetCAddr;
property CName: string read GetCName write
SetCName;
end;

uses
Forms,Unit1 in 'Unit1.pas' {Form1},Unit2 in 'Unit2.pas';{$R *.res}{$R *.mdr} {Unit2}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

Project1.mdr

implementation{ Campany }function Campany.GetCAddr: string;
begin
Result := _CAddr.Value;
end;…
Copyright (C) 2006, Borland Software Corporation. 本文書の一部または全部の転載を禁止します。
…

816

第３回 ボーランド デベロッパー キャンプCompanyクラスをテーブルにマッピング 今回は、データベースとして InterBase を使用します InterBase Server を起動 管理コンソール（IBConsole）でデータベースファイルを作成
 Model Explorer に戻り、Database Builder を表示 IBExpress経由で接続することにします [New] − [IBX Connection] を選択 Connection名に「InterBase」等を入力
 [Edit]にて、接続情報を入力
 Database Builderで[Build]ボタンを押すと…

注：
接続に関する設定内容は、プロジェクトディレクトリ
配下に <Project名>.con ファイルとして保存されます

17Copyright (C) 2006, Borland Software Corporation. 本文書の一部または全部の転載を禁止します。

第３回 ボーランド デベロッパー キャンプCompanyクラスをテーブルにマッピング（続き）
 Companyクラスをテーブルにマッピングする際に使用するSQL文が表示されます

CREATE TABLE Campany(Class VARCHAR(32) NOT NULL, Id VARCHAR(32) NOT NULL, UpdateCount INTEGER,
CName VARCHAR(32), CAddr VARCHAR(64),
PRIMARY KEY (Class, Id))

 SQL文を確認して[Build Database]ボタンを押して、テーブルを生成します 一般的に既存のデータおよびテーブルは消去されてしまいます InterBase の管理コンソールで、作成されたテーブルを確認してみましょう
18
Copyright (C) 2006, Borland Software Corporation. 本文書の一部または全部の転載を禁止します。

9

サンプルアプリケーションの作成「GUIアプリケーションの作成」

Copyright (C) 2006, Borland Software Corporation. 本文書の一部または全部の転載を禁止します。

第３回 ボーランド デベロッパー キャンプ

TDataSourceやTDBGridを使ったサンプル
 データベース関連のVCLコンポーネントを使ったGUIアプリケーションを作成します IBExpressコンポーネント
 InstantObjectsコンポーネント
 TDataSource, TDBGrid

GUIアプリケーション
Company

データセットInstantObjects
IBExpress用コネクタ

IBExpress

InterBase20
Copyright (C) 2006, Borland Software Corporation. 本文書の一部または全部の転載を禁止します。

10

第３回 ボーランド デベロッパー キャンプ

TDataSourceやTDBGridを使ったサンプル（続き）
 配置するコンポーネント
TInstantIBXConnector（デフォルトのコネクション）
TIBDatabase

TIBTransaction

TInstantSelector（Company用データセット
AutoApplyはFalse）
TDataSource

TDBGrid21
Copyright (C) 2006, Borland Software Corporation. 本文書の一部または全部の転載を禁止します。

第３回 ボーランド デベロッパー キャンプCompanyクラスのインスタンスの追加
procedure TForm1.Button1Click(Sender: TObject);var
c: Campany;
begin
c := Campany.Create;c.CName := 'DevCo';
c.CAddr := '東京';
InstantSelector1.AddObject(c);FreeAndNil(c);InstantIBXConnector1.StartTransaction;
InstantSelector1.ApplyChanges;
InstantIBXConnector1.CommitTransaction;end;

22
Copyright (C) 2006, Borland Software Corporation. 本文書の一部または全部の転載を禁止します。

11

第３回 ボーランド デベロッパー キャンプCompanyクラスのインスタンスの編集用フォーム
 配置するコンポーネント
TInstantExposer（Company１個分のデータセット）

TDataSource

TDBEdit23
Copyright (C) 2006, Borland Software Corporation. 本文書の一部または全部の転載を禁止します。

第３回 ボーランド デベロッパー キャンプCompanyクラスのインスタンスの編集
 問題点ありのソースコード
procedure TForm1.Button2Click(Sender: TObject);var
c: Campany;
begin
c := InstantSelector1.CurrentObject as Campany;
Form3.InstantExposer1.Subject := c;Form3.ShowModal;
end;

24
Copyright (C) 2006, Borland Software Corporation. 本文書の一部または全部の転載を禁止します。

12第３回 ボーランド デベロッパー キャンプCompanyクラスのインスタンスの編集（続き）
 修正後のソースコード
procedure TForm1.Button2Click(Sender: TObject);
varc: Campany;
c2: Campany;
begin
c := InstantSelector1.CurrentObject as Campany;
c2 := c.Clone as Campany;
Form3.InstantExposer1.Subject := c2;
if Form3.ShowModal = mrOK thenbeginc.CName := c2.CName;c.CAddr := c2.CAddr;
InstantIBXConnector1.StartTransaction;
InstantSelector1.ApplyChanges;
InstantIBXConnector1.CommitTransaction;
end;
end;

25

Copyright (C) 2006, Borland Software Corporation. 本文書の一部または全部の転載を禁止します。

第３回 ボーランド デベロッパー キャンプ

複数クライアントによる同時更新
 Companyテーブル内にある UpdateCountカラム（INTEGER型） を使用
 更新ごとにインクリメントされる
 実際に発行されるSQL文のWHERE句で UpdateCount を参照

 UpdateCountカラムを、InterBaseの管理コンソールで確認
 二つのクライアントで、同じCompanyを同時に更新してみる
 後に更新するクライアントで例外が発生
 InstantIBXConnector1.RollbackTransaction; を行う

26
Copyright (C) 2006, Borland Software Corporation. 本文書の一部または全部の転載を禁止します。

13

第３回 ボーランド デベロッパー キャンプ

IBExpressからdbExpressに変更する
 InstantObjectsで使用する接続方式を IBExpress から dbExpress に変更してみる もちろんテーブルの再生成は必要ありません 置き換えるコンポーネント

GUIアプリケーション

 TIBDatabase− TSQLConnection
 TIBTransaction− なし
 TInstantIBXConnector − TInstantDBXConnector

Company

データセットInstantObjects
dbExpress用コネクタ

dbExpress

InterBase27
Copyright (C) 2006, Borland Software Corporation. 本文書の一部または全部の転載を禁止します。

第３回 ボーランド デベロッパー キャンプ

dbExpress、TInstantDBXConnector を使用する際の注意点
 dbExpress、TInstantDBXConnector を使用する際の注意点
 トランザクションのIsolationLevel（分離レベル）を外部から制御できない
 TInstantDBXConnector を継承して、自前で明示的にセットする
InstantDBX.pasのソースコード...
TInstantDBXConnector = class(TInstantConnectionBasedConnector)
privateFTransactionDesc: TTransactionDesc;...
protected
procedure InitTransactionDesc(var ATransactionDesc: TTransactionDesc);
virtual;
...
end;
...
procedure TInstantDBXConnector.InitTransactionDesc(var ATransactionDesc: TTransactionDesc);
begin
ATransactionDesc.TransactionID := 1;
ATransactionDesc.GlobalID := 0;28
end;
Copyright (C) 2006, Borland Software Corporation. 本文書の一部または全部の転載を禁止します。

14

Thank you

Copyright (C) 2006, Borland Software Corporation. 本文書の一部または全部の転載を禁止します。

15