Không xâm nhập vào VCL/phát sinh thành phần tùy chỉnh chỉ có một giải pháp - TForm.SetFocusedControl ghi đè + cài đặt lại vị trí của thanh cuộn như đã nói ở trên. Một điều tôi thêm vào là vô hiệu hóa/kích hoạt cửa sổ vẽ lại để tránh các bước nhảy xấu xí. Đây là đoạn cuối cùng của tôi:
sbContainer là TScrollBox và NoScrCtrl là một điều khiển nằm bên trong nó được lấy tiêu điểm nhưng chúng tôi không muốn nó được cuộn vào chế độ xem.
function TForm1.SetFocusedControl(Control: TWinControl): Boolean;
var hpos, vpos: integer;
begin
if Control = NoScrCtrl then
begin
sbContainer.Perform(WM_SETREDRAW, WPARAM(False), 0);
hpos := sbContainer.HorzScrollBar.Position;
vpos := sbContainer.VertScrollBar.Position;
Result := inherited SetFocusedControl(Control);
sbContainer.HorzScrollBar.Position := hpos;
sbContainer.VertScrollBar.Position := vpos;
sbContainer.Perform(WM_SETREDRAW, WPARAM(True), 0);
sbContainer.Refresh;
end
else
Result := inherited SetFocusedControl(Control);
end;
Vâng, rõ ràng. –
không sử dụng hộp cuộn có vẻ là giải pháp hiển nhiên vì bạn có nhiều thanh cuộn hơn cần thiết –
@David: nếu RichEdit là thành phần duy nhất trên hộp cuộn, tôi đồng ý. Tất nhiên chúng tôi không biết nếu nó là. Đặt một thành phần duy nhất có thanh cuộn riêng của nó trên một hộp cuộn sẽ có một chút ... lạ thật đấy. –