Delphi XE Pro - フォームのサイズを指定して変更する関数を書いてみた
最初のサイズ。
b0003577_429454.jpg

800x600
b0003577_431927.jpg

こんな感じでフォームのサイズを変更するコードを書いた。

procedure TForm1.N800x600Click(Sender: TObject);
begin
 Form1.Width := 800;
 Form1.Height := 600;
end;

procedure TForm1.N1024x768Click(Sender: TObject);
begin
 Form1.Width := 1024;
 Form1.Height := 768;
end;


procedure TForm1.N1200x800Click(Sender: TObject);
begin
 Form1.Width := 1200;
 Form1.Height := 800;
end;

しかしこれだと似た処理を増やした時にスマートじゃない気がするので いろいろ調べて関数にすることにした。





関数(function )として使うには、
pas ファイルの上部のtype部(呼称は正しいのかも知らない)に
  function WindowResize(x, y:integer): Integer;
と追加して
usesに処理を書く。
function TForm1.WindowResize(x, y:integer): Integer;
begin
 Form1.Width := x;
 Form1.Height := y;
end;

usesに処理を書く時に親のクラス(この場合は「TForm1.」)を書き忘れるとコンパイルエラーになるので注意。

で他のprocedure からは
procedure TForm1.N800x600bClick(Sender: TObject);
begin
 WindowResize(800,600);
end;

こんな感じで処理をさせることができる。

で上部のソースを書き直すと
procedure TForm1.N800x600Click(Sender: TObject);
begin
 WindowResize(800,600);
end;

procedure TForm1.N1024x768Click(Sender: TObject);
begin
 WindowResize(1024,768);
end;

procedure TForm1.N1200x800Click(Sender: TObject);
begin
 WindowResize(1200,800);
end;
になる。


しかし、type部と private部と、 public部の違いがわかっていないのは問題だよねぇ。
たぶんpublic はこのpasファイル以外からも使えるんじゃないかと思っているけど、
そうなると type と privateの違いがわからない。
[PR]

by arigayas | 2011-04-15 04:58 | Delphi Programming | Trackback(1) | Comments(7)
トラックバックURL : http://arigayas.exblog.jp/tb/15268605
トラックバックする(会員専用) [ヘルプ]
※このブログはトラックバック承認制を適用しています。 ブログの持ち主が承認するまでトラックバックは表示されません。
Tracked from arigayasのblog at 2011-04-15 05:07
タイトル : Delphi XE Pro - 関数にまとめたい
昨日、開発中のソフトにウィンドウサイズを変更するメニューを加えたのだが ソースは、愚直過ぎる感じがして 良い改良案はないか?と 2枚目のソース部分だけTwitterに貼付けて聞いたところ 3名の方から返答をいただいた。 ---------------------------------------------------------------------------@plus7 さんから 変形させるForm,変形後の幅,高さを格納するプロパティをもったTButtonの派生クラスを作...... more
Commented by 通りすがり at 2011-04-15 07:13 x
位置とサイズをいっぺんに変更するSetBoundsというメソッドもあります。
あとフォームにはWidth/HeightとClientWidth/ClientHeightという
同じようなプロパティがあるので気をつけましょう。Client...は枠線を除く
正味(クライアント領域)のサイズで、デザイン時にはこちらを設定します
(実行環境で枠線の太さが変えられるから)。実行時はこの記事のように
Width/Heightを設定してもOKです(デスクトップ領域のサイズに
合わせるときなど)。
あーあとWindowResizeのコードでForm1.Width := ...と
"Form1."をつけている部分がありますが、これは単にWidth := ...と
したほうがいいですよ。
Commented by arigayas at 2011-04-16 00:30
通りすがりさん、コメントありがとうございます。

前半は知らなかったのでためになりました。
後半のWindowResizeのコードで"Form1."をつけるのと消すのでは、どう違うのかわからないので詳しくお願いできますか?(性能が違うのでしょうか?)
Commented by 通りすがり at 2011-04-16 18:50 x
Form1.という修飾はimplementation部直前にIDEが自動挿入する
グローバル変数であるForm1の、という意味です。従ってこの変数に格納
されているフォームが常に操作の対象となります。これに対してForm1.を
つけないと、暗黙に最も内側のスコープであるSelf.(=TForm1の
インスタンス)が仮定されます(with文などを使うとこの仮定は変化します)。
上記の例そのままであれば余り違いがないように見えますが、プロジェクト
オプションなどでフォームを自動生成しないようにした場合(メインフォームは
自動生成一択ですが、それ以外のフォームではむしろ自動生成しない
ほうが普通)などでこのグローバル変数にフォームのインスタンスを格納しない
ような状況では当然Form1.とかForm2.などの参照は不正な結果を
もたらします。フォームの自動生成をしないような場合だとそもそもIDEが
自動生成するvar Form1;のようなグローバル変数を削除してしまう
ほうが間違いがありませんし、そのときはそもそもコンパイルエラーになります。
Commented by 通りすがり at 2011-04-16 18:50 x
Form1とForm2があってForm1のButton1をクリックしたときに
Form2をモーダルで表示したいとき、
procedure TForm1.Button1Click(Sender: TObject);
begin
with TForm2.Create(Self) do
begin
try
ShowModal;
finally
Release;
end;
end;
end;
なんてときにはグローバル変数Form2は使わないので、ここで
Form2.Widthなんて参照してしまうとアクセス違反(Form2はnilなので)
になってしまうわけです。
Commented by arigayas at 2011-04-18 03:03
通りすがりさん、コメントありがとうございます。

Form1とForm2が画面上に存在した場合、
Form2のフォームサイズを変更しようと思ってWindowResize関数を使うと
Form2のサイズが変更されずにForm1のサイズが変更されて

Form2のフォームサイズを変更しようと思って改良WindowResize関数(*)を使うと
Form2のサイズが変更されるってことですか?

改良WindowResize関数(*):
 Form1.Width := x; → Width := x;
 Form1.Height := y; → Height := y;


Form1は画面上に存在してForm2が存在しない場合に
ソースコード側でForm2のフォームサイズを変更しようと思ってWindowResize関数を使うと
「存在しないForm2のサイズ変更はできません!」となってエラーになるって事でしょうか?
Commented by 通りすがり at 2011-04-18 06:33 x
まあそんな感じです。
Form1.とかForm2.とかつけてしまうとその関数はその変数に対してのみ
しか使えないものになってしまいますが、何もつけなければ暗黙に補完される
Self.に対して操作することになります。DelphiのSelfはC++のthisに
相当するものです。ここから先はオブジェクト指向、クラスといったものを
すこし系統的に勉強されるといいと思います。DelphiはVBと同様に
なんとなくそれなりに動くものが作れてしまいますし、それは決して悪いこと
ではないのですが、それを裏から支えているメカニズムをきちんと押さえる
こともまた大事だと思いますので。
Commented by arigayas at 2011-04-19 06:33
通りすがりさん

オブジェクト指向、クラスといったものを勉強した方が良いというのは何となく思うんですが、まだ早いような気がしてます・・・。
<< 最近使っているFirefox ... 数年ぶりに自転車を購入した >>