コンポーネント有効活用で開発効率向上!~コンポーネント活用テクニックのご紹介~

Similar documents
Webコンポーネントのカスタマイズ入門

開発者が知りたい実践プログラミングテクニック! ~明日から使えるテクニック集~

Microsoft PowerPoint - DELPHI�礔.ppt

FastReportへの効率的な帳票レイアウトコンバート

WebReportCafe

24th Embarcadero Developer Camp

1 シミュレーションとは何か?

CubePDF ユーザーズマニュアル

PowerPoint プレゼンテーション

試作ツールは MIT ライセンスによって提供いたします その他 内包された オープンソース ソフトウェアについてはそれぞれのライセンスに従ってご利用ください

マクロの実行許可設定をする方法 Excel2010 で 2010 でマクロを有効にする方法について説明します 参考 URL:

L N P Y F C T V W Z I X Pentomino Form Name Caption Position FormMain podesktopcenter

スクールCOBOL2002

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

Prog2_6th

インテル(R) Visual Fortran コンパイラ 10.0

Delphi/400バージョンアップに伴う文字コードの違いと制御

Microsoft Word - JDBC検証 docx

フローチャート自動生成ツール yflowgen の使い方 目次 1 はじめに 本ツールの機能 yflowgen.exe の使い方 yflowgen.exe の実行方法 制限事項 生成したファイル (gml ファイル形式 ) の開

やってみようINFINITY-写真管理 編-

セキュリティ設定ツールインストール 桐セキュリティ設定ツールインストール C: K3 KIRIV9 Security フォルダ内 KISECURE をダブルクリックして設定を開始します 初回セキュリティ設定ツールを起動時はウィザート形式で設定します メッセージにしたがって初期設定を行ってください セ

Android Layout SDK プログラミング マニュアル

やってみようINFINITY-製品仕様書 品質評価表 メタデータ 編-

10th Developer Camp - B5

<4D F736F F D20955C8E8695CF8D5894C55F8F9197DE8DEC90AC BA697CD89EF8ED08BA4974C816A91808DEC837D836A B81698BA697CD89EF8ED08CFC82AF816A2E646F6378>

