Главная страница
    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.47 MB
Время: 0.009 c
2-1149706067
Alextp
2006-06-07 22:47
2006.07.02
Определить моноширинный шрифт


15-1149679407
nick-from
2006-06-07 15:23
2006.07.02
Откаты и борьба с ними


2-1150209570
Марина
2006-06-13 18:39
2006.07.02
Сохраниние ячеек таблицы


15-1149596109
_RusLAN
2006-06-06 16:15
2006.07.02
Как правильно назвать функцию?


9-1128284946
Ford
2005-10-03 00:29
2006.07.02
3D Tile





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский