Коллеги,
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)