図 1 アドインに登録する メニューバーに [BAYONET] が追加されます 登録 : Excel 2007, 2010, 2013 の場合 1 Excel ブックを開きます Excel2007 の場合 左上の Office マークをクリックします 図 2 Office マーク (Excel 20

Microsoft Word - VB.doc

目次 1 はじめに 利用条件 動作環境 アドインのインストール アドインの操作方法 アドインの実行 Excel CSV の出力 テンプレートの作成 編集 テンプレートのレイアウト変更 特記

Embarcadero Developer Camp

CodeGear Developer Camp

これらの情報は 外部に登録 / 保存されることはございません 5 インターネット接続の画面が表示されます 次へ > ボタンをクリックしてください 管理者様へ御使用時に設定された内容を本説明文に加筆ください 特に指定不要で利用可能であった場合は チェックボックスを オフ していただきますようご案内くだ

はじめに 本ドキュメントでは Salesforce 標準機能である 変更セット を使用して Visualforce ページ Apex クラスを Sandbox から本番環境に移行する手順を説明します 但し前提条件として Sandbox 本番環境共に SkyVisualEditor がインストールされ

(C) Copyright CANVASs Co

intra-mart Accel Platform — 招待機能プログラミングガイド   初版  

intra-mart Accel Platform — IM-共通マスタ スマートフォン拡張プログラミングガイド   初版  

SystemDirector Developer's Studio(V3.2) 適用ガイド

Java知識テスト問題

RR1soft.book

Java Scriptプログラミング入門 3.6~ 茨城大学工学部情報工学科 08T4018Y 小幡智裕

ご利用のコンピュータを設定する方法 このラボの作業を行うには 事前設定された dcloud ラボを使用するか 自身のコンピュータをセットアップします 詳細については イベントの事前準備 [ 英語 ] とラボの設定 [ 英語 ] の両方のモジュールを参照してください Python を使用した Spar

<< 目次 >> 1 PDF コンバータのインストール ライセンスコードの入力 PDF にフォントを埋め込みたい場合の設定 PDF オートコンバータ EX で使用しない場合 PDF コンバータ単体で使用する場合の説明 PDF コンバータのアン

WebOTXマニュアル

「RAD Studio XE5によるマルチ言語/マルチデバイス開発の進め方」

PowerPoint プレゼンテーション

工程’S 9 ヘルプ Excelバーチャート

2. 患者一覧 ログインすると患者一覧画面が表示されます 初期表示は本日日付で診療が行われた患者の一覧が表示されます 該当の患者がいない場合は上図のように患者一覧は表示されません ORCA 連携されていない場合は初期導入時に患者情報がありませんので 取り込みを行う必要があります 患者の取り込み方法は

WebReportCafe

Visual Studio2008 C# で JAN13 バーコードイメージを作成 xbase 言語をご利用の現場でバーコードの出力が必要なことが多々あります xbase 言語製品によっては 標準でバーコード描画機能が付加されているものもあるようで す C# では バーコードフォントを利用したりバー

Team Foundation Server 2018 を使用したバージョン管理 補足資料

Indyを利用したメール送信機能開発

IME( 日本語入力システム ) の確認 変更方法 / プロパティ確認の手順 ************************************************************************************ ドキュメント目次 IME( 日本語入力システム )

本書は INpMac v2.20(intime 5.2 INplc 3 Windows7/8/8.1に対応 ) の内容を元に記載しています Microsoft Windows Visual Studio は 米国 Microsoft Corporation の米国及びその他の国における登録商標です

Microsoft Word - CBSNet-It連携ガイドver8.2.doc

WebOTXマニュアル

チャレンジ!dbExpress接続

改訂履歴 改訂日付 改訂内容 2014/11/01 初版発行 2017/01/16 Studuino web サイトリニューアルに伴う改訂 2017/04/14 Studuino web サイトリニューアルに伴うアクセス方法の説明変更 2018/01/22 Mac 版インストール手順変更に伴う改訂

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版  

( 目次 ) 1. はじめに 開発環境の準備 仮想ディレクトリーの作成 ASP.NET のWeb アプリケーション開発環境準備 データベースの作成 データベースの追加 テーブルの作成

03 Podium Walkerのインストール方法およびアンインストール .docx

Microsoft Word - DWR-S01D_Updater_取扱説明書_120514A.doc

Delphi/400開発ノウハウお教えします~現場で培った開発手法一挙公開~

03 Podium Walkerのインストール方法およびアンインストール .docx

内容 Softimage のスタンドアロンライセンスのインストールとライセンス取得 Softimage セットアッププログラムを実行 エンドユーザ使用許諾契約 (EULA) に同意 インストール先のパスを指定 パッケージの選択... 6

第 7.0 版 利用履歴管理 ETCPRO5 セットアップマニュアル (Ver5.002) カードリーダモデル変更 ( 表示付き 表示なし ) に伴い 改訂 Windows10 対応に伴い 改訂 参考ホームページサイト :

Microsoft Word - ModelAnalys操作マニュアル_

上手くん α シリーズ移行手順 上手くん α シリーズ移行手順 上手くん α シリーズ移行手順 1 処理の流れ 1 2 古い PC で行う操作 2 3 新しい PC で行う操作 /09/10 第 2 版

Microsoft Word JA_revH.doc

各種パスワードについて マイナンバー管理票では 3 種のパスワードを使用します (1) 読み取りパスワード Excel 機能の読み取りパスワードです 任意に設定可能です (2) 管理者パスワード マイナンバー管理表 の管理者のパスワードです 管理者パスワード はパスワードの流出を防ぐ目的で この操作

実習を行う上での心構えについて

Transcription:

セッション No.2 コンポーネント有効活用で開発効率向上! ~ コンポーネント活用テクニックのご紹介 ~ 株式会社ミガロ システム事業部システム 1 課主任 小杉智昭 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 1

アジェンダ 1) 既存コンポーネントを利用する方法 1 コンポーネントとは 2 コンポーネントの配布形態 2) コンポーネントを拡張する方法 1 継承とカスタムコンポーネント 2 コンポーネントの拡張手順 3) ピックアップ!MaskEdit コンポーネントの拡張 1 拡張する機能の紹介 2 MaskEdit コンポーネントの拡張手順 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 2

1) 既存コンポーネントを利用する方法 1 コンポーネントとは < コンポーネントとは > 一般のソフトウェア開発の現場においては特定の機能を持ったプログラム用の部品 - 再利用性を考慮し汎用的な機能を持たせたプログラム 他のプログラムと組み合わせて必要な機能を実現 ないしは追加する Delphi においてはオブジェクトの一種 - プログラミングする際に利用可能な ビジュアル なオブジェクト 実行時も ビジュアル でユーザインターフェース要素となり得るもの ビジュアルコンポーネント TLabel TEdit TButton 等 設計時のみ ビジュアル でユーザインターフェース要素となり得ないもの 非ビジュアルコンポーネント TDatabase TOpenDialog TTimer 等 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 3

1) 既存コンポーネントを利用する方法 1 コンポーネントとは < コンポーネントを利用するメリット > 利用者側からのメリット - 詳細な処理手順を知らなくても機能を利用できる FTP の詳細を知らなくても FTP コンポーネントを使えばファイル転送が使える 等 - コードの重複を避けることができる コード記述の量を減らせる 開発者側からのメリット - コードの独立性が高い 利用者側から不用意に内部動作を変更されない - 再利用性が高い 一度開発すれば大きな仕様変更がない限り利用し続けることができる 作成したい内容に応じたコンポーネントを開発 / 利用することで 開発効率を劇的に向上させることができる 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 4

