Se me ocurren varias forma de hacerlo o al menos de probar a ver si funciona.
1) La primera es derivar el componente y reescribir alguno de los procedimientos de TCustomControlList, que es de quien deriva TControlList.
Probaría con el método
Paint o alguno similar.
Código Delphi
[-] procedure Paint; override;
También puedes interceptar alguno de los mensajes de pintado, pero creo que es lo mismo y quedará más claro con los procedimientos.
Código Delphi
[-] ...
procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
procedure WMHScroll(var Message: TWMHScroll); message WM_HSCROLL;
procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
...
2) La segunda opción es interceptar los métodos del componente, por ejemplo, esta prueba rápida parece que funciona.
Código Delphi
[-]...
type
TControlList = class(VCL.ControlList.TControlList)
protected
procedure WMWindowPosChanged(var Message: TWMWindowPosChanged); message WM_WINDOWPOSCHANGED;
end;
...
procedure TControlList.WMWindowPosChanged(var Message: TWMWindowPosChanged);
begin
ShowScrollBar(Handle, SB_VERT, False);
end;
Con esto he comprobado que el scroll vertical no aparece, aunque tal vez esté interceptando "demasiados" mensajes.
3) Es posible que se pueda hacer capturando mensajes utilizando un componente
TApplicationEvents en el formulario. filtrando para que los mensajes sean
sólo del control que te interesa y
sólo los mensajes que te interesan. Algo así:
Código Delphi
[-]procedure TForm3.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
if Msg.hwnd <> ControlList1.Handle then Exit;
if (Msg.message = WM_HSCROLL) or (Msg.message = WM_VSCROLL) then ...
4) Por último, implementando los eventos del control/form, puedes probar directamente a ocultarlas, usando esto:
Código Delphi
[-] ShowScrollBar(ControlList1.Handle, SB_HORZ, False);
ShowScrollBar(ControlList1.Handle, SB_VERT, False);