Delphiのメニューに項目を動的に追加する
ちょっと色々なことをやろうとして混乱中だ。
拙作のシステム手帳リフィル印刷ソフト『我備帖』に幾つかリフィルを追加したのだが、それがほとんどの人には不要な機能なのだ。
そこで、それらを外部に切り出し、必要な人だけが機能追加できるようにしたいと思い、試行錯誤を繰り返している。
ということで、今まで一度も使ったことのないDLL呼び出しに挑戦中なのだ。
追加機能をDLLに分離し、我備帖はDLLがあればその機能をメインメニューに登録する。
でも、これがなかなか大変。目途がついたところから、備忘録としてここに書いて行こうかと思う。
で、まず、Delphiのメインメニューに動的に項目を追加する方法だ。
procedure TForm1.AddMenuItem; var mi :TMenuItem; method: TMethod; begin method.Code := @TheMethod; // 実行したい機能のポインタ method.Data := Pointer(TheParameter); // 引数のポインタ mi :=TMenuItem.Create(Self); mi.Caption := 'メニューの見出し'; mi.Name := 'AddedMenuName'; mi.OnClick := TNotifyEvent(method); //イベントの動的割り当て MainMenu.Items[0].Insert(0, mi); //メニューに挿入 end;
と、こんな感じか。
MainMenu.Items[0].Insert(0, mi) がミソで、"0″を変えれば追加項目をメニューの任意の場所に挿入することができる。最後に追加するだけなら、MainMenu.Items.Add(mi) でよい。ほぼ同様の手順でポップアップメニューへの項目追加も可能だ。
実際のコードでは、DLLを検索し、登録されている関数を読み込んでメニューのOnClickに関連づけることになる。その辺はまた今度。