16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"RE:TEditの操り方"
この発言は #01264 ぺけでび さんのRE:TEditの操り方 に対するコメントです
TEdit の上書きを全角文字に対応させてみました。
かなりメンドーなんですね。
unit Uts2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Edit2: TEdit;
// インスペクタで指定しました
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
// コードをタイプして追加しました
function KNJCHK(C: Char): Boolean;
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
// 文字入力があるたびに呼ばれる
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
c1,c2: Char;
begin
if (Length(Edit1.Text) <= 0) then exit; // 空の場合は実行しない
c1 := Edit1.Text[Edit1.SelStart+1]; // カーソルの次の文字
c2 := Edit1.Text[Edit1.SelStart+2]; // カーソルの次の次の文字
if KNJCHK(Key) then begin // 入力は全角か?
// 全角の場合
if (KNJCHK(c1)) or ((not KNJCHK(c1)) and (not KNJCHK(c2))) then begin
// 'A'を全角で上書きすると'B'となる
// 'AA'を全角で上書きすると'A'となる
Edit1.SelLength := 2; // 2文字削除
Edit1.ClearSelection;
end else begin
// 'AB'を全角で上書きすると'C 'となる
Edit1.SelLength := 3; // 3文字削除
Edit1.ClearSelection;
Edit1.SelText := ' '; // 1つスペースを挿入
Edit1.SelStart := Edit1.SelStart-1;
end;
end else begin
// 半角の場合
if KNJCHK(c1) then begin // 上書き位置は全角か?
// 'A'を半角で上書きすると'A 'となる
Edit1.SelLength := 2; // 2文字削除
Edit1.ClearSelection;
Edit1.SelText := ' '; // 1つスペースを挿入
Edit1.SelStart := Edit1.SelStart-1;
end else begin
// 'A'を半角で上書きすると'B'となる
Edit1.SelLength := 1; // 1文字削除
Edit1.ClearSelection;
end;
end;
end;
function TForm1.KNJCHK(C: Char): Boolean;
begin
Result := IsDBCSLeadByte( Byte(C) ); // 漢字なら真
// IsDBCSLeadByteはWin32APIヘルプを参照
end;
end.
- FDELPHI MES(16):玉石混淆みんなで作るSample蔵【見本蓄積】 01/02/01 -
Original document by ぺけでび 氏 ID:(YQJ03146)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|