Este tipo de comprobaciones suelen ser complejas, si está en el edit específico, si tiene texto distinto de la cadena vacía, etc.
Puedes crear un procedimiento llamado, por ejemplo: DoEnableSearchButton
Ese procedimiento mira si se cumple todas las comprobaciones y pone el boton en Enable o false. Tendrás que llamar a ese procedimiento cada dos por tres. Yo lo haría de la forma más eficiente aunque ilegible... es mi opinión personal, algunas veces lo he hecho así:
Código Delphi
[-]
procedure TForm1.DoEnableSearchButton;
begin
SearchButton.Enabled := (Trim(edit1.text) <> EmptyStr) and
(Checkbox1.Checked) and
(Radiobutton1.itemindex in [1..3]);
end;
Otra solución más sencilla, dejar el botón siempre habilitado, al pulsar el botón haces las comprobaciones, si no se puede continuar por algún error, muestras tu mensaje personalizado:
Código Delphi
[-]
type ENoSeguir = class Exception ;
procedure TForm1.SearchButtonClick(...);
begin
if trim(edit1.text) = EmptyStr then
begin
Edit1.SetFocus;
raise ENoSeguir.Create('Debe indicar el texto a buscar en la caja Nombre Cliente');
end;
AbrirConsultaConParametro(Edit1.Text);
end;
Esto significa que si el usuario no escribe nada, se lanza una excepción con el texto mostrado. Esto hace que se corte el flujo normal de ejecución y jamás se ejecutará "AbrirConsultaConParametro", y el foco se queda en el Edit1.
En el caso de que haya escrito algo en el Edit1, se abrirá la consulta y no obtiene errores.
Para el tema del foco sobre el botón, ¿puedes usar un SpeedButton en lugar de un TButton?, si es así, el SpeedButton no captura el foco del ratón, por tanto, al pulsar el Speedbutton puedes usar algo asï:
Código Delphi
[-]
if Form1.ActiveControl = edit1 then
begin
lo que sea
end;
Saludos