Sign in Join
Wiki copytemporary

Form Tutorial/ja: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: Form Tutorial/ja

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

Back to history