Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Uso de units para cada modulo (https://www.clubdelphi.com/foros/showthread.php?t=87422)

martini002 02-01-2015 23:46:27

Uso de units para cada modulo
 
Hola amigos,

Intentando mejorar la forma en la que programamos en Delphi me surgio la siguiente duda:

Como puedo separar las rutinas o procedimientos en diferentes unidades
dependiendo del modulo que este programando?
Ejemplo,
Una aplicacion que maneje asistencia y nomina

Tenemos la unidad principal, donde se escribiran las rutinas
para la gran mayoria de los controles que tengamos, como botones, listas, combos etc.

Tenemos procedimientos propios, como por ejemplo cargar de la BD los empleados en una lista del form principal
que esta en la unidad principal.

La pregunta en concreto es, como podria mover ese procedimiento de carga de empleados a otra unidad?

Para ser mas explicito, tengo el TListBox en la UPrincipal donde se encuentra tambien el form,
y seria ideal colocar el procedimiento de carga en la otra unidad.

Código Delphi [-]
procedure TFPrincipal.CargarEmpleados;
begin
  ZQuery1.Close;
  ZQuery1.SQL.Clear;
  ZQuery1.SQL.Add('Select * From Empleados');
  ZQuery1.Open;

  ListaEmpleados.Items.Clear;
  ZQuery1.First;
  while not ZQuery1.Eof do
    begin
      ListaEmpleados.Items.Add(ZQuery1.FieldByName('NombreEmpleado').AsString);
      ZQuery1.Next;
    end;
end;

Al colocar eso en otra unidad me da un monton de errores
en el uses de la UPrincipal coloque UEmpleados,
y en UEmpleados coloque la UPrincipal.

Cualquier ayuda sera eternamente agradecida :)

nlsgarcia 03-01-2015 02:06:41

martini002,

Cita:

Empezado por martini002
...Tenemos procedimientos propios, como por ejemplo cargar de la BD los empleados en una lista del form principal que esta en la unidad principal...La pregunta en concreto es, ¿Como podría mover ese procedimiento de carga de empleados a otra unidad?...

:rolleyes:

Revisa este código:
Código Delphi [-]
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

procedure LoadList(List : TStrings);

implementation

procedure LoadList(List : TStrings);
var
   i : Integer;
begin
   for i := 1 to 10 do
      List.Add('Data-' + IntToStr(i));
end;

end.
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
   LoadList(ListBox1.Items);
end;

end.
El código anterior en Delphi 7 sobre Windows 7 Professional x32, carga un TListBox de Form1 en Unit1 con un procedimiento de Unit2.

Nota: En el caso planteado en el Msg #1, te sugiero crear un modulo de datos y referenciar este desde la unidad que lo requieras.

Espero sea útil :)

Nelson.

AgustinOrtu 03-01-2015 02:20:18

Tenes dos alternativas:

A: Mandas por parametro un TStrings al cual se le vas a hacer el .Add(nombre empleado)

Código Delphi [-]
Unit UEmpleados;

interface

uses System, Classes, // etc...

procedure CargarEmpleados(ListaEmpleados: TStrings);

implementation

procedure CargarEmpleados(ListaEmpleados: TStrings);
begin
  // si no esta instanciado el objeto tipo lista hay que crearlo
  // en este ejmplo use un TStringList pero podria ser cualquiera que herede de TStrings (que es abstracta)
  if not(Assigned(ListaEmpleados) then
    ListaEmpleados := TStringList.Create;

  with TZQuery.Create(NIL) do
  begin
    Connection := < Tu conexion a la BD acá >
    SQL.Clear;
    SQL.Add('Select * From Empleados');
    Open;

    ListaEmpleados.Items.Clear;
    First;
    while not Eof do
    begin
      ListaEmpleados.Items.Add(FieldByName('NombreEmpleado').AsString);
      Next;
    end;
  end;
end;

B: En ves de un procedure tenes una function la cual te retorna directamente la lista

Código Delphi [-]
Unit UEmpleados;

interface

uses System, Classes, // etc...

function CargarEmpleados: TStrings;

implementation

function CargarEmpleados: TStrings;
begin
  result := TStringList.Create;

  with TZQuery.Create(NIL) do
  begin
    Connection := < Tu conexion a la BD acá >
    SQL.Clear;
    SQL.Add('Select * From Empleados');
    Open;

    result.Items.Clear;
    First;
    while not Eof do
    begin
      result.Items.Add(FieldByName('NombreEmpleado').AsString);
      Next;
    end;
  end;
end;


No use nunca los componentes ZEOS, igual me los imagino muy similares a los ADO.
El tema del TZQuery que creo en tiempo de ejecucion es porque el que estabas usando vos no lo conoce la unit UEmpleados. Poner en el uses el principal para poder acceder a ese componente query me parece muy mala idea, si tenes que usar el mismo procedimiento en otro form y por casualidad ese form no existe no vas a poder usar el ZQuery1. El connection para asignarle al query, es el TZConnection creo para ZEOS, que tendras en un DataModule, obviamente tenes que incluir la unit del DataModule en el uses

Saludos!

EDITO: Se me adelanto el compañero nelson :p

martini002 03-01-2015 07:07:07

Muchas gracias! Muy agradecido con ambos!


La franja horaria es GMT +2. Ahora son las 01:34:02.

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