TPopupMenu/ja
│
Deutsch (de) │
English (en) │
suomi (fi) │
français (fr) │
日本語 (ja) │
русский (ru) │
TPopupMenu はマウスの右ボタンがクリックされるとポップアップするメニューパネルである。
これは目に見えないコンポーネントで、即ち、もしコンポーネントパレットのStandardタブから選ばれ、フォームの上に置かれたとき、ランタイムに現れない。その代わり、メニューエディタによって構造定義されたメニューバーが現れる。
Menu Editorを見るには、Main Menuアイコンをフォーム上で右クリックする。
ポップアップメニューを作る
以下の道筋で、Formコンポーネントにポップアップメニューの追加の仕方を示す:
- 新しいGUIアプリケーションを作り、TImageをそのフォームに挿入する。このため、コンポーネントパレットAdditionalでTImageを選択し、フォームの上でクリックする。これでImage1の名前でTImageがフォーム上に配置される。
- オブジェクトインスペクタに移動(Image1であるはずだ)し、Alignプロパティを選択する。隣のコンボボックスでalClientを1列に調節する(Image1はフォームのサイズに調節される)。
- フォームの上にTPopupMenu(stanndardタブ)を配置する(もし可能なら「Image1」上に、そうすればこれが画像に1つとわかる)。コンポーネントPopupMenu1は(ドロップダウンメニューとコンポーネントの名前の表示と直角に)フォーム上に表示される。
- 「PopupMenu1」を右クリックすると、ポップアップメニューが現れる。最初の項目 Menu Editorをクリック
- New Item1のキャプションでメニューアイテムがすでに作られており、メニューエディタウィンドウで開く。おそらくこれを変更したいだろう、そのためにはクリックし、オブジェクトインスペクタに移動する。
- オブジェクトインスペクタでMenuItem1から何かふさわしい名前にするためNameプロパティを変更する。これをLoadメニューと呼ぶことにする。そこでNameをpopLoadとタイプし、エンターを押す。
- New Item1より、ましなものとしたい、そこでCaptionプロパティに行きLoadとタイプし、エンターを押す。
- さらにもう1つの入力項目がある。メニューエディタウインドウに戻り、Loadを右クリックする。ポップアップメニューが現れる。
- Insert New Item Afterをクリックすると、New Item2という名前の新たなメニューが現れる。前の2つのアイテムで説明した通り、この名前をpopStretch、キャプションをStretchedへとオブジェクトインスペクタで変更する。
- メニューへの入り口を忘れていることに気づくが、悪いことではない、メニューエディタに戻る。Loadを右クリックするか、Insert New Item (after)をクリック、またはStretchedで右クリックし、Insert New Item (before)をクリックする。
- キャプションをCentered名前をpopCenter変更する。
- 必要なそれぞれのメニューアイテムが終端で閉じるようにメニューエディタで調節する。
- すべてのメニューを加えたとき、どのコンポーネントが結び付くべきかまだ設定しなければならない。この場合、これはフォームに最初に配置したTImage、Image1であるべきである。
- フォーム上のImage1を選択し、オブジェクトインスペクタのプロパティPopupMenuへ移動する。そこで、隣のコンボボックスのPopupMenu1を選択する。
- 実行中は画像を右クリックするといつもポップアップメニューが現れるだろう。
これで実行中メニューが現れ、ユーザーがメニューをクリックすることが可能となる。これは実際何もしない。何かをするメニューアイテムを作るには、それぞれのメニューについてクリックに反応するeventsを加えなければならない。
以下にオブジェクトインスペクタを用いてメニュークリックイベントの編集の仕方を説明する。
実際に何かをするメニューを作る
- メニューエディタにもどり、クリックしてLoadメニューアイテムをクリックして選択する。そしてオブジェクトインスペクタウインドウへ移動し、eventsタブを選択する。変えたいイベントだけを変える、それは今、空のOnClickである。もし用いるべきEventHandlerをすでに持っているなら、それらを使うことができるし、それに応じて選択することもできる、さもなくば、Lazarusで作ることもできる。右側に3つの点があるボタンがある。クリックする。そうすると新しいプロシージャ(新しく生成したイベントハンドラ)がコードの中に生成され、ソーステキストエディタに対する変化が見て取れる。このプロシージャはこのように見えるだろう:
procedure TForm1.popLoadClick(Sender: TObject);
begin
end;
- beginとend間にメニューエントリLoadに対するコードを挿入することができる。
この場合フォームの上にTOpenDialogコントロールを挿入し、この目的ンために標準ダイアログを使うことができるだろう:
- そのため、TOpenDialogコントロールをフォームに入れ(コンポーネントパレット ダイアログ)、その名前はOpenDialog1である。プロシージャを以下に変更する:
procedure TForm1.popLoadClick(Sender: TObject);
begin
if OpenDialog1.Execute then //ファイルが選択された場合のみ
try //try
Image1.Picture.LoadFromFile(OpenDialog1.Filename); //そのファイルを読み込む
except
end;
end;
- 他のメニューアイテムも同様のプロシージャで、それぞれのイベントハンドラを作り、以下のコードを挿入する:
procedure TForm1.popStretchClick(Sender: TObject);
begin
popStretch.Checked := not popStretch.Checked; //マーク/チェック on/off
Image1.Stretch := popStretch.Checked; //Image1 引き伸ばし yes/no
end;
procedure TForm1.popCenterClick(Sender: TObject);
begin
popCenter.Checked := not popCenter.Checked; //マーク/チェック on/off
Image1.Center := popCenter.Checked; //Image1 中央配置 yes/no
end;
- これで、このサンプルをF9で実行し、右クリックでポップアップメニューが開き、Loadをクリックする。すると選んだ画像が読み込まれる。画像を取り込んだら、他のメニューエントリを試してみよう。
自己ポップアップ
特定のコンポーネント、異なるイベントでは右クリックでポップアップを表示させたくない場合があるかもしれない。その時はPopupMenu.PopUp
を実行することができる。
簡単な例:
- 新しいGUI application/jaを作り、そのフォームにTPopupMenu PopupMenu1とTButton Button1を加える。
- 新しいメニューエントリPopupMenu1 (Creating a PopupMenuを見ること)。
- Button1のOnClickイベントを作成し、以下のコードを書く:
procedure TForm1.Button1Click(Sender: TObject);
begin
PopupMenu1.PopUp; //ポップアップメニューを表示
end;
- プログラムを実行すると、ボタンをクリックすることにより、ポップアップメニューが呼ばれる。
ポップアップメニューの結果
同じポップアップメニューは、ポップアップの呼び出し元を取り戻すため、PopupComponentを用いて複合コントロールにより使うことができる。
...
Uses
... Clipbrd...
procedure TfrmIniPrevMain.pmnuMenuItem1Click(Sender: TObject);
begin
if pmnuMenuItem1.PopupComponent.ClassType = TMemo then
begin
Clipboard.AsText := TMemo(pmnuClipBoard.PopupComponent).Text;
end;
if pmnuClipBoard.PopupComponent.ClassType = TEdit then
begin
Clipboard.AsText := TEdit (pmnuClipBoard.PopupComponent).Text;
end;
end;
以下も参照のこと