Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Objecto como parámetro (https://www.clubdelphi.com/foros/showthread.php?t=71252)

rhino0nt 09-12-2010 19:13:18

Objecto como parámetro
 
Tengo el siguiente código que se encarga de llenar un TComboBoxEx con los datos de un dataset ya definido con el fin de agregar una opción que es "Todos" y ademas usar el campo ID como identificador en el arreglo generado para los elementos del TComboBoxEx:

Código:

procedure TfmPrincipal.CargarBloques();
begin
  if dmDatos.qyBloques.Active = False then
    dmDatos.qyBloques.Active := True
  else
    dmDatos.qyBloques.Refresh;

  if dmDatos.qyBloques.RecordCount > 0 then
  begin
    dmDatos.qyBloques.First;
    cbBloques.Items.Clear;
    cbDetBloques.Items.Clear;
    cbBloques.Items.AddObject('Todos', TObject(0));
    while dmDatos.qyBloques.Eof = False do
    begin
      cbBloques.Items.AddObject(dmDatos.qyBloquesDESCRIPCION.AsString,
        TObject(dmDatos.qyBloquesID.AsInteger));
      dmDatos.qyBloques.Next;
    end;
    cbBloques.ItemIndex := 0;
  end;
end;

Ahora, me encuentro que en otras formas también necesito rellenar algunos TComboBoxEx con información y no quiero volver a repetir la rutina. Esto además lo hago porque este dataset esta ligado a una base de datos que pertenece a otro sistema y no quiero tenerla abierta demasiado tiempo para evitar errores de concurrencia.

Mi duda es, si ese código lo necesito para cargar otros combos en otras formas, como puedo hacer para que este sea independiente del TComboBoxEx que este llenando, pasando el TComboBoxEx que voy a llenar como parámetro.

De antemano, Gracias.

roman 09-12-2010 21:50:06

Pues no tienes sino que declarar el parámetro y pasar el objeto deseado cuando quieras usarlo:

Código Delphi [-]
procedure TfmPrincipal.CargarBloques(cbBloques: TComboBoxEx);
begin
  ...
end;

// Saludos

rhino0nt 10-12-2010 00:50:46

Objeto como Variable
 
Roman,

Haciendo honor a tu cita, como bien comentas si lo paso de esta manera funciona correctamente dentro de la misma unidad, pero como te comento tengo varios forms que cargan el mismo dataset, como hago para que estos utilicen el mismo procedimiento.

De antemano, Gracias.

Neftali [Germán.Estévez] 10-12-2010 12:12:10

En estos casos, yo sigo unos sencillos pasos:

(1) Eliminar el procedimiento del formulario, para hacerlo no dependiente de esa clase. Crear la cabecera fuera de la clase del form.

Esto lo cambias por esto otro:
Código Delphi [-]
procedure TfmPrincipal.CargarBloques();

procedure CargarBloques();

En la parte de Interface deberás definir esa función:

Código Delphi [-]
procedure CargarBloques();

Ahora si compilas, es posible que te devuelva fallos de "objetos" que no encuentra. Los que antes estaban en la misma clase del form y ahora no. Esos serán los que debas pasar como parámetros.

(2) Crear los parámetros.
Si falla cbBloques, deberás crear un parámetro para ese objeto (como a comentado Román); Le añades una "A" delante para diferenciarlo:

Código Delphi [-]
procedure CargarBloques(AcbBloques:TComboBoxEx);
begin
  if dmDatos.qyBloques.Active = False then
    dmDatos.qyBloques.Active := True
  else
    dmDatos.qyBloques.Refresh;

  if dmDatos.qyBloques.RecordCount > 0 then
  begin
    dmDatos.qyBloques.First;
    AcbBloques.Items.Clear;
....

Y vas repitiendo el proceso con el resto de variables que "fallen".

Cuando ya los tengas todos sustituídos, para hacer la llamada has de usar los objetos que has cambiado anteriormente.


Código Delphi [-]
  CargarBloques(cbBloques, ...);


La franja horaria es GMT +2. Ahora son las 13:03:37.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi