ウィキのコピーミラー

これは pascal.chat のウィキのミラーです。編集、履歴、ログインはそちらで行います。

TMainMenu/ja

Deutsch · English · Français · Suomi · Русский · 日本語

>> LCL Components >> TMainMenu

TMainMenu はフォームでメインメニューを提供するコンポーネントパレットのStandardタブからの見ることのできないコンポーネントである。

概要

フォームを設計するときに様々なメニューアイテムによって選ばれる、ほとんどのウインドウの先頭に現れるメインメニューである。

メニューエディタを見るにはフォームのメインメニューアイコンを右クリックすること。

約束事

mnu、menuで始まる、あるいはmenuのそのものをメニュー(menu)と名付けるのは一般的な慣習である。サブメニューがそれに含まれるメニューのプリフィクスとともに続く。例えば、「編集(Edit)」にある「切り取り(Cut)」サブメニューはたいていmnuEditCutもしくは、menuEditCutと名付けられる。これは今から6か月後に変更する必要が生じたときに、それらを中に入れる仕方の記憶を助け、覚えやすいが、慣習であり、強制ではないことに注意すること。しかし、このようにすることは後々変更したり、しばらくコードを見ていないときに、あるいは、書かれたプログラムをメンテナンスしなければならない、誰かほかの人間にとって、おそらくそれが何をしているかを理解する手助けになるだろう。

始めてみよう

メニューを作成する

  1. コンポーネントバーからTMainMenuを選び、フォーム上でそれをクリックするが、マウスボタンは離さずに押したまま、箱を描いてマウスボタンを離す。そのコンポーネントがフォームに現れるだろう。これはドロップダウンメニューとデフォルトのコンポーネント名がMainMenu1となった四角形が現れるだろう。
  2. もしMainMenu1と言う名前が気に食わなければ、オブジェクトインスペクタウィンドウに移動して、よりよいと考えるものにNameプロパティを変更する。ここではXMenuに変更する。Nameプロパティの左の箱にXMenuとタイプして、エンターを押す。コンポーネントの名前が変更される。
  3. XMenuを右クリックすると、ポップアップメニューが現れる。ここで、必要なのは最初のセクション、Menu Editorである。それをクリックする。
  4. Menu Editorウィンドウが「New Item1」のキャプションを持つ、すでに作られたメニューアイテムが開く。いつも見ている「ファイル 編集 表示 ヘルプ」のトップレベルメニューとなり、おそらくこれを変更したいだろう。そのためにはクリックし、オブジェクトインスペクタに移動する。
  5. オブジェクトインスペクタでNameプロパティをMenuItem1からよりふさわしいものに変更する。これをFileメニューと呼ぶことにする。そこでmnuFileとタイピングし、エンターを押すことでこれを変更する。
  6. New Item1よりも良い名前が欲しいので、Captionプロパティに移動し、&Fileとタイプし、エンターを押す。名前の前のアンパサンド&はAltキーと下線が引かれたキーを押すことにより、メニューを開くことのできるアクセラレータである。このメニューに対するキャプションをFileへと変更する。この時点で、1つのトップレベルメニュを加えたことになる。
  7. Menu Editorウインドウに戻る。Fileをクリックし、次に右クリックする。ポップアップメニューが現れる。Insert New Item Afterをクリックし、New Item2という名前の新しいメニューが現れる。2つのアイテムですでに説明したように、オブジェクトインスペクタでその名前をmnuHelp、この名前をmnuHelp、キャプションを&Helpに変更する。
  8. これをFileの下のメニューアイテムにする。右クリックし、Create Submenuをクリックする。ファイルメニューは矢印を持ち、# New Item2という名前のサブメニューが現れる。

これをそれが行う何かに関連したものに変更する、ここでは「開く」ということにする。オブジェクトインスペクタに移動し、NameプロパティをmnuFileOpen、キャプションを&Openに変更する。

  1. トップレベルメニューFileとHelpの間にまたトップレベルメニューが必要である。Fileを右クリックし、Insert New Item (after)するか、Helpを右クリックし、Insert New Item (before)をクリックすることができる。
  2. このアイテムのプロパティをオブジェクトインスペクタでmnuEditへ変更する。
  3. 必要なら、それぞれのメニューとサブメニューに応じて上記を繰り返す。

これで、すべてが実行時に表示され、ユーザーはメニューをクリックすることができる。これは実際には何もしない。メニューアイテムに何かをさせるときは、クリックされると反応することになっている、それぞれのメニューとサブメニューにeventsを加えなければならない。通常はトップレベルメニューは反応しないが、サブメニューは反応する。メニューの反応のさせ方に2つの選択肢があり、メニューの中にイベントを挿入するか、あるいはTActionListコンポーネントを用いることもできる。TActionListを用いる主な理由はもし、ツールバーにアイコンを加えるつもりがあるならば、まず、「ファイル」そして、「開く」、「保存」、「名前をつけて保存」、「閉じる」などのメニューをサブメニューとして持ち、同様にツールバーに「新規」、「開く」、「保存」、「名前をつけて保存」ボタンがあるツールバーを持つことになる。「新規」、「開く」機能を扱う2つのルーチンを書くより、メニューとツールバー双方にTActionListを持つ。TActionListを使う仕方はほかに譲る。当面はオブジェクトエクスプローラでイベントを用いての、メニュークリックを扱う仕方を説明する。

