【A4】Delphi テクニカルセッション/ケーススタディ

カスタムコンポーネントによる画面レイアウト、フォーカス制御のコーディング／マウス レス化に挑戦
祥クリエイティブソフト・代表
松原 正

アジェンダ• 祥クリエイティブソフトについて• カスタムコンポーネント作成に踏み切った背景• 画面ハンドリングを短時間で開発できる仕組み作り• もう一歩踏み込んで本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

2

祥クリエイティブソフトについて• 祥クリエイティブソフト
• 1996年からDelphi（1.0～)/C++ Builderによるアプリケーション開発• 実務アプリケーション作成理念• 堅牢なプログラム作成が第一前提• エンドユーザー様が一日中使い続けても苦にならないこと• マウス操作は嫌い• フォーム・レイアウトはシンプルに• 開発言語• 基本はもちろん Delphi• 時には C++ Builder• Web CGI には Kylix

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

3

カスタムコンポーネント作成に踏み切った背景

カスタムコンポーネント作成に踏み切った背景• 実際にプログラムを作ってみると• TEdit / TDBEdit ではフォーカス制御を自前でコーディングする必要あり• TEdit はデータ表示／書き込みをコーディングする必要がある• TDBEdit は DataSet を勝手に編集モードにしてしまう• SQL には不向きである（TTable を使用した簡単なプログラムには便利）• 排他制御に問題がある• TClientDataSet なら可能かもしれないが、よくわからない（開発を始めた当初は TClientDataSet はなかった）
プロフェッショナル版で可能？

• TStringGrid / TDBGrid にも、セルのフォーカス制御機能がない• TStringGrid はデータ表示／書き込みをコーディングする必要がある• TDBGrid は DataSet を勝手に編集モードにしてしまう• ユーザーによってレコード移動できるため、データを書き込んでしまう• いずれのコンポーネントにしても入力書式制御がない

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

5

カスタムコンポーネント作成に踏み切った背景• 問題点は以下にあり••••

エディット／グリッド共にキーボード・フォーカス
データベース対応コンポーネントは排他制御に問題
標準エディット／グリッドはデータベースの表示／書き込みが面倒
標準コンポーネントには、入力書式制御がない• １番の問題点は、キーボードフォーカス制御• ２番目の問題点は、入力書式制御
今回は、上記２点に絞って開発することに本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

6

画面ハンドリングを短時間で開発できる仕組み作り

画面ハンドリングを短時間で開発できる仕組み作り• 思いついた候補① 標準コンポーネントを一括で制御するような非ビシュアルコンポーネント② よく使うコンポーネントに絞って、機能を組み込む① はフォーカス制御には良さそうだが、書式制御には不向き② はコンポーネント毎の開発が必要になるが、出来そう••

フォーカス制御を持たせるのはエディット・コンボボックス・グリッド
入力書式制御を持たせるのはエディット・グリッドとしました

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

8

画面ハンドリングを短時間で開発できる仕組み作り• フォーカス制御の仕組み• 単一コンポーネントはお互いに手をつなぐ本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

9

画面ハンドリングを短時間で開発できる仕組み作り• フォーカス制御の仕組み• 移動方向について• 矢印キーはそのままの動作• Enter / Tab / Back Tab は以下から選択
○○○○○

移動しない
左に移動
右に移動
上に移動
下に移動

• 指定桁数まで入力されるとEnter キーを押されたことにする機能• コード入力等で使用• 必須入力機能• ヌルでは抜け出せない機能• 手をつないでいるコンポーネントがフォーカスを持てない場合の対処• 同じ方向に SetFocus 可能なコンポーネントを探し続ける（自分に帰ってきたら終り）• ここまでは Edit / ComboBox 共通の機能とする

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

10

画面ハンドリングを短時間で開発できる仕組み作り• 書式制御の仕組み• 書式制御は Edit のみとする• 以下の機能を持たせる• アライメント制御• 入力文字列のタイプ

文字列
整数（前ゼロなし･あり）
通貨
浮動小数点
日付(年月日)日付（年月）
時刻（時分秒）時刻（時分）- 標準の TAlignment- 通常の文字入力･表示- 整数値やコード（桁数固定）の入力･表示- 金額入力･表示- 実数値の入力･表示- 日付の入力･表示- 日付（月度等）の入力･表示- 時刻の入力･表示- 時刻の入力･表示• 最小値／最大値- 数値系入力時の数値範囲• 入力禁止文字（以下を個別に指定）
 ．（ピリオド） ，（コンマ） “（ダブルクォーテーション）‘（シングルクォーテーション） ー （マイナス）• 表示制御 ゼロの表示 表示幅- 数値系の場合ゼロを表示するかどうか- コンポーネントの Width を文字数で自動調整

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