1) 既存コンポーネントを利用する方法 2 コンポーネントの配布形態 < コンポーネントの配布形態 > Ⅰ. バイナリ形式のパッケージ主なファイル : 設計時パッケージ (dcp) 実行時パッケージ (bpl) コンパイル済ユニット (dcu) 組込手順 : 1. メニューの [ コンポーネント パッケージのインストール ] を選択 2. パッケージのインストール ダイアログで追加ボタンを押下 3. 対象の実行時パッケージファイルを選択 配布元から導入手順が提示されていることが多いので その場合は指示に従って導入して下さい 注意事項 : バージョン毎にほぼ専用のファイルが必要 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 5

1) 既存コンポーネントを利用する方法 ( 操作例 ) Ⅰ. バイナリ形式のパッケージ取込例 (QuickReport) QuickReport とは... Delphi でほぼ標準のレポートツールとして長く添付されていたレポートツール Delphi 6 までは標準で登録 Delphi 7 は追加登録可能 Delphi 2006/2007 はモジュールを www.codegear.com より無償で入手可能 Delphi で開発されているため Delphi との親和性が非常に高い ソースコードも付いた高機能版を有償で購入可能 現在入手可能なバージョンは英語版のみ ( 日本語の印刷は可能 ) 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 6

1) 既存コンポーネントを利用する方法 ( 操作例 ) Ⅰ. バイナリ形式のパッケージ取込例 (QuickReport) エンバカデロ テクノロジーズ (CodeGear) の以下のページから QuickReport 4 Standard(QR4StdD2006W32Install.zip) を入手します http://cc.codegear.com/item/25002 入手した QR4StdD2006W32Install.zip を展開し QR4StdD2006W32.EXE を実行します 実行後は画面指示に従って進めていきますが インストール先の初期値は BDS 2006 を前提にしたパスとなっているため 以下のパスに変更します C: Program Files Borland BDS 4.0 QRStandard C: Program Files CodeGear RAD Studio 5.0 QRStandard インストールが完了したら Delphi 2007 を実行し パッケージの登録を行います ( 次頁 ) 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 7

1) 既存コンポーネントを利用する方法 ( 操作例 ) Ⅰ. バイナリ形式のパッケージ取込例 (QuickReport) [ コンポーネント パッケージのインストール ] を選択 ツールパレットに QReport カテゴリが追加され コンポーネントが登録されます 追加ボタンを押下 OK ボタンを押下 以下のファイルを選択 C: Program Files CodeGear RAD Studio 5.0 QRStandard QR4StdDesD2006.bpl 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 8

1) 既存コンポーネントを利用する方法 2 コンポーネントの配布形態 < コンポーネントの配布形態 > Ⅱ. ソース形式のパッケージ主なファイル : パッケージソース (dpk) ソースコード (pas) 組込手順 : 1. メニューの [ ファイル プロジェクトを開く ] を選択 2. プロジェクトを開く ダイアログで対象のパッケージソースを選択 3. プロジェクトマネージャ上でパッケージを右クリック 4. ポップアップメニューのインストールを選択 注意事項 : ( 必要に応じて ) コンポーネントをコンパイル可能な環境を整える必要があるバージョン依存する場合 修正が必要となることがある 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 9

1) 既存コンポーネントを利用する方法 ( 操作例 ) Ⅱ. ソース形式のパッケージ取込例 (DecisionCube) DecisionCube とは... 多次元解析のツールとして標準で添付されていたコンポーネント Delphi 7 までは標準で登録 Delphi 2005 以降はインストールされるが登録はされない Delphi 2007 はインストールの際に一部修正が必要 Delphi で開発されているため Delphi との親和性が非常に高い ソースコードが付属している 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 10

1) 既存コンポーネントを利用する方法 ( 操作例 ) Ⅱ. ソース形式のパッケージ取込例 (DecisionCube) DecisionCube はやや古いコンポーネントで統合開発環境と共にインストールされますが ツールパレットには登録されません 2 種類のパッケージで構成されていて それぞれのパッケージソースを利用します 実行時用パッケージ (dss.dpk) 登録時は先に開き コンパイルのみ行います 設計時用パッケージ (dcldss.dpk) 実行時パッケージの後で開き インストールを行います Delphi 2007 からは dclbde.dcp への参照を明示的に行う必要があります 最初は実行時用のパッケージをコンパイルします 以下のパッケージファイルを開き コンパイルします ( 次頁 ) C: Program Files CodeGear RAD Studio 5.0 source Win32 xtab dss.dpk 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 11

1) 既存コンポーネントを利用する方法 ( 操作例 ) Ⅱ. ソース形式のパッケージ取込例 (DecisionCube) [ ファイル プロジェクトを開く ] を選択 プロジェクトマネージャ上で dss.bpl を右クリックしてコンパイルを選択 以下のファイルを選択 C: Program Files CodeGear RAD Studio 5.0 source Win32 xtab dss.dpk 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 12

