Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создание кнопок и меню в рантайм [D2005, XP]


Exterr ©   (2011-06-10 21:23:00) 

В программе в рантайме создаются SpedButton'ы и PopupMenu. Пункты меню тоже строятся динамически. Надо сделать что-бы по Л.клику выпадало меню. Только как связать каждую кнопку и соответствующее ему меню не соображу. Подскажете пожалуйста.


procedure CreateHDDBtn;
var
 Drv: Char;
 DrvType: Integer;
 DiskBtn : TsSpeedButton;
 DiskMenu : TPopupMenu;
 DiskItem : TMenuItem;
 i : Char;
begin
 for i := 'A' to 'Z' do begin
   DrvType := GetDriveType(PChar(i + ':\'));
   if DrvType = DRIVE_FIXED then begin
     DiskBtn := TsSpeedButton.Create(DiskPanel);
     DiskMenu := TPopupMenu.Create(DiskBtn);
     DiskItem := TMenuItem.Create(DiskMenu);
     DiskItem.Caption := RC_EmptyItem;
     DiskMenu.Items.Add(DiskItem);

     with DiskBtn do begin
       Parent := DiskPanel;
       Top := 0;
       Left := DiskPanel.Tag * 24;
       Caption := i ;
       hint := i + ':\';
       Height := 24;
       Width := 24;
       Visible := true;
     end;
     DiskPanel.Tag := DiskPanel.Tag + 1;
   end;
 end;
end;


sniknik   (2011-06-11 10:37:00) [1]

procedure DiskSpeedBtnClick(Sender: TObject);
begin
 with sender as TsSpeedButton do begin
   DynBuild(PopupMenu.Items, Hint);
   sSkinManager1.SkinableMenus.HookPopupMenu(PopupMenu, True);
   PopupMenu.Popup(DiskPanel.Left + Left, Top + Height);
 end'
end;


Юрий Зотов   (2011-06-11 09:31:00) [2]


> Exterr   (11.06.11 07:12) [4]

И работать будет чуть-чуть быстрее - ведь при каждом AS выполняется проверка типа, а на нее тратится время.


Exterr   (2011-06-11 07:12:00) [3]

Спасибо, так более читаемо будет.


Юрий Зотов   (2011-06-10 22:50:00) [4]

> Exterr   (10.06.11 21:56) [2]
> конструкция выглядит ужасно, думал может есть способ попроще

В код не вникал, а конструкцию упростить можно:

procedure DiskSpeedBtnClick(Sender: TObject);
var
 sb: TsSpeedButton;
begin
 sb := sender as TsSpeedButton;
 DynBuild(sb.PopupMenu.Items, sb.Hint);
 sSkinManager1.SkinableMenus.HookPopupMenu(sb.PopupMenu, True);
 sb.PopupMenu.Popup(DiskPanel.Left + sb.Left, sb.Top + sb.Height);
end;


Exterr   (2011-06-10 21:56:00) [5]

Так и сделал только конструкция выглядит ужасно, думал может есть способ попроще.

       DiskBtn.PopupMenu := DiskMenu;
       DiskBtn.OnClick := DiskSpeedBtnClick;


 
procedure DiskSpeedBtnClick(Sender: TObject);
begin
 DynBuild((sender as TsSpeedButton).PopupMenu.Items, (sender as TsSpeedButton).Hint);

 sSkinManager1.SkinableMenus.HookPopupMenu((sender as TsSpeedButton).PopupMenu, True);

 (sender as TsSpeedButton).PopupMenu.Popup
 ( DiskPanel.Left + ((sender as TsSpeedButton).Left),
 (sender as TsSpeedButton).Top + (sender as TsSpeedButton).Height);
end;


Спасибо!


Loginov Dmitry   (2011-06-10 21:43:00) [6]

У SpeedButton (равно как и у любого визуального компонента) есть прекрасное свойство "PopupMenu". Этому свойству вполне логично присваивать созданный DiskMenu. При нажатии на кнопке ЛКМ для отображения меню на экране достаточно вызвать метод MyButton.PopupMenu.Popup()


Наверх

Титульная страница Поиск, карта сайта Написать письмо