Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Очень длинные меню

Delphi , Компоненты и Классы , Меню

Очень длинные меню

Данный код изменяет количество пунктов меню в зависимости от текущего разрешения. Данная схема работает безукоризненно. В нижеприведенном коде mnuView - выводимое меню, HandleMenuClick - назначенный обработчик для события OnClick.


procedure TfrmMain.LoadViewMenu;
var

  itemNum: integer;
  mnu: TMenuItem;
  menuItemHeight: integer;
  itemsPerColumn: integer;
begin

  {удаляем все видимые пункты меню}
  while mnuView.Count > 0 do
  begin
    {метод Free удаляет пункт меню}
    mnuView.Items[0].Free;
  end;

  {находим высоту каждого пункта меню.
  Значение 2 получено в результате экспериментов}

  menuItemHeight := GetSystemMetrics(SM_CYMENU) + 2;

  {вычисляем количество пунктов в колонке меню}
  itemsPerColumn := screen.height div menuItemHeight;

  {создаем пункты меню}
  for itemNum := 0 to 99 do
  begin
    mnu := TMenuItem.Create(self);
    mnu.caption := 'Пункт ' + inttostr(itemNum);

    {при необходимости начинаем с новой колонки}
    if (itemNum mod itemsPerColumn = 0) and (itemNum > 0) then
    begin
      mnu.break := mbBarBreak;
    end;

    {назначаем обработчик события OnClick}
    mnu.OnClick := HandleMenuClick;

    mnuView.Add(mnu);
  end;
end;

Here is the translation of the provided text into Russian:

Код - процедура под названием LoadViewMenu, которая загружает меню (mnuView) с динамическим количеством элементов в зависимости от текущего разрешения экрана. Элементы меню созданы в цикле и их заголовки установлены на "Пункт X", где X - целое число от 0 до 99.

Сначала код очищает любые существующие элементы меню, освобождая их по одному до тех пор, пока не останется ни одного. Затем он рассчитывает высоту каждого элемента меню, добавляя 2 к системной метрике SM_ CYMENU (которая возвращает высоту панели меню в пикселях).

Далее код рассчитывает, сколько элементов меню может поместиться в столбце на основе высоты экрана и рассчитанной высоты элемента. Это значение хранится в переменной itemsPerColumn.

Затем процедура создает цикл, который работает 100 раз (от 0 до 99), и создает новый элемент меню для каждой итерации. Заголовок каждого элемента установлен на "Пункт X", где X - текущая номер итерации.

Если текущий номер итерации делится на itemsPerColumn и это не первая итерация, то свойство break элемента меню устанавливается в mbBarBreak, что означает, что новый столбец начнется на следующей итерации. Это обеспечивает правильное выравнивание элементов меню в столбцах.

Наконец, обработчик события (HandleMenuClick) присваивается каждому элементу меню свойству OnClick.

Код кажется работать корректно и динамически adjusts количество элементов меню в зависимости от разрешения экрана. Однако есть несколько предложений по улучшению:

  1. Вместо использования жесткого значения 2 в расчете menuItemHeight, рассмотрите более гибкий подход, например, получение высоты шрифта из системных метрик.
  2. Код использует магическое число (99) в цикле. Рассмотрите определение константы или переменной для представления этого значения, чтобы было легче изменить его, если это нужно.
  3. Обработчик события (HandleMenuClick) не определен в предоставленном коде-снипете. Убедитесь, что включает его реализацию или комментарий к присваиванию, если он не используется.

Вот обновленный вариант процедуры с некоторыми из этих предложений:

procedure TfrmMain.LoadViewMenu;
var
  itemNum: integer;
  mnu: TMenuItem;
  menuItemHeight: integer;
  itemsPerColumn: integer;
begin
   {Clear any existing menu items}
  while mnuView.Count > 0 do
  begin
    mnuView.Items[0].Free;
  end;

   {Calculate the height of each menu item}
  menuItemHeight := GetSystemMetrics(SM_ CYMENU) + SystemParams.Font.Height;

   {Calculate how many menu items can fit in a column}
  itemsPerColumn := screen.height div menuItemHeight;

   {Create menu items}
  for itemNum := 0 to MaxItems - 1 do
  begin
    mnu := TMenuItem.Create(self);
    mnu.Caption := 'Пункт ' + IntToStr(itemNum);

    if (itemNum mod itemsPerColumn = 0) and (itemNum > 0) then
    begin
      mnu.Break := mbBarBreak;
    end;

    mnu.OnClick := HandleMenuClick;

    mnuView.Add(mnu);
  end;
end;

В этом обновленном варианте я заменил жесткое значение 2 расчетом, использующим высоту шрифта из системных метрик. Я также определил константу MaxItems для представления максимального количества элементов в меню, которое можно изменить, если это нужно.

Код изменяет количество пунктов меню в зависимости от текущего разрешения, создавая пункты в колонках для лучшей видимости на различных экранах.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Меню ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 02:38:57/0.0036749839782715/0