1) 既存コンポーネントを利用する方法 ( 操作例 ) Ⅱ. ソース形式のパッケージ取込例 (DecisionCube) 続いて設計時パッケージをインストールします 先程のプロジェクトが開かれたままになっているなら 一度全て閉じます その後 以下のパッケージファイルを開きます C: Program Files CodeGear RAD Studio 5.0 source Win32 xtab dcldss.dpk パッケージが開かれたなら プロジェクトマネージャを使って dclbde.dcp を必須パッケージに追加します その後 以下のパッケージファイルを開き インストールします ( 次頁 ) 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 13

1) 既存コンポーネントを利用する方法 ( 操作例 ) Ⅱ. ソース形式のパッケージ取込例 (DecisionCube) OK ボタンを押下 次ページへ プロジェクトマネージャ上で Requires を右クリックして参照の追加を選択 参照ボタンを押下 以下のファイルを選択 C: Program Files CodeGear RAD Studio 5.0 lib dclbde.dcp 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 14

1) 既存コンポーネントを利用する方法 ( 操作例 ) Ⅱ. ソース形式のパッケージ取込例 (DecisionCube) ツールパレットに Decision Cube カテゴリが追加され コンポーネントが登録されます プロジェクトマネージャ上で dcldss.bpl を右クリックしてインストールを選択 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 15

1) 既存コンポーネントを利用する方法 ( 操作例 ) Ⅱ. ソース形式のパッケージ取込例 (DecisionCube) ここまでの操作でコンポーネントがツールパレットに配置され 設計画面で利用できるようになりますが これらのコンポーネントを使ったアプリケーションをコンパイルしようとすると ユニットが見つからないとのエラーが発生します エラーを解消するには 各コンポーネントソースから生成されたコンパイル済ユニット (dcu) を始めとした必要ファイルにパスを通す必要があります 簡単な方法として 統合開発環境のライブラリパスにコンパイル済ユニットがあるパスを追加します メニューから [ ツール オプション ] を開き 以下のパスを追加します ( 次頁 ) C: Program Files CodeGear RAD Studio 5.0 source Win32 xtab 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 16

1) 既存コンポーネントを利用する方法 ( 操作例 ) Ⅱ. ソース形式のパッケージ取込例 (DecisionCube) ダイアログボタンを押下 ライブラリ Win32 を選択後 ダイアログボタンを押下 [ ツール オプション ] を選択 OK ボタンを押下 追加ボタンを押下し ライブラリパスに選択したパスを追加後 OK ボタンを押下 以下のフォルダを選択 C: Program Files CodeGear RAD Studio 5.0 source Win32 xtab 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 17

1) 既存コンポーネントを利用する方法 2 コンポーネントの配布形態 < コンポーネントの配布形態 > Ⅲ. バイナリ / ソース形式のコンポーネント単体主なファイル : ソースコード (pas) コンパイル済ユニット (dcu) 組込手順 : 1. 新規パッケージを作成するか 既存パッケージを開く 2. プロジェクトマネージャ上でパッケージを右クリック 3. ポップアップメニューの追加を選択 4. ユニットファイル名 ダイアログでコンポーネントを選択 コンパイル済ユニットを選択する場合は 絞込みの解除が必要以降はソース形式のパッケージ組み込み手順と同様になります 注意事項 : lib フォルダ内に dclusr.dpk という空のパッケージファイルが予め用意されており ユーザが自由に利用できます 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 18

1) 既存コンポーネントを利用する方法 ( 操作例 ) Ⅲ. 単体のコンポーネント取込例 (MOStringGrid) MOStringGrid とは... Delphi 6 の Companion Tools CD に添付されていたコンポーネントで 標準の TStringGrid を拡張し 各列毎にボタンやチェックボックス等を表示可能にした鈴木政志さん作成のコンポーネント インターネット上で公開されていたソースは設計関係のコードが分離されておらず Delphi 6 以上に登録するには修正が必要 Companion Tools CD に添付されているソースはリソースファイルが不足しているため その箇所のみコメントアウトするか リソースを用意する必要がある 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 19

1) 既存コンポーネントを利用する方法 ( 操作例 ) Ⅲ. 単体のコンポーネント取込例 (MOStringGrid) コンポーネント単体で配布されているケースでは 既存パッケージを利用するかパッケージを新規作成し コンポーネントをそのパッケージに登録します ( 次頁 ) 後はソース形式のパッケージ取込と同じ手順を踏むことで コンポーネントの登録が可能です Delphi には予めユーザ向けのパッケージとして dclusr.dpk が用意されていますので 初めはこのパッケージを利用するのも良いでしょう バイナリ形式 (dcu) のコンポーネントは コンポーネントをコンパイルした環境と登録 利用する環境でバージョンを合わせる必要があります ソース形式の場合は バージョンに依存するような記述をしていない限りはこの制限はありません 但し Delphi 6 以降では設計時と実行時のソースの分離が厳密に必要になり その加減で修正が必要になることがあります 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 20

