OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 21 Ноябрь, 2019 08:46

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 206 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7, 8 ... 11  След.
Автор Сообщение
 Заголовок сообщения: Re: A2. Новая глава
СообщениеДобавлено: Суббота, 20 Апрель, 2019 17:00 

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 717
Откуда: Барнаул
Транслируются же не просто слова и и фразы, а и более сложный текст, типа информационных сообщений ( сообщения об ошибках и тд )...., содержащих определенные параметры и, конечно, хочется, чтобы писалось не 1 лет и 5 годов, а всё же 1 год и 5 лет )))
Baikal писал(а):
Я поработаю над менюшками

Как оно?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: A2. Новая глава
СообщениеДобавлено: Суббота, 20 Апрель, 2019 19:14 

Зарегистрирован: Пятница, 11 Январь, 2019 19:26
Сообщения: 81
Откуда: Russia
Цитата:
Как оно?
Пока никак - изучаю предметную область))
Похоже, что получится несколько компонентов - mainnmenu, popupmenu, treeview, listview, grid ( иерархический )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: A2. Новая глава
СообщениеДобавлено: Понедельник, 22 Апрель, 2019 08:23 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1297
Откуда: Украина, Киев
Похоже, чтение параметров через ini, это как-бы устаревший приём.
Теперь в Win/Linux A2 чтение параметров унифицировано через чтение просто набора команд для поочерёдного выполнения.
Вместо ini из первого сообщения можно использовать такой батник и файл параметров, соответственно:
A2x64.cmd писал(а):
cd trunk\Win64
oberon run ../../A2x64.txt
A2x64.txt писал(а):
Heaps.SetMetaData ~
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~
Это изменение, помимо унификации Win/Linux A2 даёт ещё одно интересное применение. Мы можем теперь на базе этого сделать простейший CGI-скрипт, например:
Цитата:
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 ~


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: A2. Новая глава
СообщениеДобавлено: Понедельник, 22 Апрель, 2019 11:22 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 631
С точки зрения информационной безопасности такой скрипт - это плохо, поскольку позволяет исполнение произвольного кода со всеми вытекающими. В принципе, можно пренебречь безопасностью ради гибкости конфигурации, если взять за правило всегда тщательно контролировать содержимое такого скрипта. Но и в этом случае данный подход - не лучший, т.к. в нём нет if-ов. Если уж идти этим путём, то минимально жизнеспособная версия исполнителя такого скрипта должна быть способна прекращать выполнение после любой ошибки и сообщать о строчке, в которой ошибка произошла. Тогда её будет хотя бы возможно отладить. Я в свою бытность целился в то, чтобы писать подобные скрипты на самом Обероне.

В целом уродливость линукса во многом обусловлена баш-скриптами. Баш - это отвратительный динамически типизированный язык с кривым метапрограммированием (абстракции в его метапрограммировании дико протекают) и без полноценных средств отладки. И кроме того, в нём был bashdoor.

Этот вопрос я бы решал одним из первых. Т.е. как минимум, внятные сообщения об ошибках.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: A2. Новая глава
СообщениеДобавлено: Понедельник, 22 Апрель, 2019 12:08 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1297
Откуда: Украина, Киев
budden писал(а):
т.к. в нём нет if-ов.
Конечно не лучший. Это и не скрипт в полном понимании этого слова, а просто набор команд для выполнения. Он используется в основном для создания новых билдов системы.
budden писал(а):
Если уж идти этим путём, то минимально жизнеспособная версия исполнителя такого скрипта должна быть способна прекращать выполнение после любой ошибки и сообщать о строчке, в которой ошибка произошла. Тогда её будет хотя бы возможно отладить.
Так он и останавливается на первой же ошибке.
Но примитивность этого "скрипта" не мешает нам вызвать более "навороченную" команду из нашего модуля, и описать там всю логику.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: A2. Новая глава
СообщениеДобавлено: Понедельник, 22 Апрель, 2019 12:30 

Зарегистрирован: Пятница, 11 Январь, 2019 19:26
Сообщения: 81
Откуда: Russia
И снова я уперся в стену))) Думалось, сейчас я как нафигачу моделей типа ObjectList, ObjectTree и усё будет путём, ан нет — модели в а2 не подразумевают структуры, там просто значения. Есть модель Контейнер, но это контейнер для других моделей. А я еще думал, чего это они модель у StringGrid не унаследовали от Models.Model(((
А модели с одним значение базового типа не сильно то и полезны


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: A2. Новая глава
СообщениеДобавлено: Понедельник, 22 Апрель, 2019 13:42 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 631
Ярослав Романченко писал(а):
Так он и останавливается на первой же ошибке.
Если ещё и показывает, где проблема, тогда приемлемо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: A2. Новая глава
СообщениеДобавлено: Понедельник, 22 Апрель, 2019 14:54 

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 717
Откуда: Барнаул
Baikal писал(а):
И снова я уперся в стену)))
А тебе точно нужны модели? Ведь Models.Model и WMComponents.Component происходят от Repositories.Component.
Вполне возможно, что тебя может устроить WMComponents.Component.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: A2. Новая глава
СообщениеДобавлено: Понедельник, 22 Апрель, 2019 18:39 

Зарегистрирован: Пятница, 11 Январь, 2019 19:26
Сообщения: 81
Откуда: Russia
Я хотел простую штуку - сделать модель ObjectList, например, чтобы хранить там данные списка, чтобы расшарить можно с несколькими Отображениями, чтобы хранить в репозитории и восстанавливать. Это модель данных и логично, что оно инкапсулировано в наследнике Models.Model, а не в компоненте, который для другого предназначен. Но логика уперлась в особенности реализации. Либо это очередной концепт или я не умею эту штуку готовить. И еще я не понял, а как предопределенные модели из репозитория значения восстанавливают? Как оно записывается я вижу в методе Write.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: A2. Новая глава
СообщениеДобавлено: Вторник, 23 Апрель, 2019 12:07 

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 717
Откуда: Барнаул
Baikal писал(а):
...
Это же модели, которые работают в связке с наследниками WMProperties.Property.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: A2. Новая глава
СообщениеДобавлено: Вторник, 23 Апрель, 2019 12:46 

Зарегистрирован: Пятница, 11 Январь, 2019 19:26
Сообщения: 81
Откуда: Russia
Вроде нет у моделей никаких ограничений на то, где и в каких связках использовать??? Где об этом написано?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: A2. Новая глава
СообщениеДобавлено: Вторник, 23 Апрель, 2019 12:54 

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 717
Откуда: Барнаул
Ограничений нет. Я говорю о текущем состоянии.
А так - берёшь и пишешь всё, чего там не хватает, не забыв реализовать поддержку в своих виджетах. Чтобы всё сохранялось в репозиторий и восстанавливалось. В общем, настроился "и пошёл зябь пахать, молотить ячмень, Будет долгим, долгим, долгим твой рабочий день..."


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: A2. Новая глава
СообщениеДобавлено: Вторник, 23 Апрель, 2019 12:55 

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 717
Откуда: Барнаул
Посмотри пример в MatrixModels


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: A2. Новая глава
СообщениеДобавлено: Вторник, 23 Апрель, 2019 13:10 

Зарегистрирован: Пятница, 11 Январь, 2019 19:26
Сообщения: 81
Откуда: Russia
Пример посмотрел, но блин, это не то. Потому что все варианты использования этих моделей в а2 подразумевают, что оно имеет только один параметр VALUE. Это уж какая-то специфическая модель.
А мне нужно сохранять в репозиторий совершено разные поля. То есть мне не понятно, если я сделаю то, что мне нужно, нигде потом это не аукнетс? Или все—таки мне лучше не наследоваться от Models.Model, а писать своё?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: A2. Новая глава
СообщениеДобавлено: Вторник, 23 Апрель, 2019 13:23 

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 717
Откуда: Барнаул
А WMMatrixComponents, где используется MatrixModel смотрел?
Та же MatrixModel оперирует ARRAY [*, *] OF REAL, который сериализуется в строку "[[r,r,r,r,r],[r,r,r,r,r]...]". То есть VALUE хранит структурное значение.
Вот почему бы и тебе не хранить там сериализованные в XML данные? Вроде одно значение, а фантазия ничем не ограничена.
Ну или да, писать полностью своё.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: A2. Новая глава
СообщениеДобавлено: Вторник, 23 Апрель, 2019 13:46 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1297
Откуда: Украина, Киев
У VisualComponent есть модель, типа WMProperties.ReferenceProperty:
Код:
   VisualComponent* = OBJECT(Component)
   VAR
      model- : WMProperties.ReferenceProperty;
ReferenceProperty имеет методы сериализации/десериализации:
Код:
   ReferenceProperty* = OBJECT(Property)
      PROCEDURE FromStream*(r : Streams.Reader);
      PROCEDURE ToStream*(w : Streams.Writer);
Код обработчика изменения модели, как я понимаю, на примере компонента Label:
Код:
      PROCEDURE LinkChanged(sender, data : ANY);
      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;
Т.е. в обработчик изменения модели приходит сама модель и мы извлекаем из неё значение строки, в данном случае. А вот код WMProperties.GetModel(model,m):
Код:
(* Get a model from either a property reference or a model pointer *)
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;
Т.е. прослеживается какая-то связь между Model и Property.
И есть модель Container* = OBJECT(Model). Почему нельзя выстроить структуры с вложенными контейнерами?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: A2. Новая глава
СообщениеДобавлено: Вторник, 23 Апрель, 2019 14:39 

Зарегистрирован: Пятница, 11 Январь, 2019 19:26
Сообщения: 81
Откуда: Russia
Да вы чего????? У меня одна проблема, как мне сохранять и восстанавливать атрибуты структурных элементов модели в репозитории, чтобы и транслятор работал и т.д. И что-бы это не порушило работающие концепты. Как мне состыковать с виджетом вообще проблем нет.
Хранить всё в VALUE это вообще не вариант.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: A2. Новая глава
СообщениеДобавлено: Вторник, 23 Апрель, 2019 15:32 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1297
Откуда: Украина, Киев
Вот, я как-то делал набор компонентов для сохранения ДРАКОН схем в 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;


Последний раз редактировалось Ярослав Романченко Вторник, 23 Апрель, 2019 16:55, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: A2. Новая глава
СообщениеДобавлено: Вторник, 23 Апрель, 2019 15:41 

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 717
Откуда: Барнаул
Baikal писал(а):
Хранить всё в VALUE это вообще не вариант.
VALUE это же не значение типа VALUE = блаблабла
Это XML.
<VALUE>
...
</VALUE>
А то, что внутри это XML.Content.
Поэтому, перекрой метод WriteValue, где будут сериализоваться твои данные в XML.
PS: Ещё придётся правильно перекрыть метод FromXML, чтобы восстановить твои данные


Последний раз редактировалось Kemet Вторник, 23 Апрель, 2019 16:29, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: A2. Новая глава
СообщениеДобавлено: Вторник, 23 Апрель, 2019 15:48 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1297
Откуда: Украина, Киев
Kemet писал(а):
Baikal писал(а):
Хранить всё в VALUE это вообще не вариант.
VALUE это же не значение типа VALUE = блаблабла
Это XML.
<VALUE>
...
</VALUE>
А то, что внутри это XML.Content.
Поэтому, реализуй метод WriteValue, где будут сериализоваться твои данные в XML.
А в XML хоть целую базу данных можно запихнуть :roll:


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 206 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7, 8 ... 11  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB