Senza hacking in VCL/derivazione di componenti personalizzati, c'è una sola soluzione: TForm.SetFocusedControl esegue l'override + re-imposta le posizioni delle barre di scorrimento come sopra detto. Una cosa che ho aggiunto è disabilitare/abilitare il ridisegno della finestra per evitare brutti salti. Ecco il mio ultimo frammento:
sbContainer è TScrollBox e NoScrCtrl è un controllo che si trova al suo interno che ottiene lo stato attivo ma non vogliamo che venga visualizzato in modalità a scorrimento.
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;
Sì, è chiaro. –
non utilizzare la casella di scorrimento sembra essere la soluzione più ovvia poiché si dispone di più barre di scorrimento del necessario. –
@David: se RichEdit è l'unico componente della casella di scorrimento, sono d'accordo. Certo che non sappiamo se lo è. Mettere un singolo componente che ha le sue barre di scorrimento su una casella di scorrimento sarebbe un po '... strano, davvero. –