11

画面ハンドリングを短時間で開発できる仕組み作り• 表示（外観）制御• 表示制御• AutoSize を改良- 混み合った画面設計時の負担を軽減– AutoSize + DisplayWidth でエディットの大きさを文字にあわせる• エディットとコンボボックスを同一ライン上に並べると不恰好になる• やりたかったこと

TLabel TPanel TLabel
alLeft alLeft alLeft

TPanelalLeft
TPanelalTop
高さをコンボボックスに揃える
エディットの親パネルの色を揃える

ランタイム
テーマ
オン

エディットにフォーカスがあるとエディットがフォーカスを持てないと（親パネルの Enabled := False;）
標準コンボボックスの高さに揃える
改良コンボボックスの高さに揃える
標準コンボボックスの高さに揃える

オフ

改良コンボボックスの高さに揃える• これらが、オブジェクトインスペクタ上で設定出来、コピー＆ペーストで複製できる本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

12

画面ハンドリングを短時間で開発できる仕組み作り• フォーカス制御をさらに改良• コンポーネント同士の手をつなぎ合わせるのも面倒• SetMvChains- 同一ペアレント上の Edit / ComboBox を自動的にジョイントコンポーネントのユニットメソッドとして実装
これで、例外的なフォーカス制御を除けば、完全にコードレスとなりました。
必要な作業は、コンポーネントをフォーム上に配置するだけです。

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

13画面ハンドリングを短時間で開発できる仕組み作り• アクセス制御• 読み出し• メソッド• メソッド• メソッド• メソッド• メソッド

GetText
GetInteger
GetCurrency
GetFloat
GetDate

プロパティ
プロパティ
プロパティ
プロパティ
プロパティ

AsString
AsInteger
AsCurrency
AsFloat
AsDateTime

SetText
SetInteger
SetCurrency
SetFloat
SetDate

プロパティ
プロパティ
プロパティ
プロパティ
プロパティ

AsString
AsInteger
AsCurrency
AsFloat
AsDateTime• 書き込み• メソッド• メソッド• メソッド• メソッド• メソッド本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

14

画面ハンドリングを短時間で開発できる仕組み作り• グリッド• グリッドのフォーカス制御• 矢印キーはそのままの動作（ストリンググリッド標準の動作）
但し、 右端のセルからさらに右に移動すると、１行下の左端に移動
左端のセルからさらに左に移動すると、１行上の右端に移動• 列毎にフォーカス制御可能– OnSelectCell イベントでカスタマイズ可能（オンコーディングにてセル毎に可能）• グリッドからの抜け出しと方向を検知– OnOutOfCell イベントにより、抜け出した方向を検知

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

15

画面ハンドリングを短時間で開発できる仕組み作り• グリッドの書式制御• 基本的にはエディットと同様• プロパティは列毎に保持する• 列毎に文字サイズ／背景色を指定できる
OnDrawCell にて簡単に描画をカスタマイズできる• 偶数行と奇数行を色分けできる• セルデータの変更をキャプチャ可能
変更された Col / Row が得られ、変更を取り消すことが出来る。

ここまでのチャレンジで、今回の課題である「カスタムコンポーネントによる画面レイアウト、フォーカス制御のコーディング／マウス レス化に挑戦 」
はかなり実現したといえますが、まだ物足りないのは気のせいでしょうか．．．

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

16

画面ハンドリングを短時間で開発できる仕組み作り• 実際にプログラムを作成してみると本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

17

画面ハンドリングを短時間で開発できる仕組み作り• 実際にプログラムを実行してみると本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

18

もう一歩踏み込んでもう一歩踏み込んで• 人というのは、楽になればさらに楽を求める• フォーカス制御や書式制御から開放されると次に現れる無精は？

• データベースと画面コンポーネント間のハンドリングが面倒• ということで開発に踏み切ったのが• SEdit / SDBGrid の FieldName を使用（その他は TControl.Hint）•••

上記Field名 を持つコンポーネントに DataSet を表示する(Fetch)
上記Field名 を持つコンポーネントの内容をデータベースに書き込む(Post – Update or Insert)
現在表示中のレコードを削除する(Delete)• これらの機能を、排他制御しながら完全にデータの一貫性を確保する• DBFrontEndという形で、産声を上げたところです

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

20

ありがとうございました

最後までお付き合いいただき、ありがとうございました
ご意見･ご感想をお寄せいただけましたら幸いです。
メール： creativesoft@gaia.eonet.ne.jp

URL：

http://www.eonet.ne.jp/~creativesoft/

祥クリエイティブソフト
松原 正 でした

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

21