TWinControl.CanFocus

oz
Дата: 29.11.2007 21:03:16
Шестая делфя
C:\Program Files\Borland\Delphi6\Source\Vcl\Controls.pas пишет:
...
function TWinControl.CanFocus: Boolean;
var
  Control: TWinControl;
  Form: TCustomForm;
begin
  Result := False;
  Form := GetParentForm(Self);
  if Form <> nil then
  begin
    Control := Self;
    while Control <> Form do
    begin
      if not (Control.FVisible and Control.Enabled) then Exit;
      Control := Control.Parent;
    end;
    Result := True;
  end;
end;
...
Собственно если форма ещё не показана, то при SetFocus произойдёт ошибка. Т.е. я так понимаю, что нужно if (Form <> nil) And (Form.Visible) then... вместо приведённого кода. Если так, то каким образом внести изменения?
Tosh
Дата: 30.11.2007 02:15:19
Никаким - править исходники не есть хорошо (только в очень крайних случаях).
Сделай обработку там, где проверяешь CanFocus - просто поставь дополнительные проверки
NextMan
Дата: 30.11.2007 02:37:48
Обычно достаточно:

if MyControl.CanFocus then
  MyControl.SetFocus 
Tosh
Дата: 30.11.2007 02:42:54
NextMan
Обычно достаточно:

if MyControl.CanFocus then
  MyControl.SetFocus 

Аха ... особенно когда этот самый MyControl не создан или уже уничтожен
NextMan
Дата: 30.11.2007 02:55:48
2 Tosh: Я действительно фигню написал, но речь не о существовании объекта.

Имеется в виду, что TWinConrol.CanFocus может нормально вернуть True, даже если его Parent невидим.

Действительно, тут нужно

  if Assigned(ParentForm) and ParentForm.Visible and MyControl.CanFocus then
    MyControl.SetFocus;

или уж сразу обернуть в процедуру

procedure SetFocusIfPossible(aControl : TWinControl);
begin
  if Assigned(GetParentForm(aControl)) and GetParentForm(aControl).Visible
    and    aControl.CanFocus then
      aControl.SetFocus;
end;
(ИМХО)
Tosh
Дата: 30.11.2007 03:36:00
NextMan
Имеется в виду, что TWinConrol.CanFocus может нормально вернуть True, даже если его Parent невидим.

Хм ... не встречался с такой багой. А по поводу обертки в отдельную процедуру +1
NextMan
Дата: 02.12.2007 15:29:36
Tosh
...не встречался с такой багой.

А ты "потрогай":