Äèíàìè÷åñêîå äîáàâëåíèå ïóíêòîâ ìåíþ

Ïðèìåð ïðîãðàììû, ñîçäàþùåé ñòðóêòóðó ìåíþ áîëüøîé âëîæåííîñòè äâóìÿ ðàçëè÷íûìè ñïîñîáàìè. Îíà äàñò âàì ïèùó äëÿ ðàçìûøëåíèé. Ôîðìà ñîäåðæèò êîìïîíåíò MainMenu.

unit Istopmnu;

interface

uses
  Windows, SysUtils, Messages, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Menus;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    procedure AClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.AClick(Sender: TObject);
var
  TM: TMenuItem;
  Lev: Word;
begin
  MessageBeep(0);
  TM := Sender as TMenuItem;
  if TM.Count > 0 then Caption := 'ïîäìåíþ'
  else Caption := 'ýëåìåò ìåíþ';
  Caption := Caption + ' ñ èìåíåì "' + TM.Name + '"';
  Lev := 0;
  while (TM.Parent <> NIL) and (TM.Parent is TMenuItem) do begin
    TM := TM.Parent;
    Inc(Lev);
  end;
  case Lev of
    1: Caption := 'Âåðõíèé óðîâåíü ' + Caption;
    2: Caption := '2-é óðîâåíü ' + Caption;
    3: Caption := '3-é óðîâåíü ' + Caption;
  else Caption := Format('%d-é óðîâåíü %s', [Lev, Caption]);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  TM: TMenuItem;
  N: Integer;
begin
  TM := MainMenu1.Items;
  TM.Add(NewItem('&Ýëåìåíò', 0, False, True, AClick, 0, 'MenuItem2'));
  for N := 2 to 5 do begin
    TM.Add(TMenuItem.Create(nil));
    TM := TM.Items[TM.Count - 1];
    TM.Caption := '&Ìåíþ';
    TM.Name := 'SubMenu' + IntToStr(N);
    TM.OnClick := AClick;
    TM.Add(NewItem('&Ýëåìåíò', 0, False, True, AClick, 0, 'MenuItem' +
                   IntToStr(N + 1)));
  end;
  MainMenu1.Items.Add(NewSubMenu('Ìåíþ&2', 0, 'SM1',
    [NewItem('&Ýëåìåíò', 0, False, True, AClick,0,'MI2'),
     NewSubMenu('&Ìåíþ', 0, 'SM2',
    [NewItem('&Ýëåìåíò', 0, False, True, AClick,0,'MI3'),
     NewSubMenu('&Ìåíþ', 0, 'SM3',
    [NewItem('&Ýëåìåíò', 0, False, True, AClick, 0, 'MI4'),
     NewSubMenu('&Ìåíþ', 0, 'SM4',
    [NewItem('&Ýëåìåíò', 0, False, True, AClick, 0, 'MI5'),
     NewSubMenu('&Ìåíþ', 0, 'SM5',
    [NewItem('&Ýëåìåíò', 0, False, True, AClick, 0, 'MI6')])])])])]));
  TM := MainMenu1.Items[1];
  while True do begin
    TM.OnClick := AClick;
    if TM.Count < 2 then Break;
    TM := TM.Items[1];
  end;
end;

end.
[News Group]