Спасибо за помощь, коллега, но почему-то у меня ваш пример не срабатывает. Компилится без ошибок, но на нажатия стрелок, да и вообще любых кнопок на клавиатуре, никак не реагирует((
Я решил использовать подмену оконной процедуры у ScrollBox1:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
ScrollBox1: TScrollBox;
procedure FormCreate(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
private
OldScrollBoxWinProc: TWndMethod;
procedure NewScrollBoxWinProc(var Message: TMessage);
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
ScrollBox1.VertScrollBar.Range := 1000;
OldScrollBoxWinProc := ScrollBox1.WindowProc;
ScrollBox1.WindowProc := NewScrollBoxWinProc;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
VK_UP:
ScrollBox1.VertScrollBar.Position := ScrollBox1.VertScrollBar.Position - 10;
VK_DOWN:
ScrollBox1.VertScrollBar.Position := ScrollBox1.VertScrollBar.Position + 10;
end;
end;
procedure TForm1.NewScrollBoxWinProc(var Message: TMessage);
begin
if Message.Msg = WM_GETDLGCODE then
Message.Result := DLGC_WANTARROWS
else OldScrollBoxWinProc(Message);
end;
end.
Идея подсмотрена
здесь
Все больше склоняюсь к тому, что в хелперах действительно нельзя обработчики сообщений добавлять. Много нехорошего про них прочитал и для себя уже решил ими не пользоваться. Но докопаться до истины все-таки хочется - поэтому оставлю пока вопрос открытым.