Debes emplear el evento OnCloseQuery, y altervar el valor de la variable CanClose dependiendo de la condición.
Por ejemplo, siguiendo tu ejemplo:
Código Delphi
[-]
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := NOT Button3.Visible;
end;
La variable CanClose determina si puede o debe cerrarse el form. En el ejemplo, si el botón3 está visible, no lo cierra. En caso de no estar visible se cierra.
Saludos,