OberonCore https://forum.oberoncore.ru/ |
|
Views.Old и .OldView: реализация не соотв. документации https://forum.oberoncore.ru/viewtopic.php?f=23&t=6635 |
Страница 1 из 1 |
Автор: | adimetrius [ Пятница, 10 Июль, 2020 00:04 ] |
Заголовок сообщения: | Views.Old и .OldView: реализация не соотв. документации |
Коллеги, Views Documentation писал(а): PROCEDURE Old (ask: BOOLEAN; VAR loc: Files.Locator; VAR name: Files.Name; VAR conv: Converters.Converter): View conv determines the converter which is used for reading the document. conv = NIL means that no conversion is necessary, i.e., the file format already has the standard BlackBox format. Т.е. если передать conv = NIL, то конверсия не должна производиться. И если читать, напр, .png файл этой командой, указав conv = NIL, то должно вернуться res = NIL, т.к. невозможно извлечь Views.View из Png-файла. Однако де-факто реализация (в StdDialog.OldView) вызывает Converters.Import, передавая ему conv Без изменений. Но документация PROCEDURE Converters.Import (loc: Files.Locator; name: Files.Name; VAR conv: Converter; OUT s: Stores.Store) писал(а): If conv = NIL, the first suitable converter in list is used and returned in the VAR parameter. В итоге, де-факто Views.Old, если передан conv = NIL, перебирает все установленные конвертеры, хватает первый попавшийся и читает с его помощью файл. И возвращается некая кирдымырда, поскольку Png не конвертируется в Зрителя. Как вылечить: Кажется, что-то напутано в StdDialog.OldView, там зачем-то введена локальная переменная c: Converters.Converter, какие-то с ней непонятные манипуляции, результат их не используется. Ее нужно удалить, вместо нее в тексте везде использовать формальный параметр conv: Код: c := conv; (* удалить *) IF c = NIL THEN c := Converters.list END; (* use document converter *) (* IF conv = NIL THEN conv := Converters.list END; *) w := Windows.GetBySpec(loc, name, c (* -> conv *), {}); IF w # NIL THEN s := w.doc.ThisView() END; IF s = NIL THEN Converters.Import(loc, name, conv, s); Предлагаю вылечить. Кроме того, уточнить документацию Views.Old: там ничего не сказано про случай, когда импортировать Зритель невозможно, кроме того, ошибочно указано постусловие result = NIL => loc.res # 0 Надо указать, что если заданным конвертером не получается извлечь Зрителя из файла - то возвращается NIL. Де-факто даже сейчас NIL вполне может вернуться, если Converters.Import не найдет подходящего конвертера (это маловероятно, т.к. есть HostTextConv.ImportText, (и .ImportHex, StdETHConv.ImportETHDoc), которые отмечены флагом Converters.importAll, т.е. он-то как раз и "ловит" все, для чего не нашлось спецконвертера, и превращает любой файл в текстовый кирдымырды; полезность этого весьма сомнительна, кмк, и я бы снял с него флажок importAll) |
Автор: | Info21 [ Суббота, 11 Июль, 2020 16:21 ] |
Заголовок сообщения: | Re: Views.Old и .OldView: реализация не соотв. документации |
Если правильно понимаю проблему, то надо лечить. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |