Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-01-2015
Avatar de martini002
martini002 martini002 is offline
Miembro
 
Registrado: may 2012
Ubicación: Puerto Ordaz - Venezuela
Posts: 175
Poder: 12
martini002 Va por buen camino
Arrow 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
__________________
El Conocimiento se puede compartir, pero la Experiencia es totalmente Intransferible.
Responder Con Cita
  #2  
Antiguo 03-01-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
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?...


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.
Responder Con Cita
  #3  
Antiguo 03-01-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
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

Última edición por AgustinOrtu fecha: 03-01-2015 a las 02:25:05.
Responder Con Cita
  #4  
Antiguo 03-01-2015
Avatar de martini002
martini002 martini002 is offline
Miembro
 
Registrado: may 2012
Ubicación: Puerto Ordaz - Venezuela
Posts: 175
Poder: 12
martini002 Va por buen camino
Muchas gracias! Muy agradecido con ambos!
__________________
El Conocimiento se puede compartir, pero la Experiencia es totalmente Intransferible.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
¿Modulo Rss para php nuke 7.9? JXJ PHP 0 20-06-2006 18:43:23
Sugerencia para un módulo de Inventarios JorgeBec Varios 2 10-12-2005 22:04:28
Módulo de Imágenes para mi programa Sergio J. Gráficos 3 26-10-2005 14:34:47
Modulo en vb6 para traducir la aplicacion Cerathos Conexión con bases de datos 0 16-04-2005 04:05:51
Como declarar variables para que las puedan utilizar otras units erocha Varios 1 07-11-2003 22:21:27


La franja horaria es GMT +2. Ahora son las 01:27:09.


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
Copyright 1996-2007 Club Delphi