![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание кнопок и меню в рантайм [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()