OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 20:54

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




Начать новую тему Ответить на тему  [ Сообщений: 53 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 21 Март, 2006 13:15 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
хе, перекопировал текст с испорченными комментариями обратно в ББ - комментарии стали снова показываться нормально :-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 22 Март, 2006 04:58 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Вот такой вариант работает:
Код:
MODULE FuzzyTest;
IMPORT Files, Dialog;

PROCEDURE Work* ();
VAR
   loc : Files.Locator;
   name : Files.Name;
BEGIN
   loc := NIL; name := "";
   Dialog.GetIntSpec("fis", loc, name);
END Work;

END FuzzyTest.


DevLinker.LinkDll
MyDll.dll := National Kernel+ Files HostFiles Math Log Meta Dialog Strings Dates Fonts Ports Stores Services Converters Sequencers Models Views Controllers Properties Printers Printing Mechanisms Containers Documents Windows StdCFrames Controls StdDialog StdApi StdCmds StdInterpreter HostRegistry HostFonts HostPorts OleData HostMechanisms HostWindows HostPrinters HostCFrames HostDialog HostClipboard HostCmds HostMenus FuzzyTest#

Диалог вылазит без ошибок.

Если брать исходный вариант (я его переименовал в FuzzyBug), то рабочая команда такая:
DevLinker.LinkDll
MyDll.dll := National Kernel+ Files HostFiles Math Meta Log Strings Dates Dialog Stores Sequencers Models Services Fonts Ports Converters Views Controllers Properties Mechanisms Containers Printers Printing Documents Windows StdCFrames Controls StdDialog StdApi StdCmds StdInterpreter HostRegistry HostFonts HostPorts OleData HostMechanisms HostWindows HostPrinters HostCFrames HostDialog HostClipboard HostCmds HostMenus TextModels TextMappers TextRulers TextSetters TextViews Services TextModels HostTextConv FuzzyIniFile FuzzyFIS FuzzySets FuzzyModel FuzzyBug#

При этом перед выводом диалога вылазит сообщение об ошибке явно Блэкбоксового происхождения "text controller installation failed". Генерируется оно в процедуре TextViews.Init (хочет вызвать TextControllers.Install, которого нет). Добавлять для компоновки TextControllers нельзя - циклический импорт. Остаётся использование LinkDynDll и включение в компоновку StdLoader. Но тут вылазит другая проблема - StdLoader запускает основной цикл Блэкбокса и показывает его окно. Если закрыть - появится искомый диалог и всё будет дальше работать. В любом случае в раздел инициализации модуля с процедурой Work надо вставить
Код:
Converters.Register("HostTextConv.ImportText", "HostTextConv.ExportText", "TextViews.View", "txt", {Converters.importAll});

иначе текст не загрузится.

Пути решения - либо переделать код без TextViews (и Views вообще) либо лечить StdLoader, HostDialog и иже с ними.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 22 Март, 2006 06:50 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Чтобы избежать использования Views, можно попользоваться исходниками HostTextConv.ImportText, а именно:
Код:
PROCEDURE ImportText* (f: Files.File; OUT s: Stores.Store);
VAR r: Stores.Reader; t: TextModels.Model; wr: TextModels.Writer; ch, nch: SHORTCHAR;
BEGIN
   ASSERT(f # NIL, 20);
   r.ConnectTo(f); r.SetPos(0);
   t := TextModels.dir.New(); wr := t.NewWriter(NIL);
   r.ReadSChar(ch);
   WHILE ~r.rider.eof DO
      r.ReadSChar(nch);
      IF (ch = CR) & (nch = LF) THEN r.ReadSChar(nch)
      ELSIF ch = LF THEN ch := CR
      END;
      (* WriteWndChar(wr, ch); <- перекодировка Latin1->Unicode, нам не нужна *)
      wr.WriteChar(ch); (* поэтому мы так обойдёмся *)
      ch := nch
   END;
   (* s := TextViews.dir.New(t) <- вот она, нехорошая *)
   s := t (* <- а вот как надо *)
END ImportText;

Только русский текст она может покорёжить, но у Вас вроде таких проблем нет


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 22 Март, 2006 08:55 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Цитата:
Добавлять для компоновки TextControllers нельзя - циклический импорт.

Добавить можно.
DevLinker.LinkExe Fuzzy:= Kernel+ Files HostLocale HostFiles
Math Strings Dates Log Dialog National
Services Fonts Ports Meta Stores Sequencers Models Converters Views Controllers Properties Mechanisms Containers Printers Printing Documents
Windows Containers StdDialog StdApi StdCmds StdInterpreter
HostRegistry HostFonts HostPorts OleData HostMechanisms HostWindows HostPrinters StdCFrames HostCFrames HostDialog HostClipboard
HostCmds HostMenus TextModels Properties TextRulers TextSetters TextViews TextMappers TextControllers HostTextConv
IniFile FuzzyFIS FuzzySets FuzzyModel MyIni$
Так собирается, но не работает. TextControllers.Install вызывается до инициализации. Обойти можно так.
Код:
PROCEDURE Install*;
  BEGIN
   IF (dir = NIL) THEN Init END; (*<- *)
    TextViews.SetCtrlDir(dir)
  END Install;
[/b]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 22 Март, 2006 09:05 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Trurl писал(а):
DevLinker.LinkExe Fuzzy:= Kernel+ Files HostLocale

А это что такое и как выглядит?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 22 Март, 2006 09:06 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Цитата:
Но тут вылазит другая проблема - StdLoader запускает основной цикл Блэкбокса и показывает его окно.

Вообще, StdLoader просто загружает Init. А его поправить - не проблема.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 22 Март, 2006 09:09 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Поправить не проблема. Проблема в том, что это модуль поставки Блэкбокса. Скорость размножения вариантов которой желательно бы ограничить


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 22 Март, 2006 09:21 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Ivor писал(а):
Trurl писал(а):
DevLinker.LinkExe Fuzzy:= Kernel+ Files HostLocale

А это что такое и как выглядит?

А, это - лишнее. Это у меня "юникодизированный" ББ и там собрани всякие перекодировки.

Цитата:
Поправить не проблема. Проблема в том, что это модуль поставки Блэкбокса. Скорость размножения вариантов которой желательно бы ограничить

Поскольку Init -головной модуль приложения, а мы собираем не Блэкбокс, а свое собственное приложение, ничего страшного в этом нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 22 Март, 2006 09:33 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Trurl писал(а):
Поскольку Init -головной модуль приложения, а мы собираем не Блэкбокс, а свое собственное приложение, ничего страшного в этом нет.

Получется танец с бубнами: запускаем Блэкбокс, правим модуль (System)Init, компилируем его, компилируем наше приложение, ..., перед выходом из Блэкбокса возвращаем старый (System)Init взад, чтобы Блэкбокс в следующий раз правильно запустился.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 22 Март, 2006 13:36 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Короче говоря, собрал требуемый DLL. Перед этим повозился с трассировкой Kernel (поюзал Beep и WinApi.ShowMessage :-) ). Попутно открыл для себя много интересных вещей. Значительную часть выше уже сказали, но я позволю себе все это обобщить:

1) Link и LinkDynDll собирают бинарник динамического формата. Одно его отличие, как уже говорилось, в том, что инициализация модулей автоматически не выполняется, управление просто передается на BEGIN главного модуля, помеченного $, а уже этот модуль вызывается секции BEGIN остальных модулей в правильном порядке. Кроме того, должен быть некий модуль ядра (помечается +). Как описано в документации, Kernel должен экспортировать процедуры для выделения памяти. Другая особенность динамического формата (о которой документация скромно молчит) в том, что к моменту передачи управления на BEGIN главного модуля регистр EBX содержит в себе указатель на список всех линкованных модулей в формате Kernel.Module. Kernel BEGIN помещает этот указатель в переменную Kernel.modList - потом в этот список добавляются динамически подгружаемые модули, и на основе этой информации работает ДЗАГР и метапрограммирование.
Посему если мы используем Run-Time Блэкбокса, то обязаны использовать динамический формат компоновщика, иначе Kernel просто не сможет работать.

