Bueno, lo primero decir que yo también soy partidario de utilizar un componente Tquery estático y pasarle el SQL en tiempo de ejecución, pero como la pregunta era esa respondí a la que se preguntaba.
Se supone que en el formulario hemos puesto en el evento OnClose:
Action:=CaFree;
Con lo cual cuando se cierre el mismo se destruirá todo su contenido.
En cuanto a pulsar repetidas veces el botón no le veo ningún problema más que la constante reasignación de la variable q.
Se puede hacer que dicho botón una vez pulsado quede como no disponible así evitaríamos las repetidas pulsaciones y el rearme de la consulta.
Código Delphi
[-]
procedure TForm1.Button1Click(Sender: TObject);
var
cSql:String;
begin
cSql:='Select * From Employee';
Consulta('DbDemos',cSql);
Button1.Enabled:=False
end;
Un Saludo.