Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-10-2006
[David] David is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Málaga
Posts: 417
Poder: 21
David Va por buen camino
Tengo un lio con cierto código

Hola

Voy a explicarlo a ver si me entendeis .

Tengo un FormPadre , del que deriva varios Forms , uno de ellos es TFormContabilidad .

Hay un form principal y TFormContabilidad es un MDIChild .

Así en el form , principal creo el FormContabilidad :

TFormContabilidad.Create(Application);

Ahora tengo un DataModule , con una tabla TContabilidad .
En el FormContabilidad tengo otra tabla TCta.

Bien , pues necesito que en el datasource de la TContabilidad , en la propiedad OndataChange , poner esto .

Código Delphi [-]
procedure TDataModule.dsContableDataChange(Sender: TObject; Field: TField);
begin
     TFormContabilidad.TCta.Filter := 'Codigo = ' + TContabilidad.FieldByName('campo1).AsString; // Aquí da el error
end;

Resumo , en el datamodule , hay una tabla ,con su datasource . En el formContabilidad es MDIChild , y hay otra tabla . Pues bien en el Onchange del DataSource del DataModule , hay que hacer una referencia a la tabla del Formulario MDIChild . ¿Cómo se hace esto ?

Ya de paso , si alguien se molesta en contestar , pues pregunto también como se sabe si el FormContabilidad (que es MDIChild) esta activo . Por que si pones esto en el DataModule :

if (ActiveMDIChild is TFormContabilidad) then . Te dice que ActiveMDIChild no esta identificado , si lo pones esto en un form normal no hay problemas , pero si los hay en el DataModule .
Responder Con Cita
  #2  
Antiguo 12-10-2006
aledieb aledieb is offline
Miembro
 
Registrado: jun 2005
Ubicación: Buenos Aires, Argentina
Posts: 141
Poder: 19
aledieb Va por buen camino
Agregar en el uses del datamodule la unidad del form Tcontabilidad (el nombre del archivo .pas)
__________________
Suerte
Alejandro
Responder Con Cita
  #3  
Antiguo 12-10-2006
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
Tomando en cuenta que el Form si puede acceder al DataModule, puedes crea el procedimiento dentro de TFormContabilidad.

Código Delphi [-]
procedure TFormContabilidad.dsContableDataChange(Sender: TObject; Field: TField);
begin
     TCta.Filter := 'Codigo = ' + DataModule.dsContable.TContabilidad.FieldByName('campo1).AsString; 
end;

Después cuando creas la forma asignas ese procedimiento al evento OnDataChange del DataSet.

Código Delphi [-]
procedure TFormContabilidad.Create(Sender: TObject);
begin
  DataModule.dsContable.OnDataChange:=dsContableDataChange; 
end;

Espero que sea útil, saludos.

Última edición por Héctor Randolph fecha: 12-10-2006 a las 23:30:50.
Responder Con Cita
  #4  
Antiguo 13-10-2006
[David] David is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Málaga
Posts: 417
Poder: 21
David Va por buen camino
La clausula uses ya esta añadida , el error da en ejecución , no en compilación .

en cuanto a lo que me ha dicho Héctor , hay problemas en el segundo código :

Código Delphi [-]
procedure TFormContabilidad.Create(Sender: TObject);
begin
  DataModule.dsContable.OnDataChange:=dsContableDataChange; 
end;

Por que dsContableDataChange ,es un procedimiento , y da error si lo aplico a la función ondataChange del dscontable . Además el procedure tiene dos parametros ,que habría que completar , si acaso lo suyo seria poner una función , pero ahí la duda es que valor devuelve .
Responder Con Cita
  #5  
Antiguo 13-10-2006
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
Dentro de la definición de la forma tienes que declarar el procedimiento, tal y como lo muestro aqui

Código Delphi [-]
type

   TFormContabilidad = class(TForm ...
.
.
.
   public
    { Public declarations }
    //Puedes declararlo aqui por ejemplo
    procedure dsContableDataChange(Sender: TObject; Field: TField);
.
.
.
  end;

Es extraño que te de error, ya lo he probado y funciona.

Saludos
Responder Con Cita
  #6  
Antiguo 13-10-2006
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
Al evento OnDataChange puedes asignarle algo del tipo TDataChangeEvent, que es precisamente como el procedimiento dsContableDataChange que acabamos de hacer, no debería de existir error en los tipos

Cita:
Empezado por Ayuda Delphi
TDataChangeEvent is the type for an OnDataChange event handler.

type TDataChangeEvent = procedure(Sender: TObject; Field: TField) of object;

Saludos
Responder Con Cita
  #7  
Antiguo 13-10-2006
[David] David is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Málaga
Posts: 417
Poder: 21
David Va por buen camino
Gracias , ya funciona . Menos mal . ufffffffffff , que alivio .

Que haria yo sin este foro
Responder Con Cita
  #8  
Antiguo 13-10-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Aunque el método es totalmente válido, no aconsejaría esa práctica. Si ahora asignas un evento con el inspector de objetos al dsContabledel datamodule, éste evento dejará de funcionar cuando se abra el Form de Contabilidad, lo que hace muy muy dificil encontrar el error.

Lo que propongo es hacer exactamente lo mismo pero con un evento creado por tí:
en el Datamodule:
Código Delphi [-]

 TDatamodule = class(...)

private
  FNotifyToTFormContabilidad:TDataChangeEvent;
public
  property NotifyToTFormContabilidad:TDataChangeEvent  read FNotifyToTFormContabilidad 
                                                       write FNotifyToTFormContabilidad;
end;

// En el inspector de objetos, seleccionas dsContable, y creas el evento por defecto que propone Delphi:
procedure TDatamodule.dsContableDataChange(Sender: TObject; Field: TField);
begin
  if Assigned(FNotifyToTFormContabilidad) then
    FNotifyToTFormContabilidad(Sender, Fied); // lanzamos el evento para que informe al Form
// de contabilidad.
end;

Ahora en el form de contabilidad, hacemos la asignacion del evento, pero en lugar de usar dsContableDataChange, usamos el evento recien creado:
Código Delphi [-]
procedure TFormContabilidad.Create(Sender: TObject);
begin
// nuevo evento creado en el datamodule := evento del form de contabilidad
DataModule.NotifyToTFormContabilidad:=dsContableDataChange; 
end;
procedure TFormContabilidad.Close(....);
begin
  DataModule.NotifyToTFormContabilidad:= nil;
end;
Por supuesto, al cerrar el form de contabilidad, hay que quitar la asignación del evento. Si no lo hacemos y se destruye el Form de contabilidad, cuando en el Datamodule.dsContable se cambie un dato producirá un Access Violation.


Ahora tenemos todo en orden, si necesitas el evento OnDataChange del Datamodule.dsContable, lo tienes ya creado, y además te acordarás de que tambien se informa al Form de contabilidad, por tanto, es más claro el código (aunque ahora mismo no te lo parezca jejeje).

Edito: Notarás que la variable Privada tiene un F delante, tal y como dicen los Standares de programación, (es un Field privado). Despues desde TFormContabilidad se accede a la propiedad pública del Datamodule (sin la F).

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 13-10-2006 a las 18:40:52.
Responder Con Cita
  #9  
Antiguo 13-10-2006
[David] David is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Málaga
Posts: 417
Poder: 21
David Va por buen camino
En cuanto a la solución de lepe , me surguen dos dudas , la primera es donde pongo :

TCta.Filter := 'codigo= ' + TContable.FieldByName('idcodigo').AsString;

Ya que TCta esta en el form FContable y la tabla TContable esta en el DataModule.

La segunda duda , es si pongo en el DataModule :

if Assigned(FContable) then

Lo que pasa , es que al ser FContable MDIChild , FContable = nil siempre . Por lo que nunca entra dentro del if ... then . Este era mi segunda duda , como hacer para poner código dentro del DataModule , que se ejecute cuando FContable este activo , se haya creado y ya esta activo , por que con if Assigned(FContable) then , no funciona , y la propiedad ActiveMDIChild , da error dentro de un DataModule .


Saludos
Responder Con Cita
  #10  
Antiguo 13-10-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Yo he usado una variable en mi código que se llama FContable, y da la casualidad que tú tienes una ventana que se llama FContable, y claro, así es imposible aclararnos ambos.

Solución: Voy a editar mi mensaje y cambiar el nombre de esa variable para que no haya confusión.


La filosofía es:
- Si la ventana FormContabilidad no está abierta, y se cambia un dato en dsContable (el que está en el Datamodule), se irá al evento Datamodule.dsContableDataChange, la condición:
Código Delphi [-]
 if Assigned(FNotifyToTFormContabilidad) then
no se cumplirá, ya que delphi al crear el Datamodule le asigna nil a FNotifyToFormContabilidad.

- Si se crea la ventana FormContabilidad, en su FormCreate se le da un valor a NotifyToFormContabilidad, y por tanto, mientras esté abierta esta ventana, ocurrirá lo siguiente al cambiarse un dato en Datamodule.dsContable:
  • Se produce el evento Datamodule.dsContableDataChange
  • Se comprueba que FNotiFyToFormContabilidad tiene un valor, ahora si entrará en la condición, porque al crear FormContabilidad se ha asignado un valor.
  • Se ejecuta la linea "FNotifyToTFormContabilidad(Sender, Fied); " que en realidad, lo que hace es ejecutar el procedimiento FormContabilidad.dsContableDatachange
  • Cuando termine el procedimiento anterior, vuelve a Datamodule.dsContableDataChange y sigue ejecutando ese procedimiento.

Si te fijas bien, lo único que estoy haciendo es asignar valores a propiedades, igual que con un "Edit1.Text := 'pepe', pero claro, son eventos, y estamos acostumbrados a asignarlos con el Inspector de Objetos, casi nunca por código, ahí está la dificultad.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 13-10-2006 a las 18:53:32.
Responder Con Cita
  #11  
Antiguo 13-10-2006
[David] David is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Málaga
Posts: 417
Poder: 21
David Va por buen camino
Gracias Lepe , tu código me funciona perfectamente . El código que puso Hector, me he dado cuenta que funciona la primera vez que entras en el FormContabilidad , cuando sales y vuelves a entrar da error .

He editado esto , por que donde quise poner Hector , puse Lepe . Sorry

Última edición por David fecha: 13-10-2006 a las 22:46:03.
Responder Con Cita
  #12  
Antiguo 13-10-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Cita:
Empezado por David
Gracias Lepe , tu código me funciona perfectamente . El código que puso Lepe , [...], cuando sales y vuelves a entrar da error .

En todo caso, falla porque falta añadir el FormContabilidad.FormClose.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Bloquear aplicacion despues de cierto tiempo Marcela Conexión con bases de datos 26 17-04-2017 00:47:23
Sobre cierto resultado de la función SHGetSpecialFolderPath dec API de Windows 3 01-06-2005 07:59:01
Porque se Desconecta la B.D. en cierto Tiempo???? AGAG4 Conexión con bases de datos 2 25-04-2005 17:59:21
Ejecutar aplicacion delphi cada cierto tiempo mgaray API de Windows 9 28-01-2005 20:16:20
Increible pero cierto Nuria Humor 0 23-01-2004 19:47:14


La franja horaria es GMT +2. Ahora son las 22:02:37.


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