OberonCore https://forum.oberoncore.ru/ |
|
A2. Новая глава https://forum.oberoncore.ru/viewtopic.php?f=22&t=6383 |
Страница 5 из 11 |
Автор: | Kemet [ Суббота, 20 Апрель, 2019 17:00 ] |
Заголовок сообщения: | Re: A2. Новая глава |
Транслируются же не просто слова и и фразы, а и более сложный текст, типа информационных сообщений ( сообщения об ошибках и тд )...., содержащих определенные параметры и, конечно, хочется, чтобы писалось не 1 лет и 5 годов, а всё же 1 год и 5 лет ))) Baikal писал(а): Я поработаю над менюшками Как оно? |
Автор: | Sergej Durmanov [ Суббота, 20 Апрель, 2019 19:14 ] |
Заголовок сообщения: | Re: A2. Новая глава |
Цитата: Как оно? Пока никак - изучаю предметную область))Похоже, что получится несколько компонентов - mainnmenu, popupmenu, treeview, listview, grid ( иерархический ) |
Автор: | Ярослав Романченко [ Понедельник, 22 Апрель, 2019 08:23 ] |
Заголовок сообщения: | Re: A2. Новая глава |
Похоже, чтение параметров через ini, это как-бы устаревший приём. Теперь в Win/Linux A2 чтение параметров унифицировано через чтение просто набора команд для поочерёдного выполнения. Вместо ini из первого сообщения можно использовать такой батник и файл параметров, соответственно: A2x64.cmd писал(а): cd trunk\Win64 oberon run ../../A2x64.txt A2x64.txt писал(а): Heaps.SetMetaData ~ Это изменение, помимо унификации Win/Linux A2 даёт ещё одно интересное применение. Мы можем теперь на базе этого сделать простейший CGI-скрипт, например:Traps.Install ~ Files.AddSearchPath bin~ Files.AddSearchPath ../source~ Files.AddSearchPath ../../Work/ocp_trunk/Work~ Files.AddSearchPath ../../Work/ocp_trunk/Work/Resources~ Files.SetWorkPath ../../Work~ Configuration.Init~ Machine.SetTraceFile~ FSTools.Mount WORK RelativeFileSystem ./~ Display.Install ~ WindowManager.Install ~ Clipboard.Install ~ Autostart.Run~ Цитата: System.Show Content-type: text/html~
System.Ln ~ System.Ln ~ System.Show <HTML> ~ System.Ln ~ System.Show <HEAD><TITLE>Hello from A2 OS</TITLE></HEAD> ~ System.Ln ~ System.Show <BODY> ~ System.Ln ~ System.Show <H1>Hello from A2 OS!</H1> ~ System.Ln ~ System.Show <H2>Version information:</H2> ~ System.Version ~ System.Ln ~ System.Show <H2>Some environment variables:</H2> ~ System.Ln ~ env.var HTTP_HOST ~ System.Show <BR> ~ System.Ln ~ env.var HTTP_USER_AGENT ~ System.Show <BR> ~ System.Ln ~ env.var REQUEST_URI ~ System.Show <BR> ~ System.Ln ~ env.var REQUEST_METHOD ~ System.Show <BR> ~ System.Ln ~ env.var SERVER_NAME ~ System.Show <BR> ~ System.Ln ~ env.var SERVER_SOFTWARE ~ System.Show <BR> ~ System.Ln ~ env.var SERVER_SIGNATURE ~ System.Show <BR> ~ System.Ln ~ env.var UNIQUE_ID ~ System.Show <BR> ~ System.Ln ~ System.Show <H2>Loaded modules:</H2> ~ System.ListModules ~ System.Ln ~ System.Show <H2>To be continued... Stay tuned!</H2> ~ System.Show </BODY></HTML> ~ System.Ln ~ System.PowerDown ~ |
Автор: | budden [ Понедельник, 22 Апрель, 2019 11:22 ] |
Заголовок сообщения: | Re: A2. Новая глава |
С точки зрения информационной безопасности такой скрипт - это плохо, поскольку позволяет исполнение произвольного кода со всеми вытекающими. В принципе, можно пренебречь безопасностью ради гибкости конфигурации, если взять за правило всегда тщательно контролировать содержимое такого скрипта. Но и в этом случае данный подход - не лучший, т.к. в нём нет if-ов. Если уж идти этим путём, то минимально жизнеспособная версия исполнителя такого скрипта должна быть способна прекращать выполнение после любой ошибки и сообщать о строчке, в которой ошибка произошла. Тогда её будет хотя бы возможно отладить. Я в свою бытность целился в то, чтобы писать подобные скрипты на самом Обероне. В целом уродливость линукса во многом обусловлена баш-скриптами. Баш - это отвратительный динамически типизированный язык с кривым метапрограммированием (абстракции в его метапрограммировании дико протекают) и без полноценных средств отладки. И кроме того, в нём был bashdoor. Этот вопрос я бы решал одним из первых. Т.е. как минимум, внятные сообщения об ошибках. |
Автор: | Ярослав Романченко [ Понедельник, 22 Апрель, 2019 12:08 ] |
Заголовок сообщения: | Re: A2. Новая глава |
budden писал(а): т.к. в нём нет if-ов. Конечно не лучший. Это и не скрипт в полном понимании этого слова, а просто набор команд для выполнения. Он используется в основном для создания новых билдов системы.budden писал(а): Если уж идти этим путём, то минимально жизнеспособная версия исполнителя такого скрипта должна быть способна прекращать выполнение после любой ошибки и сообщать о строчке, в которой ошибка произошла. Тогда её будет хотя бы возможно отладить. Так он и останавливается на первой же ошибке.Но примитивность этого "скрипта" не мешает нам вызвать более "навороченную" команду из нашего модуля, и описать там всю логику. |
Автор: | Sergej Durmanov [ Понедельник, 22 Апрель, 2019 12:30 ] |
Заголовок сообщения: | Re: A2. Новая глава |
И снова я уперся в стену))) Думалось, сейчас я как нафигачу моделей типа ObjectList, ObjectTree и усё будет путём, ан нет — модели в а2 не подразумевают структуры, там просто значения. Есть модель Контейнер, но это контейнер для других моделей. А я еще думал, чего это они модель у StringGrid не унаследовали от Models.Model((( А модели с одним значение базового типа не сильно то и полезны |
Автор: | budden [ Понедельник, 22 Апрель, 2019 13:42 ] |
Заголовок сообщения: | Re: A2. Новая глава |
Ярослав Романченко писал(а): Так он и останавливается на первой же ошибке. Если ещё и показывает, где проблема, тогда приемлемо.
|
Автор: | Kemet [ Понедельник, 22 Апрель, 2019 14:54 ] |
Заголовок сообщения: | Re: A2. Новая глава |
Baikal писал(а): И снова я уперся в стену))) А тебе точно нужны модели? Ведь Models.Model и WMComponents.Component происходят от Repositories.Component.Вполне возможно, что тебя может устроить WMComponents.Component. |
Автор: | Sergej Durmanov [ Понедельник, 22 Апрель, 2019 18:39 ] |
Заголовок сообщения: | Re: A2. Новая глава |
Я хотел простую штуку - сделать модель ObjectList, например, чтобы хранить там данные списка, чтобы расшарить можно с несколькими Отображениями, чтобы хранить в репозитории и восстанавливать. Это модель данных и логично, что оно инкапсулировано в наследнике Models.Model, а не в компоненте, который для другого предназначен. Но логика уперлась в особенности реализации. Либо это очередной концепт или я не умею эту штуку готовить. И еще я не понял, а как предопределенные модели из репозитория значения восстанавливают? Как оно записывается я вижу в методе Write. |
Автор: | Kemet [ Вторник, 23 Апрель, 2019 12:07 ] |
Заголовок сообщения: | Re: A2. Новая глава |
Baikal писал(а): ... Это же модели, которые работают в связке с наследниками WMProperties.Property.
|
Автор: | Sergej Durmanov [ Вторник, 23 Апрель, 2019 12:46 ] |
Заголовок сообщения: | Re: A2. Новая глава |
Вроде нет у моделей никаких ограничений на то, где и в каких связках использовать??? Где об этом написано? |
Автор: | Kemet [ Вторник, 23 Апрель, 2019 12:54 ] |
Заголовок сообщения: | Re: A2. Новая глава |
Ограничений нет. Я говорю о текущем состоянии. А так - берёшь и пишешь всё, чего там не хватает, не забыв реализовать поддержку в своих виджетах. Чтобы всё сохранялось в репозиторий и восстанавливалось. В общем, настроился "и пошёл зябь пахать, молотить ячмень, Будет долгим, долгим, долгим твой рабочий день..." |
Автор: | Kemet [ Вторник, 23 Апрель, 2019 12:55 ] |
Заголовок сообщения: | Re: A2. Новая глава |
Посмотри пример в MatrixModels |
Автор: | Sergej Durmanov [ Вторник, 23 Апрель, 2019 13:10 ] |
Заголовок сообщения: | Re: A2. Новая глава |
Пример посмотрел, но блин, это не то. Потому что все варианты использования этих моделей в а2 подразумевают, что оно имеет только один параметр VALUE. Это уж какая-то специфическая модель. А мне нужно сохранять в репозиторий совершено разные поля. То есть мне не понятно, если я сделаю то, что мне нужно, нигде потом это не аукнетс? Или все—таки мне лучше не наследоваться от Models.Model, а писать своё? |
Автор: | Kemet [ Вторник, 23 Апрель, 2019 13:23 ] |
Заголовок сообщения: | Re: A2. Новая глава |
А WMMatrixComponents, где используется MatrixModel смотрел? Та же MatrixModel оперирует ARRAY [*, *] OF REAL, который сериализуется в строку "[[r,r,r,r,r],[r,r,r,r,r]...]". То есть VALUE хранит структурное значение. Вот почему бы и тебе не хранить там сериализованные в XML данные? Вроде одно значение, а фантазия ничем не ограничена. Ну или да, писать полностью своё. |
Автор: | Ярослав Романченко [ Вторник, 23 Апрель, 2019 13:46 ] |
Заголовок сообщения: | Re: A2. Новая глава |
У VisualComponent есть модель, типа WMProperties.ReferenceProperty: Код: VisualComponent* = OBJECT(Component) ReferenceProperty имеет методы сериализации/десериализации:VAR model- : WMProperties.ReferenceProperty; Код: ReferenceProperty* = OBJECT(Property) Код обработчика изменения модели, как я понимаю, на примере компонента Label:PROCEDURE FromStream*(r : Streams.Reader); PROCEDURE ToStream*(w : Streams.Writer); Код: PROCEDURE LinkChanged(sender, data : ANY); Т.е. в обработчик изменения модели приходит сама модель и мы извлекаем из неё значение строки, в данном случае. А вот код WMProperties.GetModel(model,m):VAR string : Types.String256; res : LONGINT; m: Models.Model; BEGIN IF (sender = model) & WMProperties.GetModel(model,m) THEN m.GetGeneric(string, res); IF (res = Models.Ok) THEN SetCaption(string.value); END; END; END LinkChanged; Код: (* Get a model from either a property reference or a model pointer *) Т.е. прослеживается какая-то связь между Model и Property.PROCEDURE GetModel*(ref: ANY; VAR m: Models.Model): BOOLEAN; BEGIN IF (ref # NIL) & (ref IS ReferenceProperty) THEN ref := ref(ReferenceProperty).Get() END; IF (ref # NIL) & (ref IS Models.Model) THEN m := ref(Models.Model); RETURN TRUE END; RETURN FALSE END GetModel; И есть модель Container* = OBJECT(Model). Почему нельзя выстроить структуры с вложенными контейнерами? |
Автор: | Sergej Durmanov [ Вторник, 23 Апрель, 2019 14:39 ] |
Заголовок сообщения: | Re: A2. Новая глава |
Да вы чего????? У меня одна проблема, как мне сохранять и восстанавливать атрибуты структурных элементов модели в репозитории, чтобы и транслятор работал и т.д. И что-бы это не порушило работающие концепты. Как мне состыковать с виджетом вообще проблем нет. Хранить всё в VALUE это вообще не вариант. |
Автор: | Ярослав Романченко [ Вторник, 23 Апрель, 2019 15:32 ] |
Заголовок сообщения: | Re: A2. Новая глава |
Вот, я как-то делал набор компонентов для сохранения ДРАКОН схем в XML, я унаследовал от WMComponents.Component все необходимые компоненты, с возможностью вкладывания друг в дружку как матрёшки. Вот, вся иерархия компонетов, а вот здесь можно глянуть примеры как документы, составленные из этих компонентов пишутся/читаются. В репозитории я хранил только генераторы (фабрики) соответствующих компонентов. Тот факт, что все фабрики у нас в репозитории даёт возможность автоматического создания экземпляров компонентов при чтении из XML. Ни кто конечно не запрещает сохранять в репозитории и состояния компонентов. Но ведь, состояния, это так-сказать, пользовательские данные... Имеет ли смысл мешать? Репозитрии предназначены для компонентов и для всяких повторно используемых вещей. Вот, содержимое index.xml в репозитории: Код: <Repository> Процедуры чтения/записи получаются элементарные:<Header> <Version>1</Version> <Public>FALSE</Public> </Header> <Applications/> <Components> <Component name="Document" id="0" source="DrakonComponents.GenDocument"/> <Component name="SchemaComment" id="0" source="DrakonComponents.GenSchemaComment"/> <Component name="SchemaPrimitive" id="0" source="DrakonComponents.GenSchemaPrimitive"/> <Component name="SchemaSilhouette" id="0" source="DrakonComponents.GenSchemaSilhouette"/> <Component name="ElementHead" id="0" source="DrakonComponents.GenElementHead"/> <Component name="ElementEnd" id="0" source="DrakonComponents.GenElementEnd"/> <Component name="ElementAction" id="0" source="DrakonComponents.GenElementAction"/> <Component name="ElementInsert" id="0" source="DrakonComponents.GenElementInsert"/> <Component name="ElementBranch" id="0" source="DrakonComponents.GenElementBranch"/> <Component name="ElementAddress" id="0" source="DrakonComponents.GenElementAddress"/> <Component name="ElementCondition" id="0" source="DrakonComponents.GenElementCondition"/> <Component name="ElementSwitch" id="0" source="DrakonComponents.GenElementSwitch"/> <Component name="ElementCase" id="0" source="DrakonComponents.GenElementCase"/> <Component name="ElementComment" id="0" source="DrakonComponents.GenElementComment"/> <Component name="ElementInput" id="0" source="DrakonComponents.GenElementInput"/> <Component name="ElementOutput" id="0" source="DrakonComponents.GenElementOutput"/> <Component name="ElementShelf" id="0" source="DrakonComponents.GenElementShelf"/> <Component name="ElementProcess" id="0" source="DrakonComponents.GenElementProcess"/> <Component name="ElementForBegin" id="0" source="DrakonComponents.GenElementForBegin"/> <Component name="ElementForEnd" id="0" source="DrakonComponents.GenElementForEnd"/> <Component name="ElementPause" id="0" source="DrakonComponents.GenElementPause"/> <Component name="ElementTimerStart" id="0" source="DrakonComponents.GenElementTimerStart"/> <Component name="ElementSynchronizer" id="0" source="DrakonComponents.GenElementSynchronizer"/> <Component name="ElementPeriod" id="0" source="DrakonComponents.GenElementPeriod"/> <Component name="ElementParameter" id="0" source="DrakonComponents.GenElementParameter"/> <Component name="ElementNode" id="0" source="DrakonComponents.GenElementNode"/> </Components> <Dictionaries/> </Repository> Код: PROCEDURE XML_Load(CONST filename: ARRAY OF CHAR; VAR document: DrakonComponents.Document);
VAR content: XML.Content; BEGIN document := NIL; content := WMComponents.Load(filename); IF content IS DrakonComponents.Document THEN document := content(DrakonComponents.Document); (* Simply resolve links, no update needed for IDs *) document.ResolveLinks(NIL) END END XML_Load; PROCEDURE XML_Save(CONST filename: ARRAY OF CHAR; document: DrakonComponents.Document; VAR res: LONGINT); VAR decl: XML.XMLDecl; writer: Streams.Writer; BEGIN res := Error; writer := Codecs.OpenOutputStream(filename); IF writer # NIL THEN NEW(decl); decl.SetStandalone(TRUE); decl.SetVersion("1.0"); decl.SetEncoding("UTF-8"); decl.Write(writer, 0); document.Write(writer, 0); writer.Update; res := Ok END END XML_Save; |
Автор: | Kemet [ Вторник, 23 Апрель, 2019 15:41 ] |
Заголовок сообщения: | Re: A2. Новая глава |
Baikal писал(а): Хранить всё в VALUE это вообще не вариант. VALUE это же не значение типа VALUE = блаблаблаЭто XML. <VALUE> ... </VALUE> А то, что внутри это XML.Content. Поэтому, перекрой метод WriteValue, где будут сериализоваться твои данные в XML. PS: Ещё придётся правильно перекрыть метод FromXML, чтобы восстановить твои данные |
Автор: | Ярослав Романченко [ Вторник, 23 Апрель, 2019 15:48 ] |
Заголовок сообщения: | Re: A2. Новая глава |
Kemet писал(а): Baikal писал(а): Хранить всё в VALUE это вообще не вариант. VALUE это же не значение типа VALUE = блаблаблаЭто XML. <VALUE> ... </VALUE> А то, что внутри это XML.Content. Поэтому, реализуй метод WriteValue, где будут сериализоваться твои данные в XML. |
Страница 5 из 11 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |