Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.07.02;
Скачать: [xml.tar.bz2];

Вниз

Вывести в меню список окон моего приложения   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.011 c
15-1149515741
Red_imp
2006-06-05 17:55
2006.07.02
Skype + Usergate 2.8


3-1146647594
Antoha111
2006-05-03 13:13
2006.07.02
Ссылки в RichEdit на записи БД


2-1149930887
Exile
2006-06-10 13:14
2006.07.02
перевести из Text в String или в Char


15-1149570044
Иксик
2006-06-06 09:00
2006.07.02
Подмосковье


2-1150175682
TheBug
2006-06-13 09:14
2006.07.02
Строки и коллекции





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский