初心者です。Editコンポーネントの右寄せの仕方がわかりません。コンポーネントを作るしか方法はないのでしょうか?
コンポーネントを作る以外の方法があったら教えてください。お願いします。
試してみてください。
var
Wnd: HWND;
begin
Wnd := Edit1.Handle;
SetWindowLong(Wnd, GWL_STYLE, GetWindowLong(Wnd, GWL_STYLE) or ES_RIGHT);
実際にやってみましたが、できませんでした。他に方法ないのでしょうか?
よかったら教えてもらえますか?
> 実際にやってみましたが、できませんでした。
どうやったらできなかったのかを書いた方がよいと思います。
単に「できませんでした」では何というか...
procedure TForm1.FormCreate(Sender: TObject);
var
Wnd: HWND;
begin
Wnd := Edit1.Handle;
SetWindowLong(Wnd, GWL_STYLE, GetWindowLong(Wnd, GWL_STYLE) or ES_RIGHT);
end;
TMemoで代用する方法もある。
Alignment := taRightJustify;
WantResturns := False;
WantTabs := False;
WordWrap := False;
ScrollBars := ssNone;
Height := 20;
でTEditに見える。
Xさん、はじめまして。
とてもよい方法だと思いますが、OnKeyDownイベントで Ctrl+Enter を
無効にする必要がありますか?
delphi6.0 professionalで行ったのですが、コンパイルはできました。普通に左からしか入力できませんでした。環境はwin2000proです。6.0以前ではコードを認識しないのではないでしょうか?
>procedure TForm1.FormCreate(Sender: TObject);
>var
> Wnd: HWND;
>begin
> Wnd := Edit1.Handle;
> SetWindowLong(Wnd, GWL_STYLE, GetWindowLong(Wnd, GWL_STYLE) or ES_RIGHT);
>end;
これでは Win98でもWin2000でも Edit1は右寄せ表示にはならないですね。
どんな環境だったらうまくいくんでしょう?
試しに、
or ES_RIGHT
ではなくて
or ES_NUMBER
とした場合は、数字キー入力だけを有効にすることは出来ましたけど...
うーむ、ES_RIGHT は動的にスタイル変更がきかないのかなぁ?
TEdit の CreateParams() をオーバーライドするといいようです。
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TREdit = class(TEdit)
protected
procedure CreateParams(var Params: TCreateParams); override;
end;
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private 宣言 }
public
REdit:TREdit;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{ TREdit }
procedure TREdit.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.Style := Params.Style or ES_RIGHT;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
REdit := TREdit.Create(self);
REdit.Parent := self;
REdit.Left := 10;
REdit.Top := 10;
REdit.Text := '右揃えになった!';
end;
end.
> これでは Win98でもWin2000でも Edit1は右寄せ表示にはならないですね。
> どんな環境だったらうまくいくんでしょう?
XPなら動的に右寄せにできるのですが...
SDKの説明はウソなのかな?
ES_RIGHT
Windows 98/Me, Windows 2000/XP: Right aligns text in a single-line or multiline edit control.
Windows 95, Windows NT 4.0 and earlier: Right aligns text in a multiline edit control.
ヨウコさん、jokさんの方法をおすすめします。
> SDKの説明はウソなのかな?
このコントロールに限らず、ウィンドウスタイルを動的に変更できるものと
できないものがあります。できないのは、変更しても反映されないという
意味ですが。
> このコントロールに限らず、ウィンドウスタイルを動的に変更できるものと
> できないものがあります。できないのは、変更しても反映されないという
> 意味ですが。
ES_RIGHTを動的に設定できるのはXPだけみたいですね。
Windowsのバージョンによって微妙な違いがあるところが面白いです。(苦笑)
みなさん。ありがとうございます。初心者なんでよくわからないのですが、
コンポーネントを作って実際に使えるようにするにはどしたらよいでしょうか?さきほどのコードをコンポーネント作成のところに打てばいいのですか?
>コンポーネントを作って実際に使えるようにするにはどしたらよいでしょうか?
>さきほどのコードをコンポーネント作成のところに打てばいいのですか?
jokさんのサンプルコードは自分のアプリのユニットファイルに書き込むだけで右寄せの「REdit」を使えるんで、コンポーネントではないんだにゃ〜
右寄せEditの数が1個〜数個くらいなら、そのサンプル通りにするのが簡単で良いにゃ〜
でも、もし大量に右寄せEditを使うのならコンポーネントとして登録した方が便利かにゃ〜
コンポ登録する場合でもコードはたったこれだけにゃ〜
下のコードを REdit.pasのファイル名でDelphiのLibフォルダに保存して「コンポーネントのインストール」をすれば、「Samples」パレットに右寄せの「REdit」が登録されるにゃ〜
unit REdit;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls;
type
TREdit = class(TEdit)
protected
procedure CreateParams(var Params: TCreateParams); override;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TREdit]);
end;
procedure TREdit.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.Style := Params.Style or ES_RIGHT;
end;
end.
//-----------------------------------------
こちらは、ちょっと高度に Alignmentプロパティを追加して、左寄せ、中央寄せ、右寄せを自由に変更できる UAEditコンポの例だにゃ〜
unit UAEdit;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls;
type
TUAEdit = class(TEdit)
protected
procedure CreateParams(var Params: TCreateParams); override;
private
FAlignment: TAlignment;
procedure SetAlignment(Value: TAlignment);
published
property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TUAEdit]);
end;
procedure TUAEdit.CreateParams(var Params: TCreateParams);
const
Alignments: array[Boolean, TAlignment] of DWORD =
((ES_LEFT, ES_RIGHT, ES_CENTER),(ES_RIGHT, ES_LEFT, ES_CENTER));
begin
inherited;
Params.Style := Params.Style or Alignments[UseRightToLeftAlignment, FAlignment];
end;
procedure TUAEdit.SetAlignment(Value: TAlignment);
begin
if FAlignment <> Value then begin
FAlignment := Value;
RecreateWnd;
end;
end;
end.
そんなにむつかしく考えないで、文字列の前に適当にスペ−スを
足しこめばいかがですか。
変に別にコンポ−ネントを造ればバ−ジョンアップ時に困りませんか。
私はもっぱら関数を作り、そこへ飛ばせてeditの長さに合わせています。
余談ですがMaskEditも全く使いにくいので、これも自家関数で整形
しています。
>文字列の前に適当にスペ−スを
スペースに入力されたり、スペースが消されたら、どうするのですか?
にゃ〜さんのコンポーネントをインストールするのが一番簡単で確実だと思います。
にゃ〜さんのアイディアをLabeledEditおよびLabeledEditから派生して作った
コンポーネントに適用しました。非常に簡単でうまくいきました。ありがとう。
Memoコンポーネントを使って、プロパティを
Alignment := taRightJustify;
WantResturns := False;
WantTabs := False;
WordWrap := False;
にして、
var
Buf: Integer;
begin
Buf := StrToInt(Memo1.Lines.Strings[0]);
でEditコンポーネントとほぼ一緒。
>でEditコンポーネントとほぼ一緒。
Xさんの書き込みとそれに対するレスは見ましたか?
TtPiPiCHさん
OnChenge で受け直ちに整形関数へとばせばよいのでは?
>OnChenge・で受け直ちに整形関数へとばせばよいのでは?
それならCreateParamsの方が簡単だと思います。
>OnChenge で受け直ちに整形関数へとばせばよいのでは?
一瞬ちらついてしまいませんか?
途中からしゃしゃりでます.
ヨウコさんへ,
既に他の方からも同様の意見がありますが,機能の変更や追加動作のコンポーネント
が必要な場合,元となるコンポーネントから変更,追加したコンポーネント
を作成する方法は便利です.これが比較的簡単に出来るのがDelphiの特徴でもあります.
コンポーネントにすれば,再利用が簡単です.たとえコンポーネントの作成や
インストールが初めてであっても,いつかは必要になることがあります.
是非この際,挑戦して見て下さい.
にゃ〜さんのコードに,数値専用かどうかを設定するプロパティを追加しました.
(右寄せということは,多分数値入力だと思って)
(1) [ファイル][新規作成]でユニットを作成します.
(2) そのユニットのコードを全て削除します.
(3) 下のコードをコピーして,そのユニットに貼付けます.
(4) このユニットをplEdit.pasという名前で保存します.
(5) plEdit.pasをコンポーネントとしてインストールします.
参考URL http://homepage2.nifty.com/Mr_XRAY/Delphi/CompInstall.htm
(6) コンポーネントパレットに[plXRAY]というのが追加されて,そこに
plEditというコンポーネントが見えるようになります.
(7) 新規作成FormにこのplEditを配置して[F9]で実行してみて下さい.
では,ご検討をお祈り致します.
{$WARNINGS OFF}
//====================================================================
// 右寄せ入力専用Editコンポーネント
//
// 右寄せから想像するのは数値専用(?)
// というわけで数値専用入力とするかの論理型プロパティNumOnlyも用意
//
// 2004.08.23 Ver1.0
// HGH03072@nifyt.ne.jp
// http://homepage2.nifty.com/Mr_XRAY/
//====================================================================
unit plEdit;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TplEdit = class(TEdit)
private
FAlignment : TAlignment;
FNumOnly : Boolean;
procedure SetAlignment(const Value: TAlignment);
procedure SetNumOnly(const Value: Boolean);
protected
procedure CreateParams(var params: TCreateParams); override;
public
constructor Create(AOwner: TComponent); override;
published
property Alignment : TAlignment read FAlignment write SetAlignment;
property NumOnly : Boolean read FNumOnly write SetNumOnly;
end;
procedure Register;
implementation
const
//Styleの設定用
Alignments: array[TAlignment]of Word = (ES_LEFT, ES_RIGHT, ES_CENTER);
NumOnlies : array[Boolean]of Word = (0,ES_NUMBER);
procedure Register;
begin
RegisterComponents('plXRAY', [TplEdit]);
end;
{ TplEdit }
//====================================================================
// Create処理.初期状態で数値入力専用とする
//====================================================================
constructor TplEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FNumOnly :=True;
FAlignment:=taRightJustify;
end;
//====================================================================
// CreateParams処理
//====================================================================
procedure TplEdit.CreateParams(var params: TCreateParams);
begin
inherited CreateParams(Params);
Params.Style:=Params.Style or Alignments[FAlignment] or NumOnlies[FNumonly];
end;
//====================================================================
// Alignmentプロパティ設定
// 左,右,中央寄せ入力
//====================================================================
procedure TplEdit.SetAlignment(const Value: TAlignment);
begin
if FAlignment<>Value then begin
FAlignment:=Value;
//オブジェクト再生成
RecreateWnd;
end;
end;
//====================================================================
// NumOnlyプロパティ設定
// Trueなら数値入力専用
//====================================================================
procedure TplEdit.SetNumOnly(const Value: Boolean);
begin
if FNumOnly<>Value then begin
FNumOnly:=Value;
//オブジェクト再生成
RecreateWnd;
end;
end;
end.
>(4) このユニットをplEdit.pasという名前で保存します.
保存先は以下を参考にご自分で考えて下さい.
http://homepage2.nifty.com/Mr_XRAY/Delphi/CompPath.htm
http://homepage2.nifty.com/Mr_XRAY/Delphi/CompPallet.htm
ついでに,コンポーネントが不要になった場合は,
http://homepage2.nifty.com/Mr_XRAY/Delphi/CompUnInstall.htm
>OnChenge で受け直ちに整形関数へとばせばよいのでは?
一瞬ちらついてしまいませんか?
私は乱用していますが、最近のPCの速度では全く気になりません。
遅ればせでごめんなさい。
ツイート | ![]() |