> -- Илья Ермаков писал(а):
> Вообще говоря, для правильной перерисовки не надо делать НИЧЕГО, кроме как обеспечить Restore, который эту перерисовку делает. Остальное делает среда. Значит, что-то не то в Restore.Полосы прокрутки используете стандартные - StdScrolllers? Во-первых, что-то обрабатывается только после вызова Dialog.Update для линкованного интерактора. Во-вторых, надо, чтобы при Restore происходил в случае необходимости пересчет и изменение размера отображения. Остальное сделает автоматика.
## Код:
```
PROCEDURE (v: Control)  Restore* (f: Views.Frame; l, t, r, b: INTEGER);
```

Так с Restore разобрался. Я думал, что l, t, r, b - это границы отображения, а это оказывается границы прямоугольника внутри отображения, который надо перерисовать!

Однако, с прокруткой всё так же плохо. И не обновляется при изменении данных.
Как сделать, чтобы при Restore происходил пересчет и изменение размера отображения? Надо кому-то какое-то сообщение послать, так? Кому и какое?
## Код:
```
PROCEDURE (v: Control) HandleCtrlMsg2- (f: Views.Frame;
                        VAR msg: Controllers.Message; VAR focus: Views.View);
VAR
   w, h : INTEGER;
   changed : BOOLEAN;
   Data : TableValue;
   ok : BOOLEAN;
BEGIN
   IF v.item.Valid() THEN
      v.item.GetVal(Data, ok);
   ELSE
      ok := FALSE;
   END;
   changed := TRUE;
   WITH msg: Controllers.ScrollMsg DO
      v.context.GetSize(w, h);
      IF msg.vertical THEN
         CASE msg.op OF
            Controllers.decLine: IF v.RowOrigin>0 THEN DEC(v.RowOrigin); END;
            |Controllers.incLine: IF v.OriginHeight()+h<v.Height() THEN INC(v.RowOrigin); END;
            |Controllers.decPage: IF v.RowOrigin>0 THEN DEC(v.RowOrigin); END;
            |Controllers.incPage: IF v.RowOrigin<Data.table.RealData.RowCount() THEN INC(v.RowOrigin); END;
            |Controllers.gotoPos: v.RowOrigin := RoundedDIV(msg.pos, v.RowHeight(-1) (*DIV 1000*));
         END;
      ELSE
         CASE msg.op OF
            Controllers.decLine: IF v.ColOrigin>0 THEN DEC(v.ColOrigin); END;
            |Controllers.incLine: IF v.OriginWidth()+w<v.Width() THEN INC(v.ColOrigin); END;
            |Controllers.decPage: IF v.ColOrigin>0 THEN DEC(v.ColOrigin); END;
            |Controllers.incPage: IF v.ColOrigin<Data.table.RealData.ColCount() THEN INC(v.ColOrigin); END;
            |Controllers.gotoPos: v.ColOrigin := RoundedDIV(msg.pos, v.ColWidth(-1) (*DIV 1000*));
         END;
      END;
      msg.done := TRUE;
      IF changed THEN Views.Update(v, Views.keepFrames) END
   | msg: Controllers.PollSectionMsg DO 
      v.context.GetSize(w, h);
      IF msg.vertical THEN
         msg.wholeSize := v.Height() (*DIV 1000*);
         msg.partSize := h (*DIV 1000*);
         msg.partPos := v.OriginHeight() (*DIV 1000*);
      ELSE
         msg.wholeSize := v.Width() (*DIV 1000*);
         msg.partSize := w (*DIV 1000*);
         msg.partPos := v.OriginWidth() (*DIV 1000*);
      END;
      
      msg.valid := msg.partSize < msg.wholeSize;
      msg.done := TRUE
   ELSE
   END;
END HandleCtrlMsg2;
```

Полосы прокрутки - стандартные, когда надо вызывать Dialog.Update ?


P.S.

Посмотрел - моему контролу никогда не передаётся сообщение Controllers.PollSectionMsg. Как сделать чтобы оно передавалось?