1) 既存コンポーネントを利用する方法 ( 操作例 ) Ⅲ. 単体のコンポーネント取込例 (MOStringGrid) プロジェクトマネージャ上で Package1.bpl を右クリックして追加を選択 参照ボタンを押下 [ ファイル 新規作成 パッケージ Delphi for Win32] を選択 OK ボタンを押下 パッケージに追加後は ソース形式のパッケージを取り込む例と同様になります 必要ファイルを選択複数同時選択が可能です バイナリ形式のファイルの場合 ファイルの種類を全てのファイルにしてから dcu ファイルを選択します 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 21

1) 既存コンポーネントを利用する方法 2 コンポーネントの配布形態 < 配布形態の違いによるメリット デメリット > それぞれの配布形態について 利用者の立場から見たメリット デメリットには以下のようなものがあります バイナリ配布 統合開発環境の組み込みが比較的簡単である 動作の詳細について考える必要が無く 一利用者に徹することができる 利用したい Delphi のバージョンに応じたバイナリが必要である 修正や変更 バージョンアップ対応等は作者側次第となる ソース配布 複数の Delphi バージョンで利用可能である 処理内容を確認できるため 安心感がある 修正や仕様変更を自らできる 利用する際にコンパイル環境を整え バイナリを作成しなければならない 利用者側であっても ある程度の知識 技術が求められることがある 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 22

2) コンポーネントを拡張する方法 1 継承とカスタムコンポーネント < 継承と派生 > オブジェクト指向プログラミングでは あるクラスの属性や機能を完全に引き継ぐことを 継承 といい 新しい属性や機能を付加して新たなクラスとして派生させることができます 継承の際 元になったクラスを上位クラス (superclass) 派生してできたクラスを下位クラス (subclass) と呼びます Delphi において全てのクラスは TObject を直接 または間接的に継承しています 同様にコンポーネントは TComponent を継承しています < アクセス制御 > ユニットやコンポーネントには外部から利用されたくないメンバ ( プロパティやメソッド ) を隠蔽することができます 逆に外部から利用させるためにメンバを公開することもでき これらを設定することをアクセス制御と呼びます 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 24

2) コンポーネントを拡張する方法 1 継承とカスタムコンポーネント < クラスのアクセス制御 > Delphi ではクラスに対してメンバ単位でアクセス制御を行うことが可能です スコープ ( 可視性 ) と呼ばれるアクセス制御のレベルは以下の 4 段階存在します 可視性 private protected public published 内容そのクラスが宣言されたユニット内でのみアクセス可能 外部から変更されたくないメンバを定義します そのクラスが宣言されたユニット及び下位クラスからアクセス可能 派生された先でも利用する可能性のあるメンバを定義します そのクラスが宣言されたユニット外からもアクセス可能 コンポーネントのプロパティやメソッドとして利用するメンバを定義します 可視性としてはpublicと同様だが ここで定義したプロパティやイベントはフォームファイルへ保存可能になる オブジェクトインスペクタに表示したいプロパティやイベントを定義します 上位クラスで設定したスコープを下位クラスで広げることは可能ですが 逆に狭めることはできません また private で宣言された場合 下位クラスであってもアクセスできないため 再定義できません 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 25

2) コンポーネントを拡張する方法 1 継承とカスタムコンポーネント < カスタムコンポーネント > スコープは上位クラスで広げてしまうと下位クラスで狭めることができません そこで スコープは狭めたまま機能だけ実装したクラスとそのクラスを継承し スコープを広げたクラスを作成することで 再利用性が向上します このようなスコープを狭めたままの状態のコンポーネントをカスタムコンポーネントと呼び 主に上位クラスとして利用されています 標準の TEdit や TCheckBox にもそれぞれ TCustomEdit や TCustomCheckBox といったクラスが用意されています 例 )TEdit と TMaskEdit の継承関係 ( 上位クラス ) TCustomEdit TCustomMaskEdit TEdit TMaskEdit 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 26

2) コンポーネントを拡張する方法 2 コンポーネントの拡張手順 < コンポーネントの拡張手順 > Delphi で用意されているコンポーネントは TObject から段階を追って派生しており それぞれの段階で作成されたクラスを自由に利用することが可能です そのため 完全に新規でコンポーネントを作成することは少なく 何らかの上位クラスを元に継承し機能拡張するのが通常です 仕様や動作が決定した後 実際にコンポーネントを作成する際の手順を以下にまとめます Ⅰ. パッケージを作成または選択します Ⅱ. 作成したいコンポーネントの上位クラスを選択します Ⅲ. ユニットを作成し 機能を実装します Ⅳ. コンパイル テストし 動作を確認します コンポーネント開発の場合 コンポーネントの機能毎にテスト方法を考慮しなければなりませんので テストのやり方を色々と工夫する必要があります 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 27