2) Затем Kernel BEGIN передает управление на Kernel.Init, который проходит по modList и вызывает их секции инициализации. (Секция BEGIN главного модуля будет вызываться дважды - второй раз в процессе инициализации, поэтому главный модуль должен проверять, первый ли раз он вызыван).

Ошибка при загрузке вашей DLL возникала при инициализации модуля TextModels, когда тот обращался к Fonts. Но Fonts, как и многие другие модули System, всего лишь объявляет абстрактные переносимые типы, а реализацию под них (dir'ы) предоставляет подсистема Host, которая в вашем списке модулей почти полностью отсутствовала. Ее модули ниоткуда не импортируется (поэтому явно не требуются), но при своей инициализации они подставляют конкретную реализацию в модули System (чаще всего через их SetDirectory). Я попробовал не включать кое-какие модули, однако в конечном счете оказывается, что весь System и Host настолько тесно связано, что исключить нельзя (почти) ничего, список модулей, приведенный в DevLinker, действительно минимален (ну, кроме пары-тройки модулей):

DevLinker.LinkDynDll
MyDll.dll := National Init Kernel$+ Files HostFiles StdLoader Math Strings Dates Meta Dialog Services
Fonts Ports Stores Log Converters Sequencers Models Printers Views
Controllers Properties Printing Mechanisms Containers
Documents Windows StdCFrames Controls
StdDialog StdApi StdCmds StdInterpreter
HostRegistry HostFonts HostPorts OleData HostMechanisms HostWindows
HostPrinters HostClipboard HostCFrames HostDialog HostCmds
HostMenus HostPictures
TextModels TextRulers TextSetters TextViews TextMappers
IniFile FuzzyFIS FuzzySets FuzzyModel MyIni#

При таком списке модулей получаем работающую наконец-то DLL размером 900Кб.

3) При инициализаци модуля StdLoader он подставляет в Kernel конкретную реализацию загрузчика модулей (тип LoaderHook), вызывая Kernel.SetLoaderHook. Затем он загружает в память модуль Init. При своей инициализации Init производит запуск GUI среды. GUI нам не нужен (да я и не уверен, что в виде DLL он будет работать, у меня возникла ошибка). Поэтому сделаем новый Init-пустышку:

