2008. szeptember 21., vasárnap

Scroll a TForm through code


Problem/Question/Abstract:

I'm using a form with a TPaintBox element that exceeds the size of the form, so the form has two scrollbars. I want the user to be able to scroll the form using the keyboard (with cursor keys). How can I perform scrolling programmatically? I tried using the TForm.ScrollBy method, but the results are a bit strange.

Answer:

Do not use ScrollBy, instead send WM_VSCROLL messages to the form to make it do the work for you.

procedure TfrmMain.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  case Key of
    VK_DOWN: {scroll down}
      begin
        Perform(WM_VSCROLL, SB_LINEDOWN, 0);
        Perform(WM_VSCROLL, SB_ENDSCROLL, 0);
      end;
    VK_UP: {scroll up}
      begin
        Perform(WM_VSCROLL, SB_LINEUP, 0);
        Perform(WM_VSCROLL, SB_ENDSCROLL, 0);
      end;
  end;
end;

If you use ScrollBy you also have to manually adjust the scrollbar position since it only scrolls the windows client area, completely independent of any scrollbar.

Nincsenek megjegyzések:

Megjegyzés küldése