Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.10.02;
Скачать: CL | DM;

Вниз

Создание кнопок и меню в рантайм   Найти похожие ветки 

 
Exterr   (2011-06-10 21:23) [0]

В программе в рантайме создаются 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;


 
Loginov Dmitry ©   (2011-06-10 21:43) [1]

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


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

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

       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;


Спасибо!


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

> 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-11 07:12) [4]

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


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


> Exterr   (11.06.11 07:12) [4]

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


 
sniknik ©   (2011-06-11 10:37) [6]

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;



Страницы: 1 вся ветка

Текущий архив: 2011.10.02;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.009 c
2-1307876453
avil
2011-06-12 15:00
2011.10.02
Проверка в множестве


15-1307087801
Dennis I. Komarov
2011-06-03 11:56
2011.10.02
Воду заказывали?


15-1307283813
Kerk
2011-06-05 18:23
2011.10.02
Какие технические блоги вы читаете?


2-1307895125
Leon-Z
2011-06-12 20:12
2011.10.02
Предупреждение компилятора.


2-1308121329
mefodiy
2011-06-15 11:02
2011.10.02
Разница между TIdAttachment и TIdAttachmentFile