3) ピックアップ!MaskEdit コンポーネントの拡張 1 拡張機能の紹介 < 拡張機能の紹介 > コンポーネントの機能拡張の具体例として 第 1 回テクニカルセミナーで配布しました TMGRMaskEdit を題材に拡張手順と実際の操作を紹介したいと思います まず TMGRMaskEdit の機能紹介を行います [TMGRMaskEdit の拡張機能 ] Ⅰ.Alignment プロパティ 入力文字列の横方向の配置を指定します 左寄せ 右寄せ 中央寄せを選択できます Ⅱ.CharaSet プロパティ 入力文字列の種類を指定します 指定なし 半角文字のみ 全角文字のみを選択できます 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 29

3) ピックアップ!MaskEdit コンポーネントの拡張 1 拡張機能の紹介 < 拡張機能の紹介 > [TMGRMaskEdit の拡張機能 ] Ⅲ.EnterNext プロパティ Enter キーの押下でフォーカスの移動を行います 移動する 移動しないを選択できます Ⅳ.PageCode プロパティ CCSID(CodePage) に応じて半角英小文字の制御を行います JP-1 相当 ( 半角英小文字を大文字に変換 ) JP-2 相当 ( 入力内容をそのまま ) を選択できます 以上の 4 つプロパティの追加を行い 関連機能の調整を行います このサンプルは理解しやすいことを優先しており 本来想定される動作とは異なる動作の箇所も許容しております 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 30

3) ピックアップ!MaskEdit コンポーネントの拡張 2MaskEdit コンポーネントの拡張手順 <MGRMaskEditの作成手順概要 > Ⅰ. 新規パッケージとしてMGRComponentsを作成します Ⅱ.MGRMaskEditコンポーネントの上位クラスとして TCustomMaskEditを選択します ( 参考ソース :Step01) Ⅲ.MGRMaskEditユニットを作成し 各機能を実装します Ⅲ-1.Alignmentプロパティの実装 ( 参考ソース :Step02) Ⅲ-2.CharaSetプロパティの実装 ( 参考ソース :Step03) Ⅲ-3.EnterNextプロパティの実装 ( 参考ソース :Step04) Ⅲ-4.PageCodeプロパティの実装 ( 参考ソース :Step05) Ⅲ-5. アクセス制御レベル等の調整 ( 参考ソース :Step06) Ⅳ. パッケージをインストールし 動作を確認します ( 参考ソース :Step07) 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 31

3) ピックアップ!MaskEdit コンポーネントの拡張 2MaskEdit コンポーネントの拡張手順 < パッケージの作成 > 新たなコンポーネントを作成する際 最初に行うことはパッケージを作成することです 既に幾つかのコンポーネントを作成している場合は既存のパッケージに追加することも可能ですし Delphi 標準としてユーザ向けに利用可能なパッケージが用意されています 今回は新規パッケージ MGRComponents を作成します < 上位クラスの選定とユニットの作成 > 続いて上位クラスを指定し ユニットを作成します スコープを考慮した場合 より自由度の高いカスタムコンポーネントから選択することが多くなると思われます 今回は TMaskEdit を拡張した TMGRMaskEdit を作成しますが 実際には TMaskEdit の上位クラスである TCustomMaskEdit を上位クラスとして選択します 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 32

3) ピックアップ!MaskEdit コンポーネントの拡張 2MaskEdit コンポーネントの拡張手順 < 統合開発環境の操作 : プロパティ追加 > private~published の各宣言部に property プロパティ名 : データ型 ; まで記述します 記述後 Ctrl + Shift + C を押下することで コード補完機能が働き プロパティ値を保存するためのフィールド ( 変数 ) プロパティ書込時に実行されるメソッドが作成されます < 統合開発環境の操作 : コンストラクタ / デストラクタ追加 > public 宣言部で Ctrl + Space を押下することでコード補完リストが表示されます このリスト中にテンプレートの形でコンストラクタの作成があります また デストラクタは既存メソッドのオーバーライド候補として表示されます Delphi 2006 ではコンストラクタもデストラクタと同様の形式でリストされます コンストラクタは初期化処理に用いられる特別な Create メソッドです 同様にデストラクタは終了処理に用いられる特別な Destroy メソッドです 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 33

3) ピックアップ!MaskEdit コンポーネントの拡張 2MaskEdit コンポーネントの拡張手順 <Alignment プロパティの実装ポイント > 左右中央寄せを実現するには CreateParams メソッドをオーバーライドし パラメータを変更するだけです 詳細は Windows API についての知識が必要となりますので MSDN 等でご確認下さい この実装方法は Win95 等の古い OS 上では正しく動作しませんが それらの OS が既にサポート対象外となっているため 特に問題は無いと思われます <CharaSet プロパティの実装ポイント > 全角 半角等の文字種別を実現するには Change メソッドをオーバーライドし 入力モードに不適切な入力を除外します このサンプルでは併せて OS/400 上の文字長を考慮した入力制限も追加します こちらで利用する 半角文字を全角文字に変換する 機能と OS/400 上の文字長を考慮して文字列の調整を行う 機能は関数化し ユニット内から利用可能にします 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 34

