Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Crear procedimiento !!! (https://www.clubdelphi.com/foros/showthread.php?t=33794)

Ledian_Fdez 17-07-2006 15:28:42

Crear procedimiento !!!
 
Holas amigos de este foro:
Lo que me propongo es lo siguiente:

Este código lo repito en casi todos los formularios en el evento FormShow.

Código Delphi [-]
procedure TTallerForm.FormShow(Sender: TObject);
begin
 DM.QrProv.Open;
 DM.QrProv.First;
 While not DM.QrProv.Eof do
    begin
     ComboBox1.Items.Add(DM.QrProvcodp.AsString);
     DM.QrProv.Next;
    end;
 DM.QrProv.Close;
end;

Intento hacer un procedimiento en el DM (Data Module) para llamarlo desde cualquier lugar, pero no hallo cómo hacerlo ya que no se como referirme a cada uno de los formularios.

nota: A los formularios les asigno memoria dinámica.

gracias de antemano
saludos Ledian

marcoszorrilla 17-07-2006 15:46:01

Ese código lo tienes que poner en el DataModulo correspondiente y luego hacer un "Uses", en cada formulario en donde pienses utilizarlo y despues símplemente llamarlo por su nombre:

Código Delphi [-]
 procedure Carga_Cuadro_Combinado();
begin
 DM.QrProv.Open;
 DM.QrProv.First;
 While not DM.QrProv.Eof do
    begin
     ComboBox1.Items.Add(DM.QrProvcodp.AsString);
     DM.QrProv.Next;
    end;
 DM.QrProv.Close;
end;

y en los formularios, símplemente:
Código Delphi [-]
 Carga_Cuadro_Combinado();

Un Saludo.

Ledian_Fdez 17-07-2006 16:24:40

Error !!!
 
Al crear el procedimiento en el Data Module da el error undeclared identifier:'ComboBox1' y tampoco puedo decir
Código Delphi [-]
TallerForm.ComboBox1
por que va a ser usado no solo por TallerForm, sino por varios formularios.

Espero que me hallan entendido ahora.

Gracias de todas formas.
Saludos Ledian

yusnerqui 17-07-2006 16:35:13

Está claro, creo que lo que puedes hacer es pasar el combo como parámetro del prcedimiento. Entonces:

Código Delphi [-]
procedure DM.Carga_Cuadro_Combinado(MyCombo:TComboBox);
begin
 QrProv.Open;
 QrProv.First;
 While not QrProv.Eof do
    begin
      MyCombo.Items.Add(DM.QrProvcodp.AsString);
      QrProv.Next;
    end;
 QrProv.Close;
end;

y para llamarlo desde el form

Código Delphi [-]
  DM.Carga_Cuadro_Combinado(ComboBox1);

Saludos.

Ledian_Fdez 17-07-2006 16:59:48

Continua el Error !!!
 
Hola amigos:
Despues de guiarme por el consejo de yusnerqui me da el siguiente error: Undeclared identifier: TComboBox

Alguien pudiera ayudarme por favor.

gracias
Saludos Ledian.

basti 17-07-2006 17:22:17

Cuando te de un tipo de error como ese, busca la unidad donde está definido en la ayuda de delphi y ponla en el uses del formulario o Datamodule. En este caso tienes que añadir en el uses de tu TDataModule la unidad 'stdCtrls'.

yusnerqui 17-07-2006 17:24:58

ojo
 
Debes declarar la unit StdCtrls en el uses de tu DM.

Saludos

yusnerqui 17-07-2006 17:51:48

Caramba Basti te me adelantaste, jejeje.

saludos

Ledian_Fdez 17-07-2006 17:56:03

Casi lo logramos!!!
 
Amigos:
Ya no da el error, magnifico. He aprendido mucho aca con ustedes hoy, pero ... a la hora de llamar al procedimiento
Código Delphi [-]
DM.Carga_Cuadro_Combinado(ComboBox1);
en cualquiera de los formularios me da el error undeclared identifier:'Carga_Cuadro_Combinado'. Les aclaro que tengo en uso el DM


Con otra ayuda soluciono el problema.

Saludos Ledian

maeyanes 17-07-2006 18:08:14

Pusiste la declaración del procedimiento en la sección public del DataModule?

Código Delphi [-]
TMiDataModulo = class(TDataModule)
  // Componentes y eventos
private
  { Private declarations }
public
  { Public declarations }
  procedure Carga_Cuadro_Combinado(ComboBox: TComboBox);
end;


Saludos...

Ledian_Fdez 17-07-2006 18:26:33

Aun no lo logro !!!
 
Hola de nuevo

al poner la declaración del procedimiento en la sección public del DataModule

Código Delphi [-]
TMiDataModulo = class(TDataModule)
  // Componentes y eventos
private
  { Private declarations }
public
  { Public declarations }
  procedure Carga_Cuadro_Combinado(ComboBox: TComboBox);
end;

Me genera el siguiente error:
Unsatisfied forward or external declaration: 'TMiDataModulo.Carga_Cuadro_Combinado'


¿Qué estoy haciendo mal :confused:

Saludos.. Ledian

fer21unmsm 17-07-2006 19:41:39

Cita:

Empezado por Ledian_Fdez
Hola de nuevo

al poner la declaración del procedimiento en la sección public del DataModule

Código Delphi [-]TMiDataModulo = class(TDataModule) // Componentes y eventos private { Private declarations } public { Public declarations } procedure Carga_Cuadro_Combinado(ComboBox: TComboBox); end;


Me genera el siguiente error:
Unsatisfied forward or external declaration: 'TDM.Carga_Cuadro_Combinado'


¿Qué estoy haciendo mal :confused:

Saludos.. Ledian

Hola, ese mensaje de error siempre lo veo salir cuando se ha declarado un método o función en una clase pero se ha implementado, en realidad no me he leído todos los mensaje. De casualidad en vez de "TDM", no debería ser "TMiDataModulo", es decir:
TMiDataModulo.Carga_Cuadro_Combinado

Saludos.

Ledian_Fdez 17-07-2006 20:26:26

El error persiste !!!
 
Tienes razon fer21unmsm pero eso solo fue un error a la hora de transcribir el mensaje de error. Ruego que me disculpen.

ya lo corregi mas arriba.
Ahora por favor alguien me ayuda...

gracias de antemano

saludos Ledian.

maeyanes 17-07-2006 20:29:49

Tienes implementada en la sección implementation de la unidad el código del procedimiento Carga_Cuadro_Combinado? Si no es así, es por eso que te sale ese error...


Saludos...

Ledian_Fdez 17-07-2006 20:46:01

y ahora que ?
 
No se si es a este orden al que te refieres.

Código Delphi [-]
implementation

uses ConsUnit, MunUnit, ProvUnit, TallerUnit, SituacionUnit;

{$R *.dfm}

procedure LLena_Provincia(MyCombo:TComboBox);

mi pregunta ahora es como poner el procedure publico

Ledian.

basti 17-07-2006 21:42:51

En la implementación del procedimiento tienes que ponerle TMiDataModulo antes, ya que pertenece a esa clase:

procedure TMiDataModulo.LLena_Provincia(MyCombo:TComboBox);

Ledian_Fdez 17-07-2006 22:23:46

bye
 
Amigos lo siento. Estoy al darme por vencido. Lo he probado pero solo me funciona para esa unit, no he logrado poner publico el procedimiento.

grasias a todos

y hasta la vista.

Ledian_Fdez 17-07-2006 22:42:53

Un Poquito mas !!!
 
Amigos estube leyendo en foros viejos donde dicen:

Cita:

Para que un procedimiento sea público, y pueda ser accedido desde cualquier unit, es importante que declares al interfaz, esto lo haces poniendo su declaración en el bloque interface de la unit. Si no has definido la interfaz, no solo será privado para su uso dentro de la unit donde esta implementado, sino que solo lo verán los procedimientos que se implementen en posteriormente a este.
Al ponerlo ahi me da el siguiente error Undeclared identifier: 'TComboBox'


Bye Ledian.

Lepe 18-07-2006 10:19:57

Haz un clic sobre la palabra Tcombobox (en tu código, no en la ventana de errores), pulsa F1 y te dirá el "uses" que necesitas.

Saludos

yusnerqui 18-07-2006 14:25:58

Veamos, lo primero es recomendarte que si vas a programar en delhi no lo hagas inpíricamente, sino que consigas un tutorial o libro que te instruya.

En cuanto al problema que originó este hilo, trataré mostrarte mediante un ejemplo:

Tu datamódulo originalmente se verá más o menos parecido a esto:
Código Delphi [-]
unit Unit2;
interface
uses
  SysUtils, Classes;
type
  TDM = class(TDataModule)    
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  DM: TDM;
implementation
{$R *.dfm}
end.

Fíjate que despues de la palabra reservada Type dice TDM, esto es porque le he puesto como nombre al DataModule DM. A continuación en forma de comentarios te explico las sesiones:
Código Delphi [-]
unit Unit2;
interface
uses
//Este es el uses, aqui tienes que poner las unit que usarás, en tu caso agregas StdCtrls
  SysUtils, Classes, StdCtrls, DB, ADODB;

type //Sesión type: para declarar nuevos tipos
  TDM = class(TDataModule)
    QrProv: TADOTable;//Esto es una tabla que le puse dentro al datamódulo, el código se geneta automático
  private
  {Esta es la sesión donde se declaran las variables,
  procedimientos y funciones que serán usada solo por esta unit}
  public
    {Sesión Pública, Aqui podras declarar variables, procedimientos y funciones
    que se compartirán con otras units, como es el caso de tu procedimiento}
    procedure LLena_Provincia(MyCombo:TComboBox);
    {Te recomiendo que después que escribas esta línea oprimas la combinación
     de teclas Ctrl + Shift + C, lo cual agregará el "cuerpo" del procedimiento
     en la sesión de implementación listo para implementar
     }
  end;
var
  DM: TDM;
implementation
{Esta es la sesión de implementación, donde se programa realmente el cueerpo de
los procedimientos y funciones}
{$R *.dfm}
{ TDM }
{Este es el cuerpo de tu procedimiento, que se agregó al dar la combinación
de teclas, dentro de él es donde debes poner tu código}
procedure TDM.LLena_Provincia(MyCombo: TComboBox);
begin
 
end;
end.

Bueno a grandes rasgos estas son algunas de las sesiones de la unidad, claro que debes profundizar en este tema para que puedas comprender del todo su estructura.

Espero que ahora si puedas solucionar tu problema.

Saludos.


La franja horaria es GMT +2. Ahora son las 14:49:17.

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