Всем привет!

Как я уже писал в теме "BlackBox Framework/ Активные компоненты", я работаю над собственной подсистемой Mate. У меня есть компонент MateViews.View, отображающий последнее полученное значение какого-либо параметра системы отопления. Например, "температура воздуха на первом этаже". В общем, число с плавающей точкой. Другой вариант - битовая маска вида "00101001" (8 бит). Поскольку для всех целей использую один и тот же компонент, хотел сделать так, чтобы его размер по ширине автоматически устанавливался в зависимости от отображаемого текста. Для этого нашел процедуру Models.Context.SetSize. Возникло 2 проблемы:

1. При каждом вызове SetSize документ-контейнер помечается как "грязный" (dirty), то есть, требующий сохранения. Но мои компоненты автоматически выставляют свой размер, так что на самом деле его сохранять не требуется. Попытки сделать изменение "чистым" не приводят к желаемому результату:

## Код:
```
PROCEDURE (v: View) HandleModelMsg- (VAR msg: Models.Message);
  VAR w, h: INTEGER;
BEGIN
  WITH msg: MateModels.UpdateMsg DO
    GetAutoSize(v, w, h);
    Models.BeginModification(Models.clean, v.context.ThisModel());
    v.context.SetSize(w, h);
    Models.EndModification(Models.clean, v.context.ThisModel());
  ELSE
  END;
  Views.Update(v, Views.keepFrames)
END HandleModelMsg;
```

При этом если вместо Models.clean подставить Models.notUndoable или Models.invisible, то изменение размера становится невозможно отменить либо оно становится невидимым соответственно. Значит, эти модификаторы влияют на характеристику операции. Но Models.clean не работает! Это что, глюк или так и было задумано? Почему так может быть?

2. Я не совсем понял, как правильно делать поправку на рамку при вычислении автоматического размера для компонента. Чтобы узнать размер текста, нужно запросить текущий шрифт контекста, потом померить строку с помощью Fonts.Font.GetBounds и Fonts.Font.StringWidth. Чтобы нарисовать рамку толщиной в один пиксель, нужно использовать Frames.Frame.dot. А как заранее посчитать размер компонента вместе с рамкой, когда Frames.Frame еще нет? Хотелось бы иметь решение, которое бы работало для любого Frame, в том числе при печати на лазерном принтере. Наверное, нужно отвязаться от ширины "пикселя", но альтернативы в голову не приходят... 1/12 высота буквы? Что взять за ориентир, буду признателен за любой совет.

При работе обнаружил интересную и неочевидную особенность: оповещения не приходят к невидимым View. Это значит, что приведенный выше код работает только для тех View, которые хотя бы частично видны на экране. Если View не видно из-за прокрутки, к нему не придет оповещение. Следовательно, код установки автоматического размера необходимо продублировать в процедуре Restore.