以前のログから引用させていただきます。
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にのみ反映できないかと考えているんですが…。
>右寄せにする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;
横着でごめんなさい。
結局、既存Edit自体に反映はできないんですね。
自作コンポーネントは嫌だったので、プロパティをいただいて、すげ替えるこの方法でいきたいと思います。
「既存Editに反映できる(既存EditをTMyEditに置き換える)ことが出来る」
と回答してるのに、ナンでカンチガイするのかな〜(^^;
マァ〜確かに厳密には「既存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;
単に右寄せにするだけならコレだけでもいいでしょ。
他に何かあるなら見当違いだけどね...。
procedure TForm1.FormCreate(Sender: TObject);
begin
SetWindowLong(Edit1.Handle,GWL_STYLE,
GetWindowLong(Edit1.Handle,GWL_STYLE) or ES_RIGHT);
end;
ネット上でのやりとりなんて、
勘違いするのは当たり前だから、
コミュニケーションが届かなくても
受け取りかたが違ってても、目くじらたてないでもいいがな、いいがな。
-- コンポーネントをインストールせずに使う方法 --
http://delfusa.blog65.fc2.com/blog-entry-40.html#more
まあ、やるならこれくらい、どうだい?
このやり方ならコード量はすくなくIDE上で設定した値は全部
TMyEditにコピーされるよ。
みんみんさんに一票
オブジェクト指向的には、Fusaさんですね。
テクニックも大事ですが、基本も勉強してみては(^^;
質問は
>すでに配置しているTEditに反映させることってできるんでしょうか?
ですが。
あああ、Fusa さんのもそうかぁ。失礼。
でもそれは基本とはいえないと思いますけど。
ん? コンポーネントの拡張はポリモーフィズムが基本では?
何が基本か、っていう話にはあんまり同意を得ないだろうね。その人が基本って感じる事が基本だから。
それにしてもプロパティを全部コピーしてしまう、ってのは
Delphiではあんまりみかけないソース。
よくは知らないんだけど、Javaなどではこういうオブジェクト指向の、継承を使わないが、おもしろい利用方法を使うコードがDelphiよりも多くあるような気がする。
「Java言語で学ぶデザインパターン入門: 本: 結城 浩」って本を読んだからそう思うだけだけど。オススメだよ。
> 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では動かないようです。
>OS=WindowsXPの、複数行タイプのTMemoでは動くようですが
>OS=Win2000や一行タイプのTEditでは動かないようです。
そうでしたか。
win2000は手元に環境がないので確認できないのですが、
手元のD7+winXPSP2ではTEdit,TMemoとも右寄せになります。
winXPでも環境によってTEditに反映されないというのは
どういう理由からでしょうかねぇ?
MSDN の EDIT コントロールの Styles のところには
After the control has been created, these styles cannot be modified,
except as noted.
と書いてありますね。ES_LOWERCASE スタイルなどは、コントロール作成後にも
SetWindowLong() で変更できる、と書いてありますが ES_RIGHT には書いて
ありません。ですから、これを使うのはよくないですね。
CreateParams() をオーバーライドした派生コントロールをつくって動的に置き換える
”横着な貴兄に”さんか Fusa さんのが質問の解答にもっとも近いと思います。
ツイート | ![]() |