右寄せ設定をTEditにつっこむには

解決


take  2007-01-30 07:58:08  No: 24661

以前のログから引用させていただきます。
type
  TMyEdit = class(TCustomEdit)
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;
var
  MyEdit1 : TMyEdit;

procedure TMyEdit.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.Style := Params.Style or ES_RIGHT;
end;

このEditを右寄せにするTMyEditクラスをすでに配置しているTEditに反映させることってできるんでしょうか?
FormをCreate時に特定の数値入力用Editにのみ反映できないかと考えているんですが…。


横着な貴兄に  2007-01-30 08:51:35  No: 24662

>右寄せにするTMyEditクラスをすでに配置しているTEditに反映させることって...
出来るンですョ

procedure ReplaceEdit(var Edit: TEdit);
var
  s: string;
begin
  with TMyEdit.Create(Self) do begin
    Parent := Edit.Parent;
    Top := Edit.Top;
    Left := Edit.Left;
    Width := Edit.Width;
    Height := Edit.Height;
    s := Edit.Name;
    Edit.Free;
    Name := s;
    Text := '12345';
  end;
end;


take  2007-01-30 09:02:49  No: 24663

横着でごめんなさい。

結局、既存Edit自体に反映はできないんですね。
自作コンポーネントは嫌だったので、プロパティをいただいて、すげ替えるこの方法でいきたいと思います。


嗚呼カンチガイ  2007-01-30 09:08:56  No: 24664

「既存Editに反映できる(既存EditをTMyEditに置き換える)ことが出来る」
と回答してるのに、ナンでカンチガイするのかな〜(^^;


へびあし  2007-01-30 21:41:41  No: 24665

マァ〜確かに厳密には「既存Editに反映させる」とは言えないけど、
TMyEditコンポをわざわざインストールする手間が不要で、
編集時に貼り付けた標準のTEditを TMyEditに動的に変身させる
このワザはイイと思うヨ。 別のPCにDelphi開発環境が変った時など、
「アッ、そうだ。このコンポをインストールしなきゃ」なんてコトは
横着ものでなくてもやっぱりメンドウ。
 .....
var
  Form1: TForm1;

implementation

type
  TMyEdit = class(TCustomEdit)
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;

procedure TMyEdit.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.Style := Params.Style or ES_RIGHT;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ReplaceEdit(Edit1);  // 貼り付けてあった標準のEdit1が 右寄せTMyEditにヘンシ〜ン
  Edit1.Text := '12345';
  ReplaceEdit(Edit2);  // 貼り付けてあった標準のEdit2が 右寄せTMyEditにヘンシ〜ン
  Edit2.Text := '56789';
  .....
end;


みんみん  2007-02-01 07:37:44  No: 24666

単に右寄せにするだけならコレだけでもいいでしょ。
他に何かあるなら見当違いだけどね...。

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


Fusa  2007-02-02 11:31:25  No: 24667

ネット上でのやりとりなんて、
勘違いするのは当たり前だから、
コミュニケーションが届かなくても
受け取りかたが違ってても、目くじらたてないでもいいがな、いいがな。

-- コンポーネントをインストールせずに使う方法 -- 
http://delfusa.blog65.fc2.com/blog-entry-40.html#more

まあ、やるならこれくらい、どうだい?
このやり方ならコード量はすくなくIDE上で設定した値は全部
TMyEditにコピーされるよ。


えーと  2007-02-02 21:06:45  No: 24668

みんみんさんに一票


オブ脳  2007-02-04 05:46:08  No: 24669

オブジェクト指向的には、Fusaさんですね。
テクニックも大事ですが、基本も勉強してみては(^^;


えーと  2007-02-05 08:22:33  No: 24670

質問は

>すでに配置しているTEditに反映させることってできるんでしょうか?

ですが。


えーと  2007-02-05 08:25:14  No: 24671

あああ、Fusa  さんのもそうかぁ。失礼。
でもそれは基本とはいえないと思いますけど。


田中  2007-02-06 08:47:39  No: 24672

ん?  コンポーネントの拡張はポリモーフィズムが基本では?


Fusa  2007-02-06 10:38:20  No: 24673

何が基本か、っていう話にはあんまり同意を得ないだろうね。その人が基本って感じる事が基本だから。
それにしてもプロパティを全部コピーしてしまう、ってのは
Delphiではあんまりみかけないソース。

よくは知らないんだけど、Javaなどではこういうオブジェクト指向の、継承を使わないが、おもしろい利用方法を使うコードがDelphiよりも多くあるような気がする。
「Java言語で学ぶデザインパターン入門: 本: 結城 浩」って本を読んだからそう思うだけだけど。オススメだよ。


del5  2007-02-07 09:14:19  No: 24674

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

..このソースの動作報告です。
  OS=WindowsXPの、複数行タイプのTMemoでは動くようですが
  OS=Win2000や一行タイプのTEditでは動かないようです。


みんみん  2007-02-07 09:50:14  No: 24675

>OS=WindowsXPの、複数行タイプのTMemoでは動くようですが
>OS=Win2000や一行タイプのTEditでは動かないようです。

そうでしたか。
win2000は手元に環境がないので確認できないのですが、
手元のD7+winXPSP2ではTEdit,TMemoとも右寄せになります。
winXPでも環境によってTEditに反映されないというのは
どういう理由からでしょうかねぇ?


えーと  2007-02-07 10:09:59  No: 24676

MSDN の EDIT コントロールの Styles のところには

After the control has been created, these styles cannot be modified, 
except as noted. 

と書いてありますね。ES_LOWERCASE スタイルなどは、コントロール作成後にも
SetWindowLong() で変更できる、と書いてありますが ES_RIGHT には書いて
ありません。ですから、これを使うのはよくないですね。

CreateParams() をオーバーライドした派生コントロールをつくって動的に置き換える
”横着な貴兄に”さんか Fusa さんのが質問の解答にもっとも近いと思います。


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

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






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