Editコンポーネントを右寄せで表示させるには?


ヨウコ  2004-05-28 06:58:33  No: 9187

初心者です。Editコンポーネントの右寄せの仕方がわかりません。コンポーネントを作るしか方法はないのでしょうか?
コンポーネントを作る以外の方法があったら教えてください。お願いします。


ふぐちゃん  2004-05-28 07:40:36  No: 9188

試してみてください。

var
  Wnd: HWND;
begin
  Wnd := Edit1.Handle;
  SetWindowLong(Wnd, GWL_STYLE, GetWindowLong(Wnd, GWL_STYLE) or ES_RIGHT);


ヨウコ  2004-05-29 08:24:30  No: 9189

実際にやってみましたが、できませんでした。他に方法ないのでしょうか?
よかったら教えてもらえますか?


ふぐちゃん  2004-05-29 08:41:26  No: 9190

> 実際にやってみましたが、できませんでした。
どうやったらできなかったのかを書いた方がよいと思います。
単に「できませんでした」では何というか...

procedure TForm1.FormCreate(Sender: TObject);
var
  Wnd: HWND;
begin
  Wnd := Edit1.Handle;
  SetWindowLong(Wnd, GWL_STYLE, GetWindowLong(Wnd, GWL_STYLE) or ES_RIGHT);
end;


X  2004-05-29 19:19:47  No: 9191

TMemoで代用する方法もある。

Alignment := taRightJustify;
WantResturns := False;
WantTabs := False;
WordWrap := False;
ScrollBars := ssNone;
Height := 20;

でTEditに見える。


ふぐちゃん  2004-05-29 19:37:34  No: 9192

Xさん、はじめまして。
とてもよい方法だと思いますが、OnKeyDownイベントで Ctrl+Enter を
無効にする必要がありますか?


ヨウコ  2004-05-29 20:44:06  No: 9193

delphi6.0  professionalで行ったのですが、コンパイルはできました。普通に左からしか入力できませんでした。環境はwin2000proです。6.0以前ではコードを認識しないのではないでしょうか?


はてな?  2004-05-29 20:57:18  No: 9194

>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
とした場合は、数字キー入力だけを有効にすることは出来ましたけど...


jok  2004-05-29 22:02:04  No: 9195

うーむ、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.


ふぐちゃん  2004-05-29 22:11:09  No: 9196

> これでは 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さんの方法をおすすめします。


jok  2004-05-30 00:40:20  No: 9197

> SDKの説明はウソなのかな?

このコントロールに限らず、ウィンドウスタイルを動的に変更できるものと
できないものがあります。できないのは、変更しても反映されないという
意味ですが。


ふぐちゃん  2004-05-30 02:16:27  No: 9198

> このコントロールに限らず、ウィンドウスタイルを動的に変更できるものと
> できないものがあります。できないのは、変更しても反映されないという
> 意味ですが。
ES_RIGHTを動的に設定できるのはXPだけみたいですね。
Windowsのバージョンによって微妙な違いがあるところが面白いです。(苦笑)


ヨウコ  2004-05-30 02:31:18  No: 9199

みなさん。ありがとうございます。初心者なんでよくわからないのですが、
コンポーネントを作って実際に使えるようにするにはどしたらよいでしょうか?さきほどのコードをコンポーネント作成のところに打てばいいのですか?


にゃ〜  2004-05-30 18:49:21  No: 9200

>コンポーネントを作って実際に使えるようにするにはどしたらよいでしょうか?
>さきほどのコードをコンポーネント作成のところに打てばいいのですか?

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.


ケンチャン  2004-08-17 06:20:01  No: 9201

そんなにむつかしく考えないで、文字列の前に適当にスペ−スを
足しこめばいかがですか。
変に別にコンポ−ネントを造ればバ−ジョンアップ時に困りませんか。
私はもっぱら関数を作り、そこへ飛ばせてeditの長さに合わせています。
余談ですがMaskEditも全く使いにくいので、これも自家関数で整形
しています。


TtPIPICH  2004-08-17 19:12:13  No: 9202

>文字列の前に適当にスペ−スを
スペースに入力されたり、スペースが消されたら、どうするのですか?


jok  2004-08-17 19:38:56  No: 9203

にゃ〜さんのコンポーネントをインストールするのが一番簡単で確実だと思います。


おやじ  2004-08-19 01:19:03  No: 9204

にゃ〜さんのアイディアをLabeledEditおよびLabeledEditから派生して作った
コンポーネントに適用しました。非常に簡単でうまくいきました。ありがとう。


とり  2004-08-19 17:01:08  No: 9205

Memoコンポーネントを使って、プロパティを

Alignment    := taRightJustify;
WantResturns := False;
WantTabs     := False;
WordWrap     := False;

にして、

var
  Buf: Integer;
begin
  Buf := StrToInt(Memo1.Lines.Strings[0]);

でEditコンポーネントとほぼ一緒。


TtPIPICH  2004-08-19 19:01:32  No: 9206

>でEditコンポーネントとほぼ一緒。
Xさんの書き込みとそれに対するレスは見ましたか?


けんちゃん  2004-08-21 11:03:16  No: 9207

TtPiPiCHさん
OnChenge で受け直ちに整形関数へとばせばよいのでは?


TtPIPICH  2004-08-21 20:50:06  No: 9208

>OnChenge・で受け直ちに整形関数へとばせばよいのでは?
それならCreateParamsの方が簡単だと思います。


tw  2004-08-23 05:49:39  No: 9209

>OnChenge で受け直ちに整形関数へとばせばよいのでは?
  一瞬ちらついてしまいませんか?


Mr.XRAY  URL  2004-08-23 07:43:37  No: 9210

途中からしゃしゃりでます.
ヨウコさんへ,
既に他の方からも同様の意見がありますが,機能の変更や追加動作のコンポーネント
が必要な場合,元となるコンポーネントから変更,追加したコンポーネント
を作成する方法は便利です.これが比較的簡単に出来るのが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.


Mr.XRAY  URL  2004-08-23 08:29:35  No: 9211

>(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


けんちゃん  2004-09-02 06:31:29  No: 9212

>OnChenge で受け直ちに整形関数へとばせばよいのでは?
  一瞬ちらついてしまいませんか?

私は乱用していますが、最近のPCの速度では全く気になりません。
遅ればせでごめんなさい。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加