arisu писал(а):
я сделал так: ввёл в StdWindows.Window булеву переменную `isRoot`. она делает ровно ничего, просто существует. API позволяет назначить какое-то окно главным (у всех остальных окон тогда этот флажок сбрасывается). чисто информационная штука, кроме как посмотреть на неё и установить StdWindows больше с ней ничего не делает, всё остальное — на усмотрение кода приложения. можно использовать флажок, можно не использовать. соответственно, StdConfig для рут-окна этот флажок ставит апи-вызовом, и дальше я могу его проверять. а если кто-то не поставит — ну, не поставит, ничего страшного. надо бы документировать будет его потом, да и всё. впрочем, StdWindows вообще не документированы, увы. (это не претензия, это сожаление. я может постараюсь как-нибудь скелет документации сделать.)
Может существовать два она с меню, если у вас два монитора, то там здорово предусмотрена такая возможность.
Про документацию. Со StdWindows история незаконченная, так как у нас с Антоном в процессе работы разошлись мнения. Он тяготеет к тому, чтобы снизить использование Windows, заменяя это на вызовы StdWindows, а я же вижу StdWindows как реализацию интерфейса, а вызовы надо делать также через Windows. Его аргументы заключались в том, что может существовать единовременно несколько фабрик, и поэтому обращение через одну фабрику не сделает обход всех окон всех фабрик. Однако в 2.0 такой ситуации не возникает, так как предполагается существование только одной фабрики после загрузки системы. Так оно как-то всегда было и сейчас остаётся. Так что и документация пока может быть с пометкой, что сам модуль ещё не зафиксирован в своём виде, так как не был подвержен какой-то ревизии сообществом.
Вот пример, как можно понять, что в окне прикреплено меню сверху. Тогда вы все окна в которых есть меню, сможете обновить.
Код:
MODULE CheckMainWindow;
IMPORT Windows, StdDocuments, StdMenus, Views, Models, Services, Log;
PROCEDURE Do*;
VAR
w: Windows.Window; t: Views.Title;
m: Models.Model; c: StdDocuments.Context;
find: BOOLEAN;
type: ARRAY 64 OF CHAR;
BEGIN
w := Windows.dir.First();
WHILE w # NIL DO
w.GetTitle(t);
IF w.doc IS StdDocuments.Document THEN
m := w.doc.ThisView().context.ThisModel();
IF m IS StdDocuments.Model THEN
c := m(StdDocuments.Model).First();
find := FALSE;
WHILE (c # NIL) & ~find DO
Services.GetTypeName(c.view, type);
IF type = "StdMenus.LineView" THEN
find := TRUE
END;
c := m(StdDocuments.Model).Next(c)
END;
IF find THEN
Log.String(t); Log.Ln;
END;
END;
END;
w := Windows.dir.Next(w)
END;
END Do;
END CheckMainWindow.