> -- Александр Ильин писал(а):
> Ну как, попробовали реализовать? Работает? Какие типичные проблемы встретились? Действительно ли простота кажущаяся?

Нет не пробовал.
Просто я убедился на примере ObxView5:
переписав немного вот так (еще до того как вышел патч устраняющий 100% загрузку процессора)

PROCEDURE (v: View) HandleCtrlMsg (f: Views.Frame;
VAR msg: Controllers.Message;
VAR focus: Views.View);
VAR x, y, w, h: INTEGER; m: SET; isDown: BOOLEAN;
BEGIN
WITH msg: Controllers.PollOpsMsg DO
msg.valid := {Controllers.paste}; msg.selectable := TRUE;
msg.type := "Obx.Tutorial"
| msg: Controllers.EditMsg DO
IF msg.op = Controllers.pasteChar THEN	(* cursor keys *)
IF msg.char = 1DX THEN INC(v.x, Ports.mm)
ELSIF msg.char = 1CX THEN DEC(v.x, Ports.mm)
ELSIF msg.char  = 1EX THEN DEC(v.y, Ports.mm)
ELSIF msg.char  = 1FX THEN INC(v.y, Ports.mm)
END;
Views.Update(v, Views.keepFrames)
END
| msg: Controllers.TrackMsg DO
v.x := msg.x; v.y := msg.y;
v.context.GetSize(w, h); v.Restore(f, 0, 0, w, h);
f.Input(x, y, m, isDown);
doUpdate := isDown;
| msg: Controllers.PollCursorMsg DO
msg.cursor := Ports.graphicsCursor;
f.Input(x, y, m, isDown);

IF isDown THEN
IF (x # v.x) OR (y # v.y) THEN
v.context.GetSize(w, h);
v.x := x; v.y := y; v.Restore(f, 0, 0, w, h);
END;
END;
IF ~isDown & doUpdate THEN
doUpdate := FALSE;
Views.Update(v, Views.keepFrames);
END;
ELSE	(* ignore other messages *)
END
END HandleCtrlMsg;

Что схема должна работать, что процессор не грузится.
Ввести надо еще дополнительное сообщение типа Controllers.MouseUpMsg а дальше понял, что надо ...подсистему Host переписать и
много чего еще, чтобы избавиться по всему коду от REPEAT f.Input(x, y, m, isDown) UNTIL ~isDown;