Можно ли манипулировать потомком TCustomButton таким образом, чтобы щелчок по нему не захватывал фокус другого элемента управления? - PullRequest
0 голосов
/ 08 апреля 2019

В нашей компании мы используем очень мощного потомка TCustomButton.

Для нового приложения мне нужна кнопка, которая в основном ведет себя как «Speedbtn», у которой нет TabStop и, особенно, не крадет фокусдругих элементов управления, таких как, например, TEdit.Мне бы очень хотелось, если бы я мог просто манипулировать нашим потомком TCustomButton, чтобы мне не пришлось писать совершенно новый компонент кнопки, для которого мне пришлось бы реализовать много вещей, которые уже предлагает наш потомок TCustomButton (например,Корпоративный дизайн и т. Д.)

Я знаю, что это непростая задача, потому что, насколько я понимаю, решение о том, что нажатие на кнопку вызывает сообщение, чтобы сосредоточиться (что крадет фокус)Tedit), зависит от реестра в Windows ("TCustomButton.CreateParams" ??).

Если возможное решение слишком много взломать, я, вероятно, даже не буду использовать его в нашей системе,но я все еще был бы весьма заинтересован в этом, потому что я любопытный человек:).

В любом случае, вот мой пример: у меня есть TForm, который содержит только TEdit и потомка TCustomButton, который уже потерялфункциональность (которая изначально была потомком TButtonControl), чтобы получить фокус, если WM_LBUTTONDOWN или WM_LBUTTONDBLCLK появляется в WndProc.

type
  TMyBtn = class (TCustomButton)
  //
  // ...  A lot of self-written stuff
  //
  protected
    procedure WndProc(var Message: TMessage); override;
  public
  //
  // ... A lot of self-written Properties
  //
  end;

type
  TForm2 = class(TForm)
    Edit1: TEdit;
    Button1: TMyBtn;
  end;

implementation

procedure TMyBtn.WndProc(var Message: TMessage);

var
  hProc : procedure (var Message: TMessage) of object;

begin
  // Skip TButtonControl.WndProc and call
  // TWinControl.WndProc instead if Message type
  // is WM_LBUTTONDOWN or WM_LBUTTONDBLCLK
  if not (csDesigning in ComponentState)  then
  begin
    case Message.Msg of
      WM_LBUTTONDOWN, WM_LBUTTONDBLCLK:
      begin
        TMethod(hProc).Code := @TWinControl.WndProc;
        TMethod(hProc).Data := Self;
        hProc( Message);
        exit;
      end;
    end;
  end;

  inherited WndProc(Message);
end;

Что я могу сделать, чтобы TEdit не терял фокус, если TEdit имеет фокус, и я нажимаю на потомка TCustomButton (кроме отключения кнопки илипереориентация TEdit и т. д.)

Большое спасибо за любую помощь заранее.

Если мне не удалось правильно описать мой вопрос, не стесняйтесь задавать мне любые вопросы.

1 Ответ

0 голосов
/ 13 апреля 2019

В качестве ответа я цитирую комментарий Реми Лебо

TCustomButton - это оконный элемент управления. TSpeedBtn - это графический элемент управления. Оконные элементы управления изменяют фокус ввода, а графические - нет. Просто как тот. Ничего не поделаешь, если не последствия.

...