Form Tutorial/ja: what changed
Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.
| Old | New | Line | |
|---|---|---|---|
| 1 | - | ||
| 2 | - | ||
| 3 | - | ||
| 4 | - | ||
| 5 | - | ||
| 6 | - | ||
| 7 | - | ||
| 8 | - | ||
| 9 | - | ||
| 10 | - | ||
| 11 | - | ||
| 12 | - | ||
| 13 | - | ||
| 14 | - | ||
| 15 | - | ||
| 16 | - | ||
| 17 | - | ||
| 18 | - | ||
| 19 | - | ||
| 20 | - | ||
| 21 | - | ||
| 1 | + | Lazarusでフォームを用いるための短いイントロダクション。 | |
| 22 | 2 | ||
| 23 | 3 | ## フォームとは何か | |
| 24 | 4 | ||
| 25 | - | ||
| 5 | + | フォーム (class [[TForm]])は[[Application|applicationのユーザーインターフェースとなるウインドウもしくはダイアログを]]表す。それは他の[[LCL Components|components]](例えば、ボタン、ラベル、編集ボックス、画像など)が挿入されるコンテナである。 | |
| 26 | 6 | ||
| 27 | 7 | ## 初めてのGUIアプリケーション | |
| 28 | 8 | ||
| 29 | - | ||
| 9 | + | Lazarusのインストールが成功し、新しいアプリケーションプロジェクトを始めると、空のフォームが作られる。そうでなければ、新しい [[Overview of Free Pascal and Lazarus|GUI アプリケーションを]] メインメニュー -\> プロジェクト -\> 新規プロジェクト -\> アプリケーション OKで作ることができる。 | |
| 30 | 10 | ||
| 31 | - | ||
| 11 | + | 今、新しい、全機能が使えるフォームを持つプロジェクトが生成された: | |
| 32 | 12 | ||
| 33 | - | ||
| 13 | + |  | |
| 34 | 14 | ||
| 35 | - | ||
| 15 | + | 新しく作られたプロジェクトを実行するには、単に`F9`キーを押す、もしくはマウスでメインメニューアイコン(あるいは メインメニュー: 実行 -\> 実行)をクリックする。プロジェクトはコンパイル、実行される。 | |
| 36 | 16 | ||
| 37 | - | ||
| 17 | + | 特に面白いことが起こるわけではない。フォーム(Form1)はわずかに外見が変わり、ラスタグリッドの点々(個々のコンポーネントの位置付けの助けとなる)が消える(グリッドの点が見えてる間は、それがデザインモードにあることがわかる):\ | |
| 18 | + |  -\>  | |
| 38 | 19 | ||
| 39 | - | ||
| 20 | + | 次にフォームの上に[[TButton/ja|TButtonを]]配することができる。これは後に第2のフォームを開くことを可能にするために使われる: | |
| 40 | 21 | ||
| 41 | - | ||
| 22 | + | [[Component Palette/ja|コンポーネントパレット]]上の[[Standard tab/ja|StandardタブからTButtonを]]選ぶ。 | |
| 42 | 23 | ||
| 43 | - | ||
| 24 | + |  | |
| 44 | 25 | ||
| 45 | - | ||
| 26 | + | そしてフォームをクリックする: 「Button1」の名前とキャプションでForm1にボタンが配される。 | |
| 46 | 27 | ||
| 47 | - | ||
| 28 | + | このボタンに何かをさせるために、それをクリックすると、何か意図したことをするようにボタンに告げなければならない。これは単純なイベントである。このためクリックされた後に呼ばれる [[Event order|イベントハンドラが]]必要である。マウスに対するイベントハンドラはボタンはButton1をダブルクリックすることにより、極めて簡単に行える(もしくはオブジェクトインスペクタで、Button1 -\> イベントタブ -\> OnClick、次いで\[...\]をクリック)。これはButton1がクリックされると(設計段階ではなく[[runtime]])にいつも呼ばれるプロシージャTForm1.Button1Clickをコードエディタに作り出す。 | |
| 48 | 29 | ||
| 49 | - | ||
| 30 | + |  | |
| 50 | 31 | ||
| 51 | - | ||
| 32 | + | アプリケーションにButton1をクリックした後に何かをさせるために、プロシージャTForm1.Button1Clickの[[Begin|Beginと]][[End|Endの]]間にこのようにコードを加える: | |
| 52 | 33 | ||
| 53 | - | ||
| 54 | - | ||
| 55 | - | ||
| 34 | + | ``` pascal | |
| 56 | 35 | procedure TForm1.Button1Click(Sender: TObject); | |
| 57 | - | ||
| 58 | - | ||
| 59 | - | ||
| 60 | - | ||
| 61 | - | ||
| 36 | + | begin | |
| 37 | + | Caption:='My first Form'; //Form1のキャプションが変更される(フォーム冒頭のテキスト) | |
| 38 | + | //or | |
| 39 | + | Button1.Caption:='Hello'; //ボタンのキャプションが変更される(ボタンのテキストが表示される) | |
| 40 | + | end; | |
| 62 | 41 | ``` | |
| 63 | 42 | ||
| 64 | - | ||
| 43 | + | そして、`F9`を押し、フォームを起動させる、ボタンをクリックしたときにフォームキャプションとボタンキャプションの双方が変わることに注意すること。 | |
| 65 | 44 | ||
| 66 | - | ||
| 45 | + | ちょっとした実験を行い、スタンダードコンポーネントの使い方を学んだ。始めるにあたり、以下のコンポーネントの例を試してみることを勧める: | |
| 67 | 46 | ||
| 68 | - | ||
| 69 | - | ||
| 70 | - | ||
| 71 | - | ||
| 72 | - | ||
| 73 | - | ||
| 74 | - | ||
| 75 | - | ||
| 76 | - | ||
| 77 | - | ||
| 78 | - | ||
| 79 | - | ||
| 80 | - | ||
| 47 | + | | | | | |
| 48 | + | |----|----| | |
| 49 | + | | [[TButton/ja|TButton]] |  | | |
| 50 | + | | [[TLabel/ja|TLabel]] |  | | |
| 51 | + | | [[TEdit/ja|TEdit]] |  | | |
| 52 | + | | [[TMemo/ja|TMemo]] |  | | |
| 53 | + | | [[TToggleBox/ja|TToggleBox]] |  | | |
| 54 | + | | [[TCheckBox/ja|TCheckBox]] |  | | |
| 55 | + | | [[TRadioButton/ja|TRadioButton]] |  | | |
| 56 | + | | [[TListBox/ja|TListBox]] |  | | |
| 57 | + | | [[TComboBox/ja|TComboBox]] |  | | |
| 58 | + | | [[TScrollBar/ja|TScrollBar]] |  | | |
| 81 | 59 | ||
| 60 | + | ここにさらに役に立つ情報がある[[Lazarus Tutorial/ja|Lazarusチュートリアル]]。 | |
| 61 | + | ||
| 82 | 62 | ## 2つ目のフォームを使う | |
| 83 | 63 | ||
| 84 | - | ||
| 64 | + | このチュートリアルでは1つのプロジェクトで複数のフォームを使う方法を示す。この例で2つだけのフォーム、Form1(メインフォーム)とForm2が作られるが、追加のフォームについてもその仕方は同一である。 | |
| 85 | 65 | ||
| 86 | - | ||
| 87 | - | ||
| 66 | + | クリックされると新しいフォームを開くボタンがメインフォームにある。新しいフォームはまた、クリックされるとそれ自身を閉じ、メインフォームに帰ってくるボタンを有する。 もし最初のチュートリアル、 [[Form Tutorial/ja|初めてのGUIアプリケーションを]]終えているのなら、TForm1.Button1Clickプロシージャのbeginとendの間のコードを削除しておく必要がある。そうしないと、新たなプロジェクト(アプリケーション)フォームにボタンを置き、キャプション(ボタンの上の表示されるテキスト)を入力し、OnClickイベントハンドラをこのButton1に作らなければならない。\ | |
| 67 | + | これを行うためボタンを選択(一度クリックする)し、オブジェクトインスペクタで、プロパティ -\> Caption、「Open Form2」と入力する。 | |
| 88 | 68 | ||
| 89 | - | ||
| 69 | + |  | |
| 90 | 70 | ||
| 91 | - | ||
| 71 | + | 2つ目のフォーム(Form2)をプロジェクトに加えるため、メインメニューで ファイル -\> 新規フォームを実行する。Form2にボタンを置きそれにOnClickイベントを作る。このボタンのキャプションを「Close」に変更する。 | |
| 92 | 72 | ||
| 93 | - | ||
| 73 | + | いま、このプロジェクトは2つのフォームを持ち、それぞれはメインメニュー、プロジェクト -\> フォーム...(もしくはキーの組み合わせ`Shift` + `F12`)で選択、表示できる。また別に、ソースエディタでUnitタブで選択もでき、`F12`でコードエディタと[[Unit|Unitに]]割り当てられたフォームデザイナとを切り替えできる。 | |
| 94 | 74 | ||
| 95 | - | ||
| 96 | - | ||
| 75 | + | [[source code editor|source code editorで]][[Unit]] (Unit1)が割り当てられたForm1に行き[[Uses|Usesに]]節「Unit2を加える: | |
| 76 | + | ||
| 77 | + | ``` pascal | |
| 97 | 78 | uses | |
| 98 | - | ||
| 99 | - | ||
| 79 | + | Classes, SysUtils, ... , Unit2; // それぞれのユニットがコンマ(,)で区切られていることと | |
| 80 | + | // uses 節がセミコロン(;)で終わることは重要である。 | |
| 100 | 81 | ``` | |
| 101 | 82 | ||
| 102 | - | ||
| 83 | + | 今、Unit2(即ちForm2)をUnit1から呼び出すことができる。 | |
| 103 | 84 | ||
| 104 | - | ||
| 105 | - | ||
| 85 | + | 次に、Form1に属するボタンのOnClickイベントを編集する: | |
| 86 | + | ||
| 87 | + | ``` pascal | |
| 106 | 88 | unit Unit1; | |
| 107 | - | ||
| 108 | - | ||
| 109 | - | ||
| 110 | - | ||
| 111 | - | ||
| 112 | - | ||
| 89 | + | ... | |
| 90 | + | procedure TForm1.Button1Click(Sender: TObject); | |
| 91 | + | begin | |
| 92 | + | Form2.ShowModal; //Form2を表示、フォーカスはForm2に来る。 | |
| 93 | + | end; | |
| 113 | 94 | ``` | |
| 95 | + | ||
| 96 | + | ``` pascal | |
| 114 | 97 | unit Unit2; | |
| 115 | - | ||
| 116 | - | ||
| 117 | - | ||
| 118 | - | ||
| 119 | - | ||
| 98 | + | ... | |
| 99 | + | procedure TForm2.Button1Click(Sender: TObject); | |
| 100 | + | begin | |
| 101 | + | Close; //Form2を閉じる | |
| 102 | + | end; | |
| 120 | 103 | ``` | |
| 121 | 104 | ||
| 122 | - | ||
| 105 | + | これで、プロジェクトを起動( もしくは `F9`)し、Form1のボタンをクリックすることでForm2を開くことができる。 | |
| 123 | 106 | ||
| 124 | 107 | ### ShowとShowModalの違い | |
| 125 | 108 | ||
| 126 | - | ||
| 109 | + | *Show*および *ShowModal*メソッドは双方ともフォームを見えるようにする。*Show*と*ShowModal*の違いを見るために: | |
| 127 | 110 | ||
| 128 | - | ||
| 129 | - | ||
| 130 | - | ||
| 131 | - | ||
| 111 | + | - 前の例、*Form1*[[Form Tutorial/ja|2つ目のフォームを使うに]]2番目のTButtonを加え拡張する。 | |
| 112 | + | - *Button1*を選択しプロパティ*Name*を *btnShow*に、*Caption*を *Show*に変更する。 | |
| 113 | + | - *Button2*を選択しプロパティ*Name* を*btnShowModal*に、*Caption*を*ShowModal*に変更する。 | |
| 114 | + | - *OnClick*イベントを作る(もしくは、変更)し2つのボタンのイベントハンドラを以下のようにする: | |
| 132 | 115 | ||
| 133 | - | ||
| 116 | + | ``` pascal | |
| 134 | 117 | procedure TForm1.btnShowClick(Sender: TObject); | |
| 135 | - | ||
| 136 | - | ||
| 137 | - | ||
| 138 | - | ||
| 139 | - | ||
| 140 | - | ||
| 141 | - | ||
| 142 | - | ||
| 143 | - | ||
| 144 | - | ||
| 118 | + | begin | |
| 119 | + | Form2.Show; | |
| 120 | + | ShowMessage('Form2 is opened!'); | |
| 121 | + | end; | |
| 122 | + | ||
| 123 | + | procedure TForm1.btnShowModalClick(Sender: TObject); | |
| 124 | + | begin | |
| 125 | + | Form2.ShowModal; | |
| 126 | + | ShowMessage('Form2 is opened and closed again!'); | |
| 127 | + | end; | |
| 145 | 128 | ``` | |
| 146 | 129 | ||
| 147 | - | ||
| 130 | + | - 起動してその差を見よう! | |
| 148 | 131 | ||
| 149 | - | ||
| 150 | - | ||
| 132 | + | Show | |
| 151 | 133 | ||
| 152 | - | ||
| 134 | + | このプロシージャはフォームを見える状態にし、呼んだコントロール(*Form1*)のコードの実行を継続する。この例ではメッセージ、([[Dialog Examples|ShowMessage]]) はほとんど*Form2*と同時に現れる。また*Form1*を呼んで使い続けることができる。例えばそれを動かしたり、*Show*ボタンを押すことができる(しかし*ShowModal*をクリックするとエラーが発生するだろう)。 | |
| 153 | 135 | ||
| 154 | - | ||
| 155 | - | ||
| 136 | + | **`<myForm>.Show;`**を用いる代わりに、**`<myForm>.Visible:=True;`**を用いることもできる、*Show*メソッドは以下を行う: | |
| 137 | + | ||
| 138 | + | ``` pascal | |
| 156 | 139 | procedure TCustomForm.Show; | |
| 157 | - | ||
| 158 | - | ||
| 159 | - | ||
| 160 | - | ||
| 140 | + | begin | |
| 141 | + | Visible := True; | |
| 142 | + | BringToFront; | |
| 143 | + | end; | |
| 161 | 144 | ``` | |
| 162 | 145 | ||
| 163 | - | ||
| 146 | + | **`<myForm>.Show;`**と**`<myForm>.Visible:=True;`**の唯一の違いは、*Show*を用いてフォームを表示すると、現在表示されているすべての他のフォームの上に表示されることである。 | |
| 164 | 147 | ||
| 165 | - | ||
| 166 | - | ||
| 148 | + | ShowModal | |
| 167 | 149 | ||
| 168 | - | ||
| 150 | + | *ShowModal*は新しく開かれているフォーム(*Form2*)が閉じられるまで呼び出したコントロール(*Form1*)を停止させる。例では、*ShowModal*の直後の*ShowMessage*行は*Form2*が閉じた後にのみ実行される。フォームの呼び出しは固まってしまう;*Form1*を動かすこともそれが持つどのボタンも押すことができない。 | |
| 169 | 151 | ||
| 170 | - | ||
| 152 | + | ShowModalは整数値の結果を返す関数である。[[doc:lcl/forms/tmodalresult.html|TModalResultを]]参照のこと。返された値によりどのようにフォームを閉じたかを分岐できる。 | |
| 171 | 153 | ||
| 172 | 154 | ## お互いを呼び出すことのできる2つのフォーム | |
| 173 | 155 | ||
| 174 | - | ||
| 156 | + | 2番目のフォームからメインフォームを呼ぶことを避けるのは一般的に良いプログラム設計である。2番目のフォームを閉じることによって、(前の例のように)メインフォームへ戻り、メインフォームにフォーカスを返すこともより好ましい。しかしこの例が示すように、サブフォームからメインフォームを呼ぶことは可能である。 | |
| 175 | 157 | ||
| 176 | - | ||
| 158 | + | Form1がForm2を呼ぶために、Unit1はそのUses節の中にUnit2を持っていなければならない。 逆にForm2がForm1を呼ぶために、Unit2はそのUses節にUnit1を持っていなければならない。これはお互いのユニットが他のユニットを参照しあう、潜在的な循環ユニット参照コンパイラエラーにつながる。この例は循環ユニット参照エラーをどのように避けるかも示している。 | |
| 177 | 159 | ||
| 178 | - | ||
| 160 | + | この例を設定するために、前の例([[Form Tutorial/ja|2つ目のフォームを使う]])のフォームを改造する、、もしくはそれぞれが1個のボタンを持つ新しいプロジェクトを作る。Form1.Button1のキャプションを「Open Form2」、Form2.Button1のキャプションを「Open Form1」と設定する。 | |
| 179 | 161 | ||
| 180 | - | ||
| 162 | + | もし、前の例を改造するなら、Unit1のUses節から「Unit2」を除くこと。 | |
| 181 | 163 | ||
| 182 | - | ||
| 183 | - | ||
| 184 | - | ||
| 164 | + | それぞれの[[Unit|Unitの]][[Implementation|ImplementationセクションにUses]]節を加える。Unit1の節にUnit2を、Unit2の節にUnit1を加えると以下のようになる: | |
| 165 | + | ||
| 166 | + | ``` pascal | |
| 185 | 167 | unit Unit1; | |
| 186 | - | ||
| 187 | - | ||
| 188 | - | ||
| 189 | - | ||
| 190 | - | ||
| 191 | - | ||
| 192 | - | ||
| 168 | + | ... | |
| 169 | + | implementation | |
| 170 | + | ||
| 171 | + | uses | |
| 172 | + | Unit2; | |
| 173 | + | ... | |
| 193 | 174 | ``` | |
| 175 | + | ||
| 176 | + | ``` pascal | |
| 194 | 177 | unit Unit2; | |
| 195 | - | ||
| 196 | - | ||
| 197 | - | ||
| 198 | - | ||
| 199 | - | ||
| 200 | - | ||
| 201 | - | ||
| 178 | + | ... | |
| 179 | + | implementation | |
| 202 | 180 | ||
| 203 | - | ||
| 181 | + | uses | |
| 182 | + | Unit1; | |
| 183 | + | ... | |
| 204 | 184 | ``` | |
| 185 | + | ||
| 186 | + | ボタンイベントハンドラのOnClickイベント以後にあるコードを変更する: | |
| 187 | + | ||
| 188 | + | ``` pascal | |
| 205 | 189 | unit Unit1; | |
| 206 | - | ||
| 207 | - | ||
| 208 | - | ||
| 209 | - | ||
| 210 | - | ||
| 211 | - | ||
| 190 | + | ... | |
| 191 | + | procedure TForm1.Button1Click(Sender: TObject); | |
| 192 | + | begin | |
| 193 | + | Form2.Show; | |
| 194 | + | end; | |
| 212 | 195 | ``` | |
| 196 | + | ||
| 197 | + | ``` pascal | |
| 213 | 198 | unit Unit2; | |
| 214 | - | ||
| 215 | - | ||
| 216 | - | ||
| 217 | - | ||
| 218 | - | ||
| 199 | + | ... | |
| 200 | + | procedure TForm2.Button1Click(Sender: TObject); | |
| 201 | + | begin | |
| 202 | + | Form1.Show; | |
| 203 | + | end; | |
| 219 | 204 | ``` | |
| 220 | 205 | ||
| 221 | 206 | ## 他のフォームに変数を渡す | |
| 222 | 207 | ||
| 223 | - | ||
| 208 | + | 上記の例、[[Form Tutorial/ja|2つ目のフォームを使うによれば]]、Unit2のinterface部で[[Global variables|グローバル変数を]]宣言することができる。これはUnit1とUnit2の双方が同じ[[Variable|変数にアクセスすることを]]可能にする(Unit1のUses節にUnit2を置くことにより、Unit2のinterface部で宣言されたすべての変数も、Unit1で利用できるようになる)。この習慣は、どの個々の変数がスコープにあるかを記憶することが急速に困難となり、潜在的なエラーの元となるので、最小限にすべきである。[[Local variables|ローカル変数を]]使い、[[Class|Classの]]中の[[Object Oriented Programming with Free Pascal and Lazarus|プロパティを]]、あるいは別にクラスの中の変数として定義することがより好ましい。 | |
| 224 | 209 | ||
| 225 | - | ||
| 210 | + | 次のプロジェクトでは、2番目のフォームをボタンのクリックで開く。この時、メインフォームのユニットが2番目のフォームが何回表示されたかを勘定する。この2番目のフォームでボタンをクリックすることで、何回それが開かれたを見るために尋ねることができる: | |
| 226 | 211 | ||
| 227 | - | ||
| 228 | - | ||
| 212 | + | - 2つのフォームを持ち、それぞれボタンがあり、それらを評価するOnClickイベントがある新しいプロジェクト。 | |
| 213 | + | - ここで、Countという名前の整数型の[[Class]] TForm2のpublic部の変数(この場合変数の悪用として定義する[[Const|定数]])が作り出す: | |
| 229 | 214 | ||
| 230 | - | ||
| 215 | + | ``` pascal | |
| 231 | 216 | unit Unit2; | |
| 232 | - | ||
| 233 | - | ||
| 234 | - | ||
| 235 | - | ||
| 236 | - | ||
| 237 | - | ||
| 238 | - | ||
| 239 | - | ||
| 240 | - | ||
| 241 | - | ||
| 217 | + | ... | |
| 218 | + | TForm2 = class(TForm) | |
| 219 | + | Button1: TButton; | |
| 220 | + | procedure Button1Click(Sender: TObject); | |
| 221 | + | private | |
| 222 | + | { プライベート宣言 } | |
| 223 | + | public | |
| 224 | + | { パブリック宣言 } | |
| 225 | + | const Count: Integer = 0; //ここ | |
| 226 | + | end; | |
| 242 | 227 | ``` | |
| 243 | 228 | ||
| 244 | - | ||
| 229 | + | - Buttonイベントハンドラをそれに応じてカスタマイズする: | |
| 245 | 230 | ||
| 246 | - | ||
| 231 | + | ``` pascal | |
| 247 | 232 | unit Unit1; | |
| 248 | - | ||
| 249 | - | ||
| 250 | - | ||
| 251 | - | ||
| 252 | - | ||
| 253 | - | ||
| 254 | - | ||
| 233 | + | ... | |
| 234 | + | procedure TForm1.Button1Click(Sender: TObject); | |
| 235 | + | begin | |
| 236 | + | inc(Form2.Count); //Form2が呼ばれるたびにカウンタを1つ増やす | |
| 237 | + | Form2.ShowModal; | |
| 238 | + | end; | |
| 255 | 239 | ``` | |
| 240 | + | ||
| 241 | + | ``` pascal | |
| 256 | 242 | unit Unit2; | |
| 257 | - | ||
| 258 | - | ||
| 259 | - | ||
| 260 | - | ||
| 261 | - | ||
| 243 | + | ... | |
| 244 | + | procedure TForm2.Button1Click(Sender: TObject); | |
| 245 | + | begin | |
| 246 | + | ShowMessage('Form2 would be displayed '+IntToStr(Count)+' times'); | |
| 247 | + | end; | |
| 262 | 248 | ``` | |
| 263 | 249 | ||
| 264 | - | ||
| 250 | + | このようにUnit1の中でUnit2のすべてのパブリック変数/プロパティ/関数/プロシージャ(一般的なメソッド)にアクセスできる。 | |
| 265 | 251 | ||
| 266 | 252 | ## 他のフォームに関する事柄 | |
| 267 | 253 | ||
| 268 | 254 | ### もう1つのフォームをメインフォームとして使う | |
| 269 | 255 | ||
| 270 | - | ||
| 256 | + | もし起動時にしばらく異なるフォームもしくは視覚的に新しいフォームを表示させたいと決めたとすると、メインメニュー、プロジェクト -\> プロフェクトオプション -\> フォーム...を実行できる: | |
| 271 | 257 | ||
| 272 | - | ||
| 258 | + |  | |
| 273 | 259 | ||
| 274 | - | ||
| 275 | - | ||
| 260 | + | また別に、メインメニュー、プロフェクト -\> 表示(Lazarus 3.2ではここに表示 - Showというメニューはない) .lprファイル、Project.lpr(メインプログラムのPascalコード)から、最初に表示されるフォームを作ることができる: | |
| 261 | + | ||
| 262 | + | ``` pascal | |
| 276 | 263 | program Project1; | |
| 277 | - | ||
| 278 | - | ||
| 279 | - | ||
| 264 | + | ... | |
| 265 | + | Application.CreateForm(TForm2, Form2); //Form2が最初に作られ、アプリケーションが起動されるときに表示される | |
| 266 | + | Application.CreateForm(TForm1, Form1); | |
| 280 | 267 | ``` | |
| 281 | 268 | ||
| 282 | 269 | ### プログラムの終わりで形のプロパティを保存する | |
| 283 | 270 | ||
| 284 | - | ||
| 271 | + | - [[Remember form position and size|Remember form position and size#Using_TForm.SessionProperties and TXMLPropStorage]] | |
| 285 | 272 | ||
| 286 | 273 | ## 動的にフォームを作る | |
| 287 | 274 | ||
| 288 | 275 | ### Lazarusによってデザインされたフォームを動的に作る | |
| 289 | 276 | ||
| 290 | - | ||
| 277 | + | アプリケーション起動中に呼び出されるかもしれないすべてのフォームを作る必要はない。開発者によっては一般的にそれを保持せずにProject.lprから、プロジェクトに新しくフォームを挿入するときに自動的に生成されたコードを削除する。もし、いくつかのGUIを含むライブラリを書きたいとすると、フォームの動的生成を避けては通れない。 | |
| 291 | 278 | ||
| 292 | - | ||
| 279 | + | 例: | |
| 293 | 280 | ||
| 294 | - | ||
| 295 | - | ||
| 296 | - | ||
| 297 | - | ||
| 281 | + | - 2つのフォームを持つ新しいアプリケーション、Form1にはボタン(「Unit2」を加える、Uses節にUnit1) | |
| 282 | + | - open the Project.lpr (プロジェクト -\> lprファイル (注)先にあるように現在このメニューはない、lprファイルを開きたいときは、ファイル -\> 開く...から) | |
| 283 | + | - 「Application.CreateForm(TForm2, Form2);」行を削除 | |
| 284 | + | - Form1、Button1のOnClickイベントに以下のコードを追加する: | |
| 298 | 285 | ||
| 299 | - | ||
| 286 | + | ``` pascal | |
| 300 | 287 | procedure TForm1.Button1Click(Sender: TObject); | |
| 301 | - | ||
| 302 | - | ||
| 303 | - | ||
| 304 | - | ||
| 305 | - | ||
| 288 | + | begin | |
| 289 | + | Form2:=TForm2.Create(Nil); //Form2が生成される | |
| 290 | + | Form2.ShowModal; //Form2が表示される | |
| 291 | + | FreeAndNil(Form2); //Form2解放 | |
| 292 | + | end; | |
| 306 | 293 | ``` | |
| 307 | 294 | ||
| 308 | - | ||
| 295 | + | - 単純に起動 | |
| 309 | 296 | ||
| 310 | 297 | ### 新しいフォームを動的に生成する | |
| 311 | 298 | ||
| 312 | - | ||
| 299 | + | 以下はフォームデザイナを使わずにコードで新しいフォームを生成する例を示している。 | |
| 313 | 300 | ||
| 314 | - | ||
| 301 | + | この例ではボタンをクリックすることで、自身にボタンを含むもう1つのフォームが開くはずである。この2番目のボタンをクリックするとフォームを閉じると警告が出て、フォームが閉じられる。 | |
| 315 | 302 | ||
| 316 | - | ||
| 317 | - | ||
| 303 | + | - 1つのフォームと1つのボタンを持つ新しいアプリケーションを作る | |
| 304 | + | - Form1、Button1のOnClickイベントに以下のコードを加える: | |
| 318 | 305 | ||
| 319 | - | ||
| 306 | + | ``` pascal | |
| 320 | 307 | procedure TForm1.Button1Click(Sender: TObject); | |
| 321 | - | ||
| 322 | - | ||
| 323 | - | ||
| 324 | - | ||
| 325 | - | ||
| 326 | - | ||
| 327 | - | ||
| 328 | - | ||
| 329 | - | ||
| 330 | - | ||
| 331 | - | ||
| 332 | - | ||
| 333 | - | ||
| 334 | - | ||
| 335 | - | ||
| 336 | - | ||
| 337 | - | ||
| 338 | - | ||
| 339 | - | ||
| 340 | - | ||
| 308 | + | var | |
| 309 | + | MyForm: TForm; | |
| 310 | + | MyButton: TButton; | |
| 311 | + | begin | |
| 312 | + | MyForm:=TForm.Create(nil); | |
| 313 | + | MyForm.SetBounds(100, 100, 220, 150); | |
| 314 | + | MyForm.Caption:='My dynamic created form'; | |
| 341 | 315 | ||
| 342 | - | ||
| 316 | + | MyButton:=TButton.create(MyForm); | |
| 317 | + | MyButton.Caption:='Close my form'; | |
| 318 | + | MyButton.SetBounds(10, 10, 200, 30); | |
| 319 | + | MyButton.Parent:=MyForm; | |
| 343 | 320 | ||
| 344 | - | ||
| 321 | + | MyButton.OnClick:=@MyButtonClick; | |
| 345 | 322 | ||
| 323 | + | MyForm.ShowModal; | |
| 324 | + | ||
| 325 | + | FreeAndNil(MyForm); | |
| 326 | + | end; | |
| 346 | 327 | ``` | |
| 328 | + | ||
| 329 | + | > **Note:** もしコンポーネントが所有者(TButton.Create(Owner: TComponent))から生成されると、それはコンポーネントを解放する責任のある所有者に属する。そのため、MyButtonはMyFormを解放することによって自動的に解放される。 | |
| 330 | + | ||
| 331 | + | - ここでMyButton.OnClickに対するイベントハンドラ、MyButton.OnClickが生成されなければならない。これを終了させるため、class TForm1のprivateセクションに以下のプロシージャ宣言を書くこと: | |
| 332 | + | ||
| 333 | + | ``` pascal | |
| 347 | 334 | TForm1 = class(TForm) | |
| 348 | - | ||
| 349 | - | ||
| 350 | - | ||
| 351 | - | ||
| 335 | + | ... | |
| 336 | + | private | |
| 337 | + | { private declarations } | |
| 338 | + | procedure MyButtonClick(Sender: TObject); | |
| 352 | 339 | ``` | |
| 353 | 340 | ||
| 354 | - | ||
| 341 | + | - `Ctrl]`+`Shift`+`C` (コード補完)を押し、ハンドラ実装として以下を挿入すること: | |
| 355 | 342 | ||
| 356 | - | ||
| 343 | + | ``` pascal | |
| 357 | 344 | procedure TForm1.MyButtonClick(Sender: TObject); | |
| 358 | - | ||
| 359 | - | ||
| 360 | - | ||
| 361 | - | ||
| 362 | - | ||
| 345 | + | begin | |
| 346 | + | Showmessage('Attention, closing my dynamically created form!'); | |
| 347 | + | if Sender is TButton then | |
| 348 | + | TForm(TButton(Sender).Parent).Close; | |
| 349 | + | end; | |
| 363 | 350 | ``` | |
| 364 | 351 | ||
| 365 | - | ||
| 352 | + | - ここでプロジェクトがコンパイルされ、実行できる。 | |
| 366 | 353 | ||
| 367 | 354 | ## 以下も参照のこと | |
| 368 | 355 | ||
| 369 | - | ||
| 370 | - | ||
| 371 | - | ||
| 372 | - | ||
| 373 | - | ||
| 374 | - | ||
| 375 | - | ||
| 376 | - | ||
| 377 | - | ||
| 356 | + | - [[LCL Tips|Tips for manual generation of controls]] | |
| 357 | + | - [[LCL Tips|Example to create a complete GUI application by code]] | |
| 358 | + | - [[Testing, if form exists]] | |
| 359 | + | - [[Canvas draw vertical line on form/de]] | |
| 360 | + | - [[Drawing with canvas]] on form | |
| 361 | + | - [[user should not be able to close form]] | |
| 362 | + | - [[LCL Tips|Creating a non-rectangular window or control]] | |
| 363 | + | - [[Remember form position and size]] | |
| 364 | + | - [[Form in DLL]] | |
| 378 | 365 | ||
| 379 | 366 | --- | |
| 380 | - | ||
| 367 | + | *From the Free Pascal wiki, page "Form Tutorial/ja", as it stood on 2024-03-25 after a change by Ariben, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).* |
