TMainMenu/ja
│
Deutsch (de) │
English (en) │
suomi (fi) │
français (fr) │
日本語 (ja) │
русский (ru) │
>> LCL Components >> TMainMenu
TMainMenu はフォームでメインメニューを提供するコンポーネントパレットのStandardタブからの見ることのできないコンポーネントである。
概要
フォームを設計するときに様々なメニューアイテムによって選ばれる、ほとんどのウインドウの先頭に現れるメインメニューである。
メニューエディタを見るにはフォームのメインメニューアイコンを右クリックすること。
約束事
mnu、menuで始まる、あるいはmenuのそのものをメニュー(menu)と名付けるのは一般的な慣習である。サブメニューがそれに含まれるメニューのプリフィクスとともに続く。例えば、「編集(Edit)」にある「切り取り(Cut)」サブメニューはたいていmnuEditCutもしくは、menuEditCutと名付けられる。これは今から6か月後に変更する必要が生じたときに、それらを中に入れる仕方の記憶を助け、覚えやすいが、慣習であり、強制ではないことに注意すること。しかし、このようにすることは後々変更したり、しばらくコードを見ていないときに、あるいは、書かれたプログラムをメンテナンスしなければならない、誰かほかの人間にとって、おそらくそれが何をしているかを理解する手助けになるだろう。
始めてみよう
メニューを作成する
- コンポーネントバーからTMainMenuを選び、フォーム上でそれをクリックするが、マウスボタンは離さずに押したまま、箱を描いてマウスボタンを離す。そのコンポーネントがフォームに現れるだろう。これはドロップダウンメニューとデフォルトのコンポーネント名がMainMenu1となった四角形が現れるだろう。
- もしMainMenu1と言う名前が気に食わなければ、オブジェクトインスペクタウィンドウに移動して、よりよいと考えるものにNameプロパティを変更する。ここではXMenuに変更する。Nameプロパティの左の箱にXMenuとタイプして、エンターを押す。コンポーネントの名前が変更される。
- XMenuを右クリックすると、ポップアップメニューが現れる。ここで、必要なのは最初のセクション、Menu Editorである。それをクリックする。
- Menu Editorウィンドウが「New Item1」のキャプションを持つ、すでに作られたメニューアイテムが開く。いつも見ている「ファイル 編集 表示 ヘルプ」のトップレベルメニューとなり、おそらくこれを変更したいだろう。そのためにはクリックし、オブジェクトインスペクタに移動する。
- オブジェクトインスペクタでNameプロパティをMenuItem1からよりふさわしいものに変更する。これをFileメニューと呼ぶことにする。そこでmnuFileとタイピングし、エンターを押すことでこれを変更する。
- New Item1よりも良い名前が欲しいので、Captionプロパティに移動し、&Fileとタイプし、エンターを押す。名前の前のアンパサンド&はAltキーと下線が引かれたキーを押すことにより、メニューを開くことのできるアクセラレータである。このメニューに対するキャプションをFileへと変更する。この時点で、1つのトップレベルメニュを加えたことになる。
- Menu Editorウインドウに戻る。Fileをクリックし、次に右クリックする。ポップアップメニューが現れる。Insert New Item Afterをクリックし、New Item2という名前の新しいメニューが現れる。2つのアイテムですでに説明したように、オブジェクトインスペクタでその名前をmnuHelp、この名前をmnuHelp、キャプションを&Helpに変更する。
- これをFileの下のメニューアイテムにする。右クリックし、Create Submenuをクリックする。ファイルメニューは矢印を持ち、# New Item2という名前のサブメニューが現れる。
これをそれが行う何かに関連したものに変更する、ここでは「開く」ということにする。オブジェクトインスペクタに移動し、NameプロパティをmnuFileOpen、キャプションを&Openに変更する。
- トップレベルメニューFileとHelpの間にまたトップレベルメニューが必要である。Fileを右クリックし、Insert New Item (after)するか、Helpを右クリックし、Insert New Item (before)をクリックすることができる。
- このアイテムのプロパティをオブジェクトインスペクタでmnuEditへ変更する。
- 必要なら、それぞれのメニューとサブメニューに応じて上記を繰り返す。
これで、すべてが実行時に表示され、ユーザーはメニューをクリックすることができる。これは実際には何もしない。メニューアイテムに何かをさせるときは、クリックされると反応することになっている、それぞれのメニューとサブメニューにeventsを加えなければならない。通常はトップレベルメニューは反応しないが、サブメニューは反応する。メニューの反応のさせ方に2つの選択肢があり、メニューの中にイベントを挿入するか、あるいはTActionListコンポーネントを用いることもできる。TActionListを用いる主な理由はもし、ツールバーにアイコンを加えるつもりがあるならば、まず、「ファイル」そして、「開く」、「保存」、「名前をつけて保存」、「閉じる」などのメニューをサブメニューとして持ち、同様にツールバーに「新規」、「開く」、「保存」、「名前をつけて保存」ボタンがあるツールバーを持つことになる。「新規」、「開く」機能を扱う2つのルーチンを書くより、メニューとツールバー双方にTActionListを持つ。TActionListを使う仕方はほかに譲る。当面はオブジェクトエクスプローラでイベントを用いての、メニュークリックを扱う仕方を説明する。
実際に何かをするメニューを作成する
- Menu Editorウインドウに戻り、File以下にあるサブメニューOpenをクリックする。オブジェクトインスペクタウインドウに行き、Eventsタブをクリックする。変えたいイベント何もないはOnClickのみである。あると好ましい、存在するイベントハンドラを持っているならば、用いることができるが、それはないため、Lazarusにそれを作らせることができる。3つのボタンの右に3つのドット(...)がある。これをクリックすると、新しいプロシージャがコードの中に生成され、コードウインドウにヴューが切り替わる。これは以下のように見えるだろう。
procedure TfrmMain.mnuFileOpenClick(Sender: TObject);
begin
end;
- beginとendステートメントの間にメニューのオープンアクションを書くだろう。これはフォーム上のDaialogs tabからTOpenDialogコントロールを配置するかもしれない。同様のことが Save、Save asサブメニューを持つと適用される。
- どのようにしてメニューとサブメニューを加えるかについて上で言及した点を繰り返すことになり、それぞれはユーザーによってクリックされる1つ1つについて必要ならばイベントハンドラを作るだろう。
チェックボックスメニュー
さて、チェックボックスが欲しくなったかもしれない、ユーザーがクリックするとそれはチェックマークがついたり、消えたりする。これを行う方法を議論する。
- Menu Editorウインドウに移り、Editをクリックする。
- Editの下にメニューアイテムを作ろう。右クリックし、 Create Submenuをクリックし、オブジェクトインスペクタウインドウで、もしすでに選択されていなければ、プロパティタブをクリックする。このサブメニューをmnuEditPreserveと名づけキャプションをP&reserve caseとする(コピーアンドペーストが通常ALT+PとALT+Cを使うので、このサブメニューにはALT+Rを使う。これが「r」の前にアンパサンドを置いた理由である)。
- デフォルト値、チェック(checked)をFalseにする. もしこのメニューのデフォルト状態がチェックなら、値をダブルクリックしてFalseからTrueに変えること。
- Eventsタブを選択して、Clickプロパティを選び、...ボタンをクリックする。
- Lazarus はコードウインドウに切り替わり、このサブメニューに対してClickイベントを生成する。
- beginとendのあいだでには、以下のような一行のみを記入すればよい:
- mnuEditPreserve.checked := not mnuEditPreserve.checked ;
- これが値をチェックからアンチェックに切り替える。コードの中でこのチェックされたメニューを使うことができるようにするには
mnuEditPreserve.checked
を参照すればよい (もしくはメニューの名前が何であれ、プロパティがcheckedのもの)。それはほかのどのBoolean 値に関しても同様である。
セパレータ
時には線で区切られている項目を持つメニューが必要な時がある。例えば、EditメニューはCut、Copy、Pasteサブメニューを持ち、次のサブメニューの前にセパレータラインを持つかもしれない。セパレータラインを作るには、もう1つのサブメニューを作り、キャプションが1つのダッシュ(-)からなるようにすればよい。
ショートカット
もし望むのであれば、メニューに対して特定のキーの組み合わせを割り当てることができる、以下の手順である:
- メニューエディタでキーボードショートカットを割り当てるメニューを選択する。
- オブジェクトインスペクタでプロパティ、ShortCutに移動し[...]ボタンをクリックする。
- メニューに望むショートカットを選択できるウインドウが現れる。
- メニューのランタイムイベントハンドラはこのショートカットをこのメニューをクリックしたしたかのように呼び出す。
メニューの前の画像
もしメニューを視覚的に際立たせたい、あるいは可能なツールバーに対するメニュー項目の光学マッピングを確立したいのなら、メニューの前に画像を表示させることができる。以下の手順が必要である:
- フォームにイメージリストを追加する。これはコンポーネントパレットCommon Controlsで見つけられる。TImageListを選択し、Form上にクリックして配置する。ImageList1という名のこれでイメージリストがフォーム上に生成される。これらのイメージリストはメニューの前に表示されるすべてのシンボルや画像を含んでいる。
- ImageList1を右クリックし、ImageList Editorを開く。
- メニューに必要なすべての画像をImageListに次々に加える。単にボタンAddをクリックし、相応しい画像をいつも通り加える。
- ImageListに必要とされるすべての画像をすべての画像を加えたら、[OK]ボタンで選択を確認し、ImageList Editorを閉じる。
- そして、MainMenuを選択しなければならず、オブジェクトインスペクタでImageListにプロパティImagesを設定する。単に隣のコンボボックスでImageList ImageList1を選択する。
- そして、メニューエディタでメニューを再び開き、画像を得たいメニューを選択する。
- メニューからオブジェクトインスペクタのImageIndexプロパティへ移動し隣のコンボボックスに表示されている画像を選択する。
- Menu Editorで次のメニューを選択し、それに対応する画像を選択する。など。
問題: 左側にサブメニューがドロップダウンする(Windows Vista、7、10)
もし、プルダウンメニューがメインメニューアイテムの右に並び、サブメニューが左に開いたら、それはWindowsがTablet PC SettingsでRight-handed(右利き)に設定されている。これはタブレットを用い、画面で記入/押す、でメニューが直接的に表示されるときにおこる。もし右利きなら、メニューを左側に表示したいかもしれない。そうするとメニューは手の下側に現れない。通常のPC操作ではこれをデフォルトで左利きに設定されている。 以下を行うことでこれを確かめることができる:
- Window-key + Rを押す。
- shell:::{80F3F1D5-FECA-45F3-BC32-752C152E456E}を入力しエンターを押す。
- Other(その他)タブに移動する。
- デフォルトがLeft-handed(左利き)に設定されるべきで、メニューが右に現れるようになっており、さもなくば左に現れる。
- 注意: 設定にかかわらずサブメニューの矢印はそれでもメニューの右側に現れるだろう。
ランタイムを作成する
ランタイムにTMainMenuを作るためには、フォームの所有者をTMainMenuに指定するべきである。
mnuMainMain = TMainMenu.Create(Form1);
(注意、親を指定することは不要であり、アプリケーションを所有者として指定することは望んだ効果が得られない)
以下も参照のこと