No es necesario usar un procedimiento recursivo si recorres la colección Components en lugar de Controls. Components contiene todas las componentes insertadas en el formulario durante el diseño.
Para evitar tanto
if puedes usar RTTI (Run Time Type Info):
Código Delphi
[-]
uses
TypInfo;
procedure Form1.Pintar;
var
I: Integer;
Info: PPropInfo;
begin
for I := 0 to ComponentCount -1 do
begin
Info := GetPropInfo(Components[i], 'Color');
if Info <> nil then SetPropValue(Components[i], 'Color', clGreen);
end;
end;
De cualquier forma tendrás el problema de que precisamente hay componentes como un TButton que no pueden pintarse. Creo que tu método de la transparencia estaba mejor.
// Saludos