【A5】Delphi/C++テクニカルセッション

Delphi/C++Builderオープンソースコンポーネント実践活用法
主要コンポーネントの紹介からJEDI Visual Component Libraryの活用まで

株式会社 日本情報システム
筑木真志

アジェンダ

• 主なDelphi/C++Builder用フリーコンポーネント• JCL/JVCLのインストール• JVCLのコンポーネント紹介• まとめ・質疑応答

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

2

主なDelphi/C++Builder用フリーコンポーネント

主なDelphi/C++Builder用フリーコンポーネント• Indy (OSS MPL/BSD)
http://www.indyproject.org/
ネットワークコンポーネント• Open XML (OSS MPL)
http://www.philo.de/xml/index.shtml
XMLパーサコンポーネント※XMLパーサはlibxml2(http://xmlsoft.org/)とXerces(http://xerces.apache.org/xerces-c/)がC++Builderで利用可能。

• GLScene (OSS MPL)
http://glscene.sourceforge.net/wikka/HomePage
OpenGLベースの3Dライブラリ
本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

4

主なDelphi/C++Builder用フリーコンポーネント• TurboPower (OSS MPL)
http://tpabbrevia.sourceforge.net/ （本家）
http://www.songbeamer.com/delphi/ （Delphi 2009用）
••
•
•
•

Abbrevia（ZIP,CAB,TAR,gzipなどのアーカイブ操作コンポーネント）
Orpheus（高機能グリッド、Outlook風ツールバーなどのGUIコンポーネント）
LockBox（暗号、デジタル署名処理コンポーネント）
Async Professional（シリアルポート、FAX,TAPI操作コンポーネント）
SysTools（メモリマップドファイル、会計処理ルーチン等）など• LMD Tools Special Edition (Freeware ※有料版はソースコードあり)
http://www.lmd.de/products/vcl/lmdtools/
各種GUIコンポーネント付属のPartner DVDに含まれている本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

5

主なDelphi/C++Builder用フリーコンポーネント• JEDI Code Library (OSS MPL)
http://homepages.codegear.com/jedi/jcl/
各種ユーティリティ関数• JEDI Visual Component Library (OSS MPL)
http://homepages.codegear.com/jedi/jvcl/
各種GUIコンポーネント

これらは、 Project JEDI(http://delphi-jedi.org/)の一部として提供

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

6

JCL/JVCLのインストール

JCL/JVCLのインストール• ソースコードの入手• JCL
http://sourceforge.net/project/showfiles.php?group_id=47514
http://jvcl.sourceforge.net/daily/ (Daily Zip)
https://jcl.svn.sourceforge.net/svnroot/jcl/trunk (SVNリポジトリ)• JVCLhttp://sourceforge.net/project/showfiles.php?group_id=45786
http://jcl.sourceforge.net/daily/ (Daily Zip)
http://jvcl.svn.sourceforge.net/svnroot/jvcl/trunk/ (SVNリポジトリ)※ JVCL の配布パッケージにJCLが含まれている場合がある• ドキュメント• HTML Help2形式等で配布• ただし、全てのコンポーネントを網羅していない本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

8

JCL/JVCLのインストール• 前準備• 今回は”C:¥lib¥”にインストール• アーカイブをC:¥libの下に展開する
C:¥libJCLJVCL• 以後、JCLのインストール先(C:¥lib¥jcl)を$(JCL)JVCLのインストール先(C:¥lib¥jvcl)を$(JVCL)と略します• インストーラーの実行• 管理者権限が必要• JCLとJVCLのインストーラーはRAD Studio Command Promptから実行

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

9

JCLのインストール• インストーラーの起動$(JCL)¥install.batを実行すると、インストーラーが起動する

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

10

JCLのインストール• 「RichEditでの行の挿入エラー」が発生した場合の対処方法
1. $(JCL)¥install¥prototypes¥JediGUIInstall.pasの815行目付近にあるプロシージャ”AddLogLine”の中身をコメントにする

コメントアウト

2. $(JCL)¥bin¥JediInstaller.exeを削除してから、install.batを再実行

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

11

JCLのインストール• C++Builderでコンパイルエラーが発生した場合の対処方法• “Check HPP files”のチェックボックスを外す

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

12

JVCLのインストール• インストーラーの起動$(JVCL)¥install.batを実行するとインストーラーが起動する

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

13

JVCLのインストール• インストールオプションの選択

パッケージ化する場合は、“Build packages”をチェック

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

14

JCL/JVCLの配布ライセンスについて• JCL/JVCLはMPL（Mozilla Public License）にて配布• FirefoxやThunderbirdで採用されているライセンス• 「現状のまま」で配布する限り自由に配布／複製が可能• 何らかの変更を加えた場合、MPLで公開する義務が発生• ただし、独自コードを持つアプリケーションに MPL 下のコードを使用しても、独自コードのライセンスはMPLにならない• よって、 JCL/JVCLを自社のプロプライエタリなアプリケーションに組み込んで、配布することが可能• ライセンス条文等• http://www.mozilla.org/MPL/MPL-1.1.html （ライセンス条文）• http://www.mozilla-japan.org/MPL/mpl-faq.html （日本語でのFAQ）

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

15

JVCLのコンポーネント紹介

JVCLのコンポーネント紹介
TJvCreateProcess （カテゴリ：Jv None-Visual）
概要
API CreateProcessをラップするコンポーネント

主なプロパティCommandLine

実行オプション

ConsoleOptions

コンソールアプリケーションの実行オプション

StartupInfo

子プロセスのウィンドウ状態

ConsoleOutput

コンソールアプリケーションの出力結果

State

子プロセスの状態

ProcessInfo

子プロセスの情報

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

17

JVCLのコンポーネント紹介
TJvCreateProcess
主なメソッド
Run子プロセスを実行する

Write/WriteLn

子プロセスの標準出力へ文字列を出力する

CloseApplication

子プロセスを終了する

Terminate

子プロセスを強制終了する

主なイベントOnTerminate

子プロセスが終了したときに発生する

OnRawRead

コンソールから出力があったときに発生する

OnReadコンソールから出力があったときに発生する（Back SpaceやTabは変換される）本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

18

JVCLのコンポーネント紹介• TJvCreateProcessの使い方• CommandLineプロパティに実行するコマンドラインを設定• Runメソッドを呼び出す• Stateプロパティの値をチェックする

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

19

JVCLのコンポーネント紹介• TJvCreateProcessの使い方• 子プロセスの情報はProcessInfoプロパティを参照する• 中身はPROCESS_INFORMATION 構造体そのもの
typedef struct _PROCESS_INFORMATION {HANDLE hProcess;// プロセスのハンドル
HANDLE hThread;// プライマリスレッドのハンドル
DWORD dwProcessId; // プロセスID
DWORD dwThreadId;// プライマリスレッドID} PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;• コンソールアプリケーションでコマンドプロンプトを表示したくない場合は…
StartupInfoの属性値をDefaultWindowState → false
ShowWindow → swHideに設定する

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

20

JVCLのコンポーネント紹介• コンソールアプリケーションとのデータのやりとり• ConsoleOptionsのcoRedirectをtrueにする• コンソールアプリケーションの標準出力を取り込む場合は…
• OnRead/OnRawReadイベントで結果を取り込む、あるいは、
ConsoleOutput プロパティを参照する• コンソールアプリケーションの標準入力にデータを渡す場合は…
• Writeメソッドで子プロセスの標準出力に文字列を渡す• WriteLnメソッドは自動的に改行を付加する

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

21

JVCLのコンポーネント紹介• TJvCreateProcessのイベント
OnReadイベント
Senderイベント ハンドラを持ったオブジェクト

S

文字列

StartsOnNewLine

新規行の場合、true• コード例

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

22

JVCLのコンポーネント紹介• 子プロセスの終了方法• CloseApplicationメソッドにtrueを渡して呼び出す• 子プロセスの全ウィンドウにWM_CLOSEを送ってプロセスを終了させる• CloseApplicationメソッドにfalseを渡して呼び出す• 子プロセスの全スレッドにWM_QUITを送ってプロセスを終了させる• Terminateメソッド• TerminateProcess APIを使って子プロセスを強制終了させる

子プロセスが終了すると、OnTerminateイベントが発生する

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

23

JVCLのコンポーネント紹介• TJvCreateProcessのイベント
OnTerminateイベント
Senderイベント ハンドラを持ったオブジェクト

ExitCode

子プロセスの終了コード• コード例

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

24

JVCLのコンポーネント紹介• TJvThread （カテゴリ：Jv Threading）
概要
TThreadクラスを継承せずにマルチスレッドを実現するコンポーネント

主なプロパティ
Terminated

スレッドが終了かしたか否か

ReturnValue

スレッドの戻り値

ThreadDialog

スレッド実行中に表示するダイアログ

主なメソッド
Executeスレッドを実行する

Terminate

スレッドを終了する

CancelExecute

スレッドに中断を通知する

Suspend

スレッドの実行を一時停止する

Resumeスレッドの実行を再開する

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

25

JVCLのコンポーネント紹介• TJvThread
主なイベントOnBegin

スレッドが開始するときに発生する

OnExecute

スレッドが実行された場合に実行されるコード

OnFinish

スレッドが終了するときに発生する

BeforeResume

スレッドが再開するときに発生する

OnCancelExecute

スレッドが中断しようとするときに発生する• TJvThreadは以下の順番でイベントが発生する
1. OnBegin
2. BeforeResume
3. OnExecute
4. OnFinish

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

26

JVCLのコンポーネント紹介• TJvThreadでのスレッドの実行• スレッドの実行はExecuteメソッドを呼び出す
Executeメソッド
P

OnExecteイベントに渡すパラメータ（汎用ポインタ）

戻り値：

スレッドの実行に失敗すればNULL値• コード例

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

27

JVCLのコンポーネント紹介• TJvThreadのイベント
OnExecuteイベント
Senderイベント ハンドラを持ったオブジェクトParams

Executeメソッドで渡したパラメーター• コード例

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

28

JVCLのコンポーネント紹介• ThreadDialogプロパティとTJvThreadSimpleDialog• TJvThreadSimpleDialogを使用すると、スレッドの実行中にダイアログを表示することが出来る• ダイアログの振る舞いはDialogOptions（TJvThreadSimpleDialogOptions）の属性値を変更する

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

29

JVCLのコンポーネント紹介• TJvThreadSimpleDialogの属性
主なプロパティ
DialogOptions

ダイアログの属性

Caption

ダイアログのタイトル

InfoText

ダイアログに表示する文字列

CancelButtonCaption

Cancelボタンに表示する文字列

ShowDialog

ダイアログを表示するかどうか

主なイベントOnPressCancel

Cancelボタンが押されたときに発生する本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

30

JVCLのコンポーネント紹介• TJvThreadSimpleDialogのイベント
OnPressCancelイベント
CurrentThread

中断しようとするスレッド• コード例

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

31

JVCLのコンポーネント紹介• TJvThreadのイベント
OnCancelExecuteイベント
CurrentThread

実行を中止するスレッド• コード例

注意： OnCancelExecuteイベントを実装した場合、 OnCancelExecute内でTerminateメソッドを呼び出す必要がある

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

32

JVCLのコンポーネント紹介• TJvCsvDataSet （カテゴリ：Jv Data Access）
概要
CSVファイルをテーブルして扱うことが出来るデータセットコンポーネント

主なプロパティ
FileName

テーブルとして扱うCSVファイル

CsvFieldDef

CSVファイルの構造定義CsvUniqueKeys

キーとなるフィールドを指定するかどうか

CsvKeyDef

キーとなるフィールド名（カンマ区切りで複数指定可）

CaseInsensitive

キーの大文字・小文字を区別するかどうか

HasHeaderRow

CSVファイルの最初の行を項目名と見なすかどうか• プロパティ、メソッド、イベントの使い勝手はVCLのデータセットコンポーネントと同一• ただし、 FieldDefsプロパティはCsvFieldDefの定義後に編集をする

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

33

JVCLのコンポーネント紹介• TJvCsvDataSetのフィールド定義方法• オブジェクトインスペクタで”CsvFieldDef”右脇のボタンをクリック• 設定ダイアログが表示される
項目名

機能

Field Name

フィールド名

Lengthフィールド長Field Types

フィールド種類

Fieldsフィールド一覧

Add

フィールド追加

Modifyフィールド属性変更
フィールド並び変更

Delete

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

フィールド削除

34

JVCLのコンポーネント紹介• GUIコンポーネントとの接続• DataSourceコンポーネント経由でGUIコンポーネントと接続する• CSVファイルとの接続• FileNameプロパティにCSVファイルのファイル名を設定• ActiveプロパティをTrueにする

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

35

JVCLのコンポーネント紹介• TJvFooter （カテゴリ：Jv Bars,Panels）
概要
フォームの下部等にボタンを揃えて配置するパネル

主なプロパティBevelVisible

親フォームとの境界線を表示するかどうか• TJvFooterBtn
概要
TJvFooterが持つボタン

主なプロパティ
Alignment

パネル内でどのようにボタンを揃えるかを指定

ButtonIndex

ボタンの配置順

SpaceInterval

隣のボタンとの間隔

Spacing

イメージとキャプションとの間隔

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

36

JVCLのコンポーネント紹介•TJvFooterの使い方
1. TJvFooter上で右クリックして、項目を挿入するボタンを1つ追加する

Add button
MS Office 2000

“Help”を左端、”OK”と”キャンセル”を右端に配置

MS Enterprise Manager
WizardWizard風にボタンを配置“Previous”と”Next”と”閉じる”を右端に配置

Dialog Mode”OK”をセンタリングして配置

2. 配置したTJvFooterBtnの使い方はTButtonと同じ••

Captionプロパティでテキスト文字列を設定
ボタンが押されたときは、 OnClickイベントが発生

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

37

JVCLのコンポーネント紹介• TJvEmbeddedFormPanel （カテゴリ：Jv Application,Forms）
概要
パネルの内側にTForm派生フォームを埋め込む
オプション画面のように、複数の画面を切り替えて表示したい場合に有用

主なプロパティ
FormLink

埋め込むフォームが持つTJvEmbeddedFormLinkオブジェクト

フォームの中身がパネルに埋め込まれる本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

38

JVCLのコンポーネント紹介•

TJvEmbeddedFormPanelの使い方
1. フォームにTJvEmbeddedFormPanel を貼り付ける
2. 埋め込むフォームにJvEmbeddedFormLinkを貼り付ける
3. フォームが埋め込むフォームを参照できるようにする
Delphiならば、uses節
C++Builderならば、#include文

4. プロパティFormLinkの値を、埋め込むフォームのTJvEmbeddedFormLinkオブジェクトにする

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

39

その他、手軽なコンポーネント• TJvEnterAsTab （カテゴリ：Jv Non-Visual）• Enterキーでコントロールのフォーカスの移動を実現する• TJvFilenameEdit （カテゴリ：Jv Edits）• ファイル名指定コンポーネント• Textプロパティでファイル名を取得する• TJvDirectoryEdit （カテゴリ：Jv Edits）• フォルダ名指定コンポーネント• Textプロパティでフォルダ名を取得する

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

40

その他、手軽なコンポーネント• TJvAppInstances （カテゴリ：Jv System）• アプリケーションの複数起動を抑止する• TJvSearchFiles （カテゴリ：Jv Non-Visual）• ファイル検索コンポーネント• 条件等をプロパティで渡すと、ファイル一覧を返す• TJvProgressDialog （カテゴリ：Jv Dialogs）• TJvProgressComponent• プログレスダイアログを表示する

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

41

サポートなど• サンプルプログラム• examplesの下に144個 ただしC++Builder用は全てがあるわけではない• Delphi用のJVCLMegaDemoは必見• サポート• ニュースグループ• news://forums.talkto.net/jedi.jcl• news://forums.talkto.net/jedi.ｖcl• バグトラッカー• http://homepages.codegear.com/jedi/issuetracker/main_page.php

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

42

まとめ

まとめ

• Use the Source, Luke.（ソースをつかうのじゃ、ルーク）
判らない場合、ソースコードを追っかけましょう！
ソースがドキュメントだ。バグも完全に記述されている。By まつもとゆきひろ氏• 英語でのコミュニケーションは以外と怖くない！
Web上での翻訳サービスや翻訳ソフトを使った英文でも十分にコミュニケーションできます。
OSSの開発者は英語を母国語としている人だけではありません。

• OSSの使用は、ライセンスに気をつけましょう。
BSDライセンス → クローズドソースでも使用可
GPL → 原則としてソースコードの公開義務が発生する

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

44

最後に・・・

ご静聴ありがとうございました

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

45