вторник, 21 мая 2013 г.

Чудесный ужас №2

Первая серия была тут - http://18delphi.blogspot.com/2013/05/blog-post_6566.html

Я конечно уважаю "Остап Ибрагимыча".

И я могу найти - МИЛЛИОН доводов - почему, код приведённый ниже - написан так, а не иначе. НО! Очень сложно будет убедить меня, что он "не пахнет".


Чудесный ужас №2:
....
    property ActiveControl: TWinControl read FActiveControl write SetActiveControl
      stored IsForm;
...
procedure TCustomForm.Loaded;
var
  Control: TWinControl;
begin
  inherited Loaded;
  if ActiveControl <> nil then
  begin
    Control := ActiveControl;
    FActiveControl := nil;
    if Control.CanFocus then SetActiveControl(Control);
  end;
end;
и ХЕ:
procedure TCustomForm.Loaded;
var
  Control: TWinControl;
begin
  inherited Loaded;
  if (ActiveControl <> nil) and ((Parent = nil) or not (csDesigning in ComponentState)) then
  begin
    Control := ActiveControl;
    FActiveControl := nil;
    if Control.CanFocus then SetActiveControl(Control);
  end;
– называется - "чота мы залатали"... Но глаз - даже не резануло.. :-( Жалко, что у людей не сработало "чувство запаха".
А ведь 80% этого "ужаса" снялось бы введением метода ForceSetActiveControl.
Но у меня есть МНОГО претензий к коду Borland'а в части обработки фокуса, особенно при наличии докинга.
... to be continued ...

P.S. До придумки Apple в xCode - ShowContextMenuForView, BecomeFirstResponder и CanBecomeFirstResponder - этому коду конечно далеко. Apple - "умнее" - он исходные коды не даёт. А то бы - я наверное многое бы там почерпнул....

P.P.S. А для докинга там есть продолжение. ActiveControl - не всегда в итоге устанавливается. Ибо CanFocus не всегда true.

P.P.P.S Опять спросили "ЗАЧЕМ я всё это пишу". Да ни зачем собственно. Просто чтобы привлечь внимание к вещам, которые меня волнуют. Заставить задуматься. А не потому, что я верю в то, что "кто-то исправит" или "кто-то прислушается". Просто есть хороший повод показать - как я бы делал бы и как я бы не делал бы.

Комментариев нет:

Отправить комментарий