¡Hola a todos!
Esto me recuerda a un caso similar de GH Freebrary. Básicamente lo que tengo es una clase llamada TghForm, derivada de TForm, y la razón de ello es contar con características adicionales para todos mis formularios, entre ellas un método llamado
OpenDataSources, que es similar a la útil función que plantea
Fernando, sólo que lo hace a través de las fuentes de datos (
data sources) que contenga el formulario, sirviendo así, ya sea para los casos donde tengamos los conjuntos de datos (tablas y consultas) en el propio formulario o bien en un módulo de datos (queda abierto a ambos casos). Claro está, debe haber un
DataSource asociado a cada conjunto de datos para que éste sea abierto.
Entonces cuando creo un nuevo formulario, sólo cambio la cabecera
por
Con lo cual, cuando quiero abrir los conjuntos de datos que usa el formulario, sólo llamo al método sin necesidad de parámetros, puesto que es parte de la nueva herencia, y todo queda más orientado a objetos:
procedure TForm1.Button1Click(Sender: TObject);
begin
OpenDataSources;
end;
Aclaro que este no es un caso de herencia visual (que también hay que aprovecharla cuando convenga), ya que TghForm no tiene diseño visual definido (archivo DFM), sólo es .pas, y simplemente sustituyo el nombre de la clase padre en la declaración de los nuevos formularios para hacer que estos deriven de una clase enriquecida con utilidades de uso común que he ido creando para los formularios.
Te recomiendo considerar un esquema similar (la función como método), aunque también hay que ser justos y decir que la principal ventaja de mantener la rutina como función independiente es que podrá aplicarse, sin condiciones especiales de herencia, con cualquier formulario. Esta libertad de acción es la que me ha motivado a crear una cantidad mucho mayor de funciones que de clases, pero en un lenguaje orientado a objetos es bueno poner en la balanza a éstas últimas cada vez que se va a crear algo y tomar una decisión en base a ambos mundos (el funcional y el de los objetos).
Independientemente de lo anterior, considera la posibilidad de que tu rutina trate no sólo con componentes de un tipo específico, sino con todos los que sean derivados de TDataSet (TQuery, TZTable, TADODataSet, TIBQuery, TClientDataSet, TMDOQuery, etc.). Aprovecha el
polimorfismo:
If Components [I] Is TDataSet Then
TDataSet (Components [I]).Open;
Si a alguien le interesa usar o al menos echar un vistazo a GH Freebrary, con gusto pueden descargarla de
aquí. Es
freeware, aunque la haré todavía más libre cuando termine de convertirla al inglés.
Espero haber contribuido positivamente.
Un abrazo abierto.
Al González.