3) ピックアップ!MaskEdit コンポーネントの拡張 2MaskEdit コンポーネントの拡張手順 <EnterNext プロパティの実装ポイント > Enter キー押下時のフォーカス移動を実現するには KeyDown メソッドをオーバーライドし フォーカスの移動メッセージを親フォームに対して送ります フォーカスを移動させる方法はさまざまなやり方が存在しますので 色々とお試しいただくと良いでしょう 尚 Windows 標準のフォーカス移動キーは Tab キーであることから Enter キーの押下を Tab キーの押下に変更するといった方法でも可能です <PageCode プロパティの実装ポイント > 半角英小文字を対象に半角英大文字へ変換する機能を実現するには CharaSet プロパティ同様 Change メソッドで制御する方法があります 但し Change メソッドは一文字単位の入力で発生しますので ここでの処理はできるだけ軽いものにしておく必要があります そこで 今回のサンプルでは KeyPress メソッドで制御を行います この方式の場合 クリップボードからの貼り付けのような処理に対して制御漏れが発生してしまうことがあります 今回のサンプルでは対応していませんので どのように制御を追加すれば良いか 検討してみて下さい 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 35

3) ピックアップ!MaskEdit コンポーネントの拡張 <MGRMaskEdit 完了時点ソース > (******************************************************************************* << AS/400 入力用 MaskEdit >> 2008.12.10 株式会社ミガロ 標準の TMaskEdit に対し下記機能拡張を行っています Alignment プロパティ : 文字列の横方向の配置を指定 taleftjustify - 左寄せ tarightjustify - 右寄せ tacenter - 中央寄せ CharCase プロパティ : 文字列のセット仕様変更のため 機能削除 CharaSet プロパティ : 入力文字列の属性指定 csnone - 属性指定なし cssbcsonly - 半角文字列のみ入力可能 csdbcsonly - 全角文字列のみ入力可能 EnterNext プロパティ :Enter キー押下による項目移動の設定 PageCode プロパティ :CCSID にあわせた文字列属性を指定 pcjp1 - CCSID=5026 系 ( 半角英小文字使用不可 ) pcjp2 - CCSID=5035 系 ( 半角英小文字使用可 ) MaxLength プロパティ : シフト文字を含む文字長の指定 *******************************************************************************) unit MGRMaskEdit; interface uses Windows, Messages, SysUtils, Classes, Controls, Forms, StdCtrls, Mask; type TCharaSet = (csnone, cssbcsonly, csdbcsonly); TPageCode = (pcjp1, pcjp2); TMGRMaskEdit = class(tcustommaskedit) private { Private 宣言 } FAlignment: TAlignment; FCharaSet: TCharaSet; FEnterNext: Boolean; FPageCode: TPageCode; procedure SetAlignment(const Value: TAlignment); protected { Protected 宣言 } procedure Change; override; procedure CreateParams(var Params: TCreateParams); override; procedure KeyDown(var Key: Word; Shift: TShiftState); override; procedure KeyPress(var Key: Char); override; public { Public 宣言 } constructor Create(AOwner: TComponent); override; published { Published 宣言 } property Alignment: TAlignment read FAlignment write SetAlignment default taleftjustify; property CharaSet: TCharaSet read FCharaSet write FCharaSet default csnone; property EnterNext: Boolean read FEnterNext write FEnterNext default True; property PageCode: TPageCode read FPageCode write FPageCode default pcjp1; property Align; property Anchors; property AutoSelect; property AutoSize; property BevelEdges; property BevelInner; property BevelOuter; property BevelKind; property BevelWidth; property BiDiMode; property BorderStyle; // property CharCase; property Color; property Constraints; property Ctl3D; property DragCursor; property DragKind; property DragMode; property Enabled; property EditMask; property Font; property ImeMode; property ImeName; property MaxLength; 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 36

3) ピックアップ!MaskEdit コンポーネントの拡張 <MGRMaskEdit 完了時点ソース > property ParentBiDiMode; property ParentColor; property ParentCtl3D; property ParentFont; property ParentShowHint; property PasswordChar; property PopupMenu; property ReadOnly; property ShowHint; property TabOrder; property TabStop; property Text; property Visible; property OnChange; property OnClick; property OnDblClick; property OnDragDrop; property OnDragOver; property OnEndDock; property OnEndDrag; property OnEnter; property OnExit; property OnKeyDown; property OnKeyPress; property OnKeyUp; property OnMouseActivate; property OnMouseDown; property OnMouseEnter; property OnMouseLeave; property OnMouseMove; property OnMouseUp; property OnStartDock; property OnStartDrag; procedure Register; implementation procedure Register; RegisterComponents('MIGARO', [TMGRMaskEdit]); {******************************************************************************* 目的 : 半角文字列を全角文字列に変換引数 : Str - 文字列 ( 全半角混在可 ) 戻値 : 変換後文字列 ( 全角文字列のみ ) *******************************************************************************} function SingleToDoubleByteString(const Str: String): String; // 全角文字列に変換 SetLength(Result, LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_FULLWIDTH, PChar(Str), Length(Str), nil, 0)); SetLength(Result, LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_FULLWIDTH, PChar(Str), Length(Str), PChar(Result), length(result))); //"\" マークはパス区切り記号 ( 半角のバックスラッシュと共用 ) で //Windows の仕様上変換対象外になるため 個別に処理 Result := StringReplace(Result, '\', ' ', [rfreplaceall]); {******************************************************************************* 目的 : シフト文字を考慮した文字長の文字列を取得引数 : AText - 対象文字列 AMaxLength - シフト文字を含む文字長戻値 : シフト文字を考慮して指定文字長に収まる文字列 *******************************************************************************} function GetLengthText(AText: String; AMaxLength: Integer): String; // シフト文字を考慮した文字長取得 function GetEbcdicLength(const s: String): Integer; var i: Integer; InDBCS: Boolean; InDBCS := False; Result := Length(s); for i := 1 to Length(s) do case ByteType(s, i) of 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 37

3) ピックアップ!MaskEdit コンポーネントの拡張 <MGRMaskEdit 完了時点ソース > mbsinglebyte: //ASCII 文字もしくは半角カタカナ InDBCS := False; mbleadbyte: // 全角文字の先頭バイト if InDBCS = False then InDBCS := True; Result := Result + 2; if (AMaxLength <= 0) or (GetEbcdicLength(AText) <= AMaxLength) then Result := AText else repeat AText := Copy(WideString(AText), 1, Length(WideString(AText)) - 1); until (GetEbcdicLength(AText) <= AMaxLength); Result := AText; { TMGRMaskEdit } procedure TMGRMaskEdit.Change; var bselflg: Boolean; i, isel: Integer; stext: String; inherited; bselflg := False; isel := 0; // カーソル位置の保持 ( 実行時のみ ) if (not (csdesigning in ComponentState)) and (0 < Length(Text))then if SelStart <> Length(Text) then isel := SelStart; bselflg := True; // マスク指定されていない場合 if not IsMasked then case FCharaSet of cssbcsonly: // 半角文字限定の場合 全角文字を消去 i := 1; stext := Text; while i < Length(sText) do if bytetype(stext,i) = mbleadbyte then Delete(sText, i, 2) else Inc(i); if Text <> stext then Text := stext; csdbcsonly: // 全角文字限定の場合 半角文字を全角文字に変換 Text := SingleToDoubleByteString(Text); // 最大文字列長内に収める stext := GetLengthText(Text, MaxLength); if Text <> stext then Text := stext; // カーソル位置の調整 ( 実行時のみ ) if (not (csdesigning in ComponentState)) and bselflg then if FCharaSet = csdbcsonly then SelStart := isel + 1 else SelStart := isel; end else SelStart := Length(Text); 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 38

3) ピックアップ!MaskEdit コンポーネントの拡張 <MGRMaskEdit 完了時点ソース > constructor TMGRMaskEdit.Create(AOwner: TComponent); inherited; ControlStyle := ControlStyle - [cssetcaption]; FAlignment := taleftjustify; FCharaSet := csnone; FEnterNext := True; FPageCode := pcjp1; procedure TMGRMaskEdit.CreateParams(var Params: TCreateParams); inherited; case FAlignment of tarightjustify: Params.Style := Params.Style or ES_RIGHT; // 右寄せ tacenter: Params.Style := Params.Style or ES_CENTER; // 中央寄せ procedure TMGRMaskEdit.KeyPress(var Key: Char); inherited; if FEnterNext and (Key = Chr(VK_RETURN)) then Key := #0; if (FPageCode = pcjp1) and (FCharaSet <> csdbcsonly) then if ByteType(Key, 1) = mbsinglebyte then Key := UpCase(Key); procedure TMGRMaskEdit.SetAlignment(const Value: TAlignment); if FAlignment <> Value then FAlignment := Value; RecreateWnd; end. procedure TMGRMaskEdit.KeyDown(var Key: Word; Shift: TShiftState); if FEnterNext and (Key = VK_RETURN) then if (Shift = []) or (Shift = [ssshift]) then // フォーカス移動処理 ( 何も押されていない場合次へ // Shift のみ押されている場合前へ ) if Shift = [] then SendMessage(GetParentForm(Self).Handle, WM_NEXTDLGCTL, 0, 0) else SendMessage(GetParentForm(Self).Handle, WM_NEXTDLGCTL, 1, 0); Key := 0; inherited; 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 39

ご静聴ありがとうございました 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します 42