オフコンとは日本で独自に発展したビジネス処理用コンピュータであるオフィスコンピュータを略した言葉である。Windows をはじめとする GUI 環境は、アドホックなコンピュータ処理に対する操作性を格段に向上させたが、例えば伝票入力のような定型的な処理に向いているとは言えない。
このページでは Delphi を使用してオフコン的な機能を実装することを目指し、最終的にはコンポーネント化して行きたいと考えている。
このような機能を VBX や OCX の形でリリースしている製品もあるが、実行速度や配布性そしてカストマイズの面から Delphi の VCL でコンポーネントで実現する意義は大きと考えている。
以下予定
入力フィールドである一定の文字列が入力されたら、次のフィールドに自動的に遷移する機能。キー入力回数を減らすために使用されている属性である。
ソースコード例
{オートリリースの実装}
procedure TForm1.Edit1Change(Sender: TObject);
begin
if Length((Sender As TCustomEdit).Text) => EDIT_MAX_LENGTH then
PostMessage(Handle, WM_NEXTDLGCTL, 0, 0);
end;
入力フィールドで何も入力せずに次フィールドへ遷移した場合にエラー表示を行う機能。某社のオフコ ンでは Beep 音を鳴らして警告している。(消音キーを押すまで鳴り続ける。) アプリケーション側でチ ェック処理を省略するための機能として使用されている属性である。
ソースコード例
{必須入力の実装}
procedure TForm1.Edit1Exit(Sender: TObject);
begin
if (Sender As TCustomEdit).Text = '' then begin
MessageBeep(MB_ICONEXCLAMATION);
MessageDlg((Sender As TWinControl).name +
'フィールドは必須入力です。', mtWarning, [mbOk], 0);
(Sender As TWinControl).SetFocus;
end;
end;
通常 Windows ではフィールド遷移に TAB キーを使用している。
しかし、TAB キーは 10 キーからもっとも遠い場所にあり伝票
入力などを行う場合不便である。(伝票入力業務用にキーボード
の上に伝票を置くための台も販売されている。10 キー以外は
ほとんど使用しないためである。)
これは MS-DOS のアプリケーションでもよく見られた Enter
キーを使用したフィールド遷移である。
ソースコード例(Delphi 付属 Helpme.txt から)
{まず,フォームの KeyPreview プロパティを True にして,コントロールよりも
前にフォームがキーを受け取れるようにしてください。次に,フォームの
OnKeyPress イベントハンドラを処理し,Key が #13([Enter] の文字コード)
のときに,以下のプログラムのように記述して次のコントロールを選択するよう
にします。}
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if Key = chr(VK_RETURN) then {#13 = VK_RETURN}
begin
PostMessage(Handle, WM_NEXTDLGCTL, 0, 0);
Key := #0;
end;
end;
ソースコード例その 2 (Gen さん作成によるコンポーネント化したもの)
{EnterKey、上下キーでコントロールの移動をできるようにしたTEdit}
unit Entedit;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls;
type
TEnterEdit = class(TEdit)
protected
procedure KeyPress(var Key: Char); override;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TEnterEdit]);
end;
{enterキーで次のコントロールにフォーカス移動}
procedure TEnterEdit.KeyPress(var Key: Char);
var
MyForm: TForm;
begin
if Key = #13 then begin
MyForm := GetParentForm( Self );
if not (MyForm = nil ) then
SendMessage(MyForm.Handle, WM_NEXTDLGCTL, 0, 0);
Key := #0;
end;
if Key <> #0 then inherited KeyPress(Key);
end;
end.