Supongo que deberás poner algo para que refresque la parte gráfica antes de ejecutar Out32:
Código Delphi
[-]
Procedure TPrincipal.LuzRojaOn;
begin
AdvShape1.Appearance.Color:= clWhite;
AdvShape1.Appearance.ColorTo:=clGray;
AdvShape2.Appearance.Color:= clWhite;
AdvShape2.Appearance.ColorTo:=clGray;
AdvShape3.Appearance.Color:=$00D5D5FF;
AdvShape3.Appearance.ColorTo:=$000000D9;
Application.ProcessMessages; Out32($378,4); End
Para ahorrar tiempo en procesos que "no son los importantes" Delphi los deja para "después".
En este caso es el redibujado del formulario.
Para forzar esto, se suele utilizar Application.ProcessMessages, que ejecuta todos los mensajes pendientes antes de seguir con la ejecución del programa (redibijado, eventos de teclado, eventos de raton, etc.).
Si no quieres que el programa procese todos los eventos (puede ser lento si estás dentro de un bucle grande) puedes tratar de enviar la instruccion Repaint o Refresh.
Código Delphi
[-]
...
AdvShape1.Refresh;
AdvShape2.Refresh;
AdvShape3.Refresh;
Out32($378,4); End
o
Código Delphi
[-]
...
AdvShape1.Repaint;
AdvShape2.Repaint;
AdvShape3.Repaint;
Out32($378,4); End
PD. Cuando escribas código ponlo entre tags [ delphi] ... [/ delphi]