Eu estava com um problema parecido. Num tutorial eu aprendi como mudar a aparencia de um sistema criado em Delphi em tempo de execução. Mas fazer login no sistema eu abria o form onde tenho a lista de aparencias, mas ao selecionar o estilo desejado tinha esta mesma mensagem de erro "Cannot change visible in OnShow or OnHide." Eu procurei descobrir como resolver e solucionei assim,
if dm.Q_LOGIN.RecordCount >0 then
begin
//SE FOR LOCALIZADO
MessageDlg('Seja bem vindo Sr.',mtInformation,[mbOk],0);
dm.usuario:=ed_nome.Text; //PEGA O NOME DO USUARIO
dm.tipo_usuario:=cb_tipo.Text; //PEGA O TIPO DE USUARIO
frm_principal:=Tfrm_principal.Create(self); //ABRE O FORM PRINCIPAL
frm_login.Hide;
frm_principal.Show;
contagem:=0;
end
Observe que digitei "frm_login.Hide" logo após a criação do form principal. Isso resolveu meu problema.
O problema era que o form login não poderia receber a nova aparencia(estilo) enquanto fosse visível. Porisso ao esconde-lo (hide= ocultar), não tive mais o erro.