実際に何かをするメニューを作成する

  1. Menu Editorウインドウに戻り、File以下にあるサブメニューOpenをクリックする。オブジェクトインスペクタウインドウに行き、Eventsタブをクリックする。変えたいイベント何もないはOnClickのみである。あると好ましい、存在するイベントハンドラを持っているならば、用いることができるが、それはないため、Lazarusにそれを作らせることができる。3つのボタンの右に3つのドット(...)がある。これをクリックすると、新しいプロシージャがコードの中に生成され、コードウインドウにヴューが切り替わる。これは以下のように見えるだろう。
pascal
procedure TfrmMain.mnuFileOpenClick(Sender: TObject);
begin
end;
  1. beginとendステートメントの間にメニューのオープンアクションを書くだろう。これはフォーム上のDaialogs tabからTOpenDialogコントロールを配置するかもしれない。同様のことが Save、Save asサブメニューを持つと適用される。
  2. どのようにしてメニューとサブメニューを加えるかについて上で言及した点を繰り返すことになり、それぞれはユーザーによってクリックされる1つ1つについて必要ならばイベントハンドラを作るだろう。

チェックボックスメニュー

さて、チェックボックスが欲しくなったかもしれない、ユーザーがクリックするとそれはチェックマークがついたり、消えたりする。これを行う方法を議論する。

  1. Menu Editorウインドウに移り、Editをクリックする。
  2. Editの下にメニューアイテムを作ろう。右クリックし、 Create Submenuをクリックし、オブジェクトインスペクタウインドウで、もしすでに選択されていなければ、プロパティタブをクリックする。このサブメニューをmnuEditPreserveと名づけキャプションをP&reserve caseとする(コピーアンドペーストが通常ALT+PとALT+Cを使うので、このサブメニューにはALT+Rを使う。これが「r」の前にアンパサンドを置いた理由である)。
  3. デフォルト値、チェック(checked)をFalseにする. もしこのメニューのデフォルト状態がチェックなら、値をダブルクリックしてFalseからTrueに変えること。
  4. Eventsタブを選択して、Clickプロパティを選び、...ボタンをクリックする。
  5. Lazarus はコードウインドウに切り替わり、このサブメニューに対してClickイベントを生成する。
  6. beginとendのあいだでには、以下のような一行のみを記入すればよい:
  7. mnuEditPreserve.checked := not mnuEditPreserve.checked ;
  8. これが値をチェックからアンチェックに切り替える。コードの中でこのチェックされたメニューを使うことができるようにするにはmnuEditPreserve.checkedを参照すればよい (もしくはメニューの名前が何であれ、プロパティがcheckedのもの)。それはほかのどのBoolean 値に関しても同様である。

セパレータ

時には線で区切られている項目を持つメニューが必要な時がある。例えば、EditメニューはCut、Copy、Pasteサブメニューを持ち、次のサブメニューの前にセパレータラインを持つかもしれない。セパレータラインを作るには、もう1つのサブメニューを作り、キャプションが1つのダッシュ(-)からなるようにすればよい。

ショートカット

もし望むのであれば、メニューに対して特定のキーの組み合わせを割り当てることができる、以下の手順である:

メニューの前の画像

もしメニューを視覚的に際立たせたい、あるいは可能なツールバーに対するメニュー項目の光学マッピングを確立したいのなら、メニューの前に画像を表示させることができる。以下の手順が必要である:

問題: 左側にサブメニューがドロップダウンする(Windows Vista、7、10)

もし、プルダウンメニューがメインメニューアイテムの右に並び、サブメニューが左に開いたら、それはWindowsがTablet PC SettingsでRight-handed(右利き)に設定されている。これはタブレットを用い、画面で記入/押す、でメニューが直接的に表示されるときにおこる。もし右利きなら、メニューを左側に表示したいかもしれない。そうするとメニューは手の下側に現れない。通常のPC操作ではこれをデフォルトで左利きに設定されている。 以下を行うことでこれを確かめることができる:

ランタイムを作成する

ランタイムにTMainMenuを作るためには、フォームの所有者をTMainMenuに指定するべきである。

pascal
  mnuMainMain = TMainMenu.Create(Form1);

(注意、親を指定することは不要であり、アプリケーションを所有者として指定することは望んだ効果が得られない)

以下も参照のこと


From the Free Pascal wiki, page "TMainMenu/ja", as it stood on 2024-03-20 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.

第2版、最終更新:WikiArchive 。