Вот как вариант т. Денисова выглядит в рабочем коде:
## Код:
```
...
ELSIF (x # 0) & (c.children # NIL) THEN
  p := c.children; br := p;
  WHILE (p # NIL) &
    ~((p.x <= x) & (x < p.x + p.w) &
      (p.y <= y) & (y < p.y + p.h)) DO
    IF p.next = br THEN p := NIL ELSE p := p.next END
  END;
  IF (p # NIL) & (p.do.mouseDown # NIL) THEN
    p.do.mouseDown(p, x - p.x, y - p.y, button)
  END
END
```


Вполне годится. Остальные варианты прочёл только сейчас.
Если использовать вариант без IF'а внутри WHILE'а, то, пожалуй, имеет смысл выделить условие проверки координат в отдельную процедуру. Ещё важно отметить, что перебирать элементы кольца в данной задаче необходимо начиная с первого, то есть с c.children. В этом случае, когда пользователь нажимает мышкой на место на экране, где находятся сразу несколько окнон, то событие будет направлено окну, находящемуся впереди.