Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.036 c
3-1146917274
Ярослав
2006-05-06 16:07
2006.07.02
как убраить masterkey


3-1146742017
onimusha
2006-05-04 15:26
2006.07.02
id вставленной записи


15-1149523013
Piter
2006-06-05 19:56
2006.07.02
Догвилль


15-1149258002
AlexanderMS
2006-06-02 18:20
2006.07.02
Задачка


1-1148291731
DmitryFox
2006-05-22 13:55
2006.07.02
Окна StayOnTop только поверх окон приложения