Текущий архив: 2006.07.02;
Скачать: CL | DM;
Вниз
Вывести в меню список окон моего приложения Найти похожие ветки
← →
Juice © (2006-05-23 21:52) [0]Стандартная штука - вывести в меню список окон.
Пишу что-то типа такого :
var
NewItem : TActionClientItem;
i : integer;
begin
for i:=0 to Screen.CustomFormCount-1 do
begin
if (Screen.CustomForms[i] is TForm) and (Screen.CustomForms[i].Visible) then
begin
Добавляем форму в какой-то список
end;
end;
А весь вопрос заключается в том, откуда вызывать этот код? Список нужно формировать в меню (использую ActionMainMenuBar если это имеет значение). Пробовал навесить на обработчик экшена что присоединен к главной кнопке меню "окна", по логике так и должно же быть? Кликаем на элемент меню "окна", вызывается экшн который чистит и добавляет в "окна".Items список окон. Но выглядит оно как-то глюкаво, при открытии подменю сразу исчезает.
← →
Juice © (2006-05-23 22:02) [1]Забыл сказать, навешивать это на OnShow/OnClose-обработчики всех форм тоже как-то не красиво.
← →
Юрий Зотов © (2006-05-23 22:03) [2]1. См. Application.OnIdle. Список будет обновляться сам собой.
2. Вместо CustomForms используйте Forms, тогда обе проверки будут не нужны.
3. В хелпе есть пример Вашей задачи (топик TSreen.Forms).
4. Если у Вас MDI-приложение, то ничего этого вообще не нужно - просто используйте свойство WindowMenu главной формы и все будет происходить само собой.
← →
Juice © (2006-05-23 22:25) [3]
> Юрий Зотов ©
Огромное спасибо за исчерпывающий ответ !
← →
Juice © (2006-05-23 22:37) [4]Но к сожалению не получилось :)
procedure TdmCentral.applEventsIdle(Sender: TObject; var Done: Boolean);
var
NewItem : TActionClientItem;
i : integer;
begin
actmanMain.ActionBars[0].Items[4].Items.Clear;
for i:=0 to Screen.FormCount-1 do
begin
if (Screen.Forms[i] is TForm) and (Screen.Forms[i].Visible) then
begin
NewItem := actmanMain.ActionBars[0].Items[4].Items.Add;
NewItem.Caption := Screen.Forms[i].Caption;
end;
end;
if Assigned(fmMain) then fmMain.ActionMainMenuBar1.Update;
end;
Меню "окна" светится серым, хотя OnIdle обрабатывается и в меню добавляются те окна что надо. Но и по логике, даже если было бы оно не серым, что было бы когда я открыл бы это меню с окнами а в этот момент возникло OnIdle ? Наверное что-то другое надо?
← →
Юрий Зотов © (2006-05-24 22:11) [5]> Juice © (23.05.06 22:37) [4]
> Меню "окна" светится серым
Вероятно, не назначены обработчики OnExecute.
> что было бы когда я открыл бы это меню с окнами а в этот момент
> возникло OnIdle
При Вашем коде - ничего хорошего, потому что при каждом чихе (вернее, между каждыми двумя чихами) он заново пересоздает весь список. Зачем? Нужно удалить уже отсутствующие окна, добавить новые окна и не трогать остальные пункты, тогда все будет открываться и закрываться нормально.
← →
REA (2006-05-25 12:32) [6]Типа такого:
Procedure TfmMain.mmMainMenuPopup(Sender: TObject; Item: TCustomActionControl);
Var
i: Integer;
NewItem : TActionClientItem;
Begin
If Item.ActionClient.Tag = 1 Then // "Windows" menu item tag must be set to 1
With TActionClient(Item.ActionClient) Do
Begin
Items.Clear;
For i := 0 To Screen.FormCount-1 Do
Begin
NewItem := Items.Add;
NewItem.Caption := Screen.Forms[i].Caption;
End;
End;
End;
← →
Игорь Шевченко © (2006-05-25 13:10) [7]Juice © (23.05.06 22:37) [4]
> Меню "окна" светится серым
В меню "Окна" надо добавить какой-то пункт, например, три стандартных. Система присоединяет список MDI-окон только если присутствует хотя бы один пункт в этом меню. Ну и, разумеется, у MDI-формы должно быть установлено свойство WindowMenu
← →
Juice © (2006-05-25 13:56) [8]
> меню "Окна" надо добавить какой-то пункт, например, три
> стандартных. Система присоединяет список MDI-окон только
> если присутствует хотя бы один пункт в этом меню. Ну и,
> разумеется, у MDI-формы должно быть установлено свойство
> WindowMenu
У меня не MDI
> REA (25.05.06 12:32) [6]
> Типа такого:
Это оно, на OnPopup все нормально работает. Только в завершение надо ж чтобы при нажатии показывалось окно.
Не знаю как передать экшену параметр. Пытаюсь начать типа такого:
procedure TfmMain.ActionMainMenuBar1Popup(Sender: TObject;
Item: TCustomActionControl);
Var
i: Integer;
NewItem : TActionClientItem;
Begin
If Item.ActionClient.Caption = "Окна" Then
With TActionClient(Item.ActionClient) Do
Begin
Items.Clear;
NewItem := Items.Add;
NewItem.Caption := "Відкриті вікна:";
For i := 0 To Screen.FormCount-1 Do
Begin
if (Screen.Forms[i].Visible) then
begin
NewItem := Items.Add;
NewItem.Action := dmCentral.actShowWnd;
NewItem.Caption := Screen.Forms[i].Caption;
NewItem.Tag := i;
end;
End;
End;
end;
Но что писать в
procedure TdmCentral.actShowWndExecute(Sender: TObject);
begin
end;
Ибо я думал что в Sender будет приходить TActionClientItem и через его тег узнать номер окна в и открыть его а там на самом деле TAction.
← →
Juice © (2006-05-25 15:43) [9]Нашел свойство ActionComponent
Страницы: 1 вся ветка
Текущий архив: 2006.07.02;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.009 c