MODULE Init;
END Init.
откомпилируем его и прилинкуем статически, выше в список модулей я его уже включил, можно в любое место, я засунул даже перед Kernel для наглядности. После этого можно удалить из корневой ББ папки Code и Sym - новая версия Init успешно прибьется, будет рабоать снова старая, из System/Code.

Все, рабочий DLL получили. У меня успешно открылся ваш диалог открытия файла.

4) И последнее - в вашем списке не было National, т.е. Вы используете чистый ББ, без Service Pack. Советую их поставить, иначе рано или поздно налетите на уйму проблем с русскими кодировками.

Вроде все...


Последний раз редактировалось Илья Ермаков Среда, 22 Март, 2006 13:42, всего редактировалось 3 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 22 Март, 2006 13:38 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
А, вот еще! Если вам нужна установка файловых конверторов для разных форматов текста, то перенесите ее в свой Init из стандартного Config.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 22 Март, 2006 13:41 
Аватара пользователя

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 13:17
Сообщения: 84
Откуда: Россия, Мурманск
Ivor писал(а):
Получется танец с бубнами: запускаем Блэкбокс, правим модуль (System)Init, компилируем его, компилируем наше приложение, ..., перед выходом из Блэкбокса возвращаем старый (System)Init взад, чтобы Блэкбокс в следующий раз правильно запустился.

Мдааа.. Это точно. Как-то бы это всё обобщить.... Вообще, что касается линкера, то очень хоцца его переделать. Ну окололинкерные дела. Типа циклов обработки сообщений, процедуры Init и т.д.
Составить бы тех.задание, решить сообща что нужно в результате и реализовать. Да только, вот беда: статус BlackBox всё же не OpenSource. Так что... Попросить разработчиков что-ли? Порядок навести. А так довольно трудно использовать BB в самостоятельных проектах.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 22 Март, 2006 13:48 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Цитата:
Получется танец с бубнами


Никакого танца с бубнами не получается. При компиляции любого из модулей System его ocf кладется не в System/Code, а в корневой Code, т.е. не заменяет, а всего лишь перекрывает стандартный. Всегда можно удалить его из корневого Code, а System останется в целости и сохранности. А исходники своих версий можно вообще хранить в любой папке.

На мой взгляд, весь RTS Блэкбокса устроен очень разумно - нужно только внимательно разбираться с ним. Расширяется все очень легко, но обратная сторона в том, что расширяемость обеспечивается разными неявными динамическими связями между модулями, которые в документации описываются поверхностно, а для отслеживания их по исходникам требуется внимание и опыт.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 22 Март, 2006 15:50 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
sacred писал(а):
Да только, вот беда: статус BlackBox всё же не OpenSource.

Как же, не OpenSource?!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 23 Март, 2006 01:20 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
Библиотеки собраные LinkDll стартуют несколько быстрее. Посему имеет смысл так группировать модули, чтобы циклических зависимостей не было вовсе. По крайней мере в собственных разработках.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 23 Март, 2006 03:01 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Это да! Однако Kernel и Framework-то поюзать всем хочется :-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 23 Март, 2006 03:04 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Цитата:
циклических зависимостей не было вовсе. По крайней мере в собственных разработках.


Хм... А как без них? Отказаться от разделения на абстрактный тип и скрытую реализацию? Так сложно обеспечить общность и расширяемость...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 23 Март, 2006 08:43 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Илья Ермаков писал(а):
Это да! Однако Kernel и Framework-то поюзать всем хочется :-)

Ну, Kernel можно юзать и в статически собранных программах/библиотеках. А вот Framework приходицца тянуть целиком.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 23 Март, 2006 10:59 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Цитата:
Kernel можно юзать и в статически собранных программах


А Вы пробовали? У меня не работало. И не должно, по идее, работать - Kernel ожидает именно DynLink...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 23 Март, 2006 20:52 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
Угу... От абстрактных типов отказываться не будем. И вообще, чтобы что-то запрещать должны быть веские причины. Речь идет лишь о желательности того или иного подхода.


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

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


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

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


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

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