Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-11-2006
Avatar de Vlady
Vlady Vlady is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 19
Vlady Va por buen camino
Problema con el Onhint

Hola amigos del club:

Tengo el siguiente problema con un aplicación, estoy mostrando las ayudas en una barra statusbar al desplazar el mouse sobre cualquier objeto de la ventana, esto me funcione correctamente. El problema sucede cuando creo las ventanas dinamicamente mediante este codigo.



Código Delphi [-]
Procedure MostrarModal(AClass : TFormClass);
Begin
   with AClass.Create(Application) do
   Begin
       try
          ShowModal;
       finally
          free;
       end
   End
End;





Cuando quiero mostrar una ventana llamo este procedimiento y al cerrar la ventana me arroja una exepción cerrandome la ventana que creo la nueva ventana el sitio de codigo que me arroja la excepcion es este


Código Delphi [-]
Procedure TItemFactura.MiHint(Sender: TObject);
Begin
    try
    if Application.Hint <> '' then
      LMDStatusBar1.SimpleText := Application.Hint;
   finally
   end
End;



Con este codigo activo las ayudas de cada componente de la ventana


Código Delphi [-]
procedure TItemFactura.FormCreate(Sender: TObject);
begin
  Application.OnHint := MiHint;
end;




en la excepcion que me arroja aparece un error creo de mensajes pero no se como solucionar este error, este error no aparece cuando las ventanas son ya creadas automanticamente por delphi y se muestran mediante showModal.

No se si es clara la pregunta

Gracias por la atencion prestada

Última edición por roman fecha: 22-11-2006 a las 23:24:38.
Responder Con Cita
  #2  
Antiguo 22-11-2006
Avatar de aeff
aeff aeff is offline
Miembro
 
Registrado: oct 2006
Ubicación: Cuba, Guantánamo
Posts: 348
Poder: 18
aeff Va camino a la fama
Wink creo que he entendido algo

realmente no entiendo del todo tu pregunta, pero te puedo dar algo de lo que comprendí, en primer lugar, utilizaría el siguiente procedimiento para mostrar las formas:

Código Delphi [-]
procedure MostrarModal(vForma: TForm);
begin
  if vForma = nil then Exit;
  vForma := TForm.Create(nil);
  vForma.ShowModal;
  vForma.Release;
end;


ahora, para capturar el Hint de tu app... utilizaría el siguiente método:

Código Delphi [-]
{ Private declarations }
procedure AppOnHint(Sender: TObject);
...
 
implementation
 
procedure TForm1.AppOnHint(Sender: TObject);
begin
  ShowMessage(Application.Hint);
end;

...

hasta aquí hemos declarado el procedimiento que responderá al evento OnHint de tu applicación...

falta indicar que es esté el que va a responder, para ello escribe en el OnCreate de tu forma principal la siguiente línea de código:

Código Delphi [-]
 ...
 begin
    Application.OnHint := Form1.AppOnHint;
 end;
 ...

espero que no te de más errores, por lo menos a mi no me ha dado fallo, digo, si era esto lo que preguntabas.

saludos!!!

Última edición por roman fecha: 22-11-2006 a las 23:25:50.
Responder Con Cita
  #3  
Antiguo 22-11-2006
Avatar de Vlady
Vlady Vlady is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 19
Vlady Va por buen camino
Gracias por tu ayuda.

Pero te cuento e pobado tu funcion mostrarmodal y simplemete no me crea la ventana, cabe anotar que estoy trabajando con delphi 5 y DB Paradox. Los ejemplos de codigo de mi pregunta los e a prendido en la caraoculta de delphi, creo que no deben estar mal.

Gracias
Responder Con Cita
  #4  
Antiguo 22-11-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Lo primero de todo es decir el error concreto que da, si es un access violation, un abstract error o lo que sea, mientras tanto es muy difícil ayudarte.

En cuanto a lo del hint, hay 2 cosas:
- Application.Onhit := Mihint, no me queda claro si lo haces en cada ventana que creas, o solo en una. Deberías hacer eso en una sola ventana, así todos los hints de todas las ventanas se iran al LMDSTATUSBAR.

- ¿Por qué haces uso de un try finally vacío?
Código Delphi [-]
try
if Application.Hint <> '' then
LMDStatusBar1.SimpleText := Application.Hint;
finally


  // aqui deberias poner algo, o si no, quitar el try finally.


end


Comentarios de la función MostrarModal:
Código Delphi [-]
procedure MostrarModal(vForma: TForm);
begin
if vForma = nil then Exit;
vForma := TForm.Create(nil);
vForma.ShowModal;
vForma.Release;
end;

si vForma es igual a nil, entonces no se crea ¿Por qué?
Desde mi punto de vista debería ser al revés. Si vForma es igual a nil, significa que no está creada, por tanto se debe crear y mostrar.

Si vForma es distinto de nil, significa que está creada o sabe dios si se ha destruido ya.... para solventar esto, sigue leyendo.

Tampoco veo necesario usar Release (ya que no estas cerrando la ventana desde un método de esa misma ventana), lo cierras desde una ventana distinta y para ello sería mejor usar Freeandnil(VForma); así la segunda o tercera vez que se llame a Mostrar modal no dará fallos.

Yo haría la rutina de esta forma:
Código Delphi [-]
procedure MostrarModal(vForma: TForm);
begin
if not assigned(vForma) then
  vForma := TForm.Create(nil);
vForma.ShowModal;
freeandnil(vForma);
end;

Aunque no le veo mucho sentido, ya que deja muy poca interacción con dicha ventana, es decir, después de mostrarse, se cierra.... no da tiempo a recoger valores de retorno de dicha ventana... que suelen ser muy útiles.

En fin, tú sabrás qué y cómo lo estas haciendo.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 23-11-2006
Avatar de Vlady
Vlady Vlady is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 19
Vlady Va por buen camino
Lo primero de todo es decir el error concreto que da, si es un access violation, un abstract error o lo que sea, mientras tanto es muy difícil ayudarte.

Lepe te cuento el erro que me da es este

Proyecto Factura.exe raised exception class EAccessViolation with message
' Access violation at address 0067755...... etc '

En cuanto a lo de hint te cuento que esta asignación
Application.Onhit := Mihint la realizo al crear cada ventana

Código Delphi [-]
procedure TFArqueo.FormCreate(Sender: TObject);
begin
   Application.OnHint := MiHint;
end;

lo mas extraño de este error es que cuando la creación automatica de ventanas las realizaba delphi al comenzar el programa y yo solo las mostraba con ShowModal no aparecia pero ahora como el programa a ido creciendo me a tocado manejar a mi las ventanas pero entonces me a aparecido este error, la unica solución que he podido hacer por el momento es quitar las ayudas de las ventanas. Otra cosa que veo que sucede es que cuando creo una ventana modal y esta a su vez llama a otra ventana modal parace el error cosa que no sucede cuando la ventana modal no llama a otra. En fin creo que es un problema con mensanjes ya que cuando cierro la ventan el mensaje del Onhin trata de buscar el statusbar donde se muestra la ayuda pero como este ya ha sido elimnado no lo encuentra y genera el error.


En cuanto a lo otro que tu dices esa función que tu corregiste muy amablemente no es la que estoy utilizando, la que utilizo es la del mensaje original. Gracias

ojala esto deje mas claro mi poblema.
Responder Con Cita
  #6  
Antiguo 24-11-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Ahora si es posible contestarte "efectivamente".

Al poner esa línea de código en cada ventana, el Hint se mostrará en la última ventana que se abra, hasta ahí correcto. Si cerramos esa ventana, ¿el hint donde se mostrará?.... pues mientras no se cree otra ventana nueva, el hint se intentará mostrar en esa última ventana que ya ha sido cerrada, es decir, liberada de memoria RAM... o lo que es lo mismo, está intentando acceder a una zona de memoria donde ya no reside la ventana; supongo que ahora entiendes el "access violation".

Si puedes, me gustaría que comentases qué tipo de interfaz usas, es decir, si es SDI ó MDI.

Si es SDI, abres una ventana y después otra y después otra.. controlar el hint en este escenario puede ser "incómodo para ti".

Si es MDI, la solución es muy fácil. El Hint se muestra en un statusbar de la ventana MDI; como esta ventana siempre está creada y mostrándose, se verá siempre el hint sin problemas. En este escenario la asignación Application.Onhint := hint sólo es necesario hacerlo en el OnCreate del formulario MDI.

Ten en cuenta que estas asignando una propiedad del objeto Application, así que, una sola asignación es válida para todas las ventanas que tengas en tu programa.

Cuando Delphi crea las ventanas, todas las ventanas están creadas y disponibles durante toda la ejecución de la aplicación, por tanto, siempre está disponible el procedimiento "Mihint" de cada ventana, por eso no da error.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #7  
Antiguo 24-11-2006
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
el problema según veo es la mezcla que haces de accesos entre TApplication y las formas que creas. El error de violation error es debido a que en algun punto estas accesando a un objeto o método que no ha sido creado aún o bien ya fue destruído.

Si revisas tu algoritmo te recomiendo que separes totalmente TApplication de tus TForms de manera que lo que muevas en uno no afecte al otro. En tu ejemplo se supone que las ventanas no deben de "saber" que existe Application que es quien las controla y no a la inversa.

Puedes por ejemplo hacer lo siguiente: primero creas el form (pero sin mostralo) y una vez mostrado obtienes el hint y se lo pasas a la aplicacion. Despúes muestras la ventana. Al cerrar la ventana haces lo contrario.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #8  
Antiguo 27-11-2006
Avatar de Vlady
Vlady Vlady is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 19
Vlady Va por buen camino
Gracias por la ayuda que me han brindado:

Mi aplicación es MDI ya que se crea una ventana y hasta que esta no se cierra no se puede acceder a ninguna otra.

Quisiera saber como se hace esto

Puedes por ejemplo hacer lo siguiente: primero creas el form (pero sin mostralo) y una vez mostrado obtienes el hint y se lo pasas a la aplicacion. Despúes muestras la ventana. Al cerrar la ventana haces lo contrario.
__________________

Es decir yo se como acceder al hint pero como hago lo contrario de pronto si es posible me lo de en un ejemplo.

Gracias
Responder Con Cita
  #9  
Antiguo 27-11-2006
Avatar de Vlady
Vlady Vlady is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 19
Vlady Va por buen camino
Gracias por la ayuda:

Primero creo que mi aplicación es MDI ya que solo se accede a una ventana a la vez es decir se crean ventanas modales a partir de una principal.

Otra cosa es que cada ventana tiene un componente statusbar que donde yo muestro el contenido de las ayudas de cada ventana.


Quisiera saber como se hace esto
Cita:
Empezado por AzidRain
Puedes por ejemplo hacer lo siguiente: primero creas el form (pero sin mostralo) y una vez mostrado obtienes el hint y se lo pasas a la aplicacion. Despúes muestras la ventana. Al cerrar la ventana haces lo contrario.
Es decir yo se como acceder al hint y mostrarlo application pero como lo desvinculo, si de pronto me pudiera ayudar con ejemplo.

No he podido dar con el chiste y aun me sigue saliedo el error.

Gracias

Última edición por Vlady fecha: 27-11-2006 a las 21:16:02.
Responder Con Cita
  #10  
Antiguo 27-11-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Me parece que lo único que requieres es poner

Código Delphi [-]
Application.OnHint := nil;

en el OnClose de tus formularios. Con esto desvinculas el OnHint.

// Saludos
Responder Con Cita
  #11  
Antiguo 29-11-2006
Avatar de Vlady
Vlady Vlady is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 19
Vlady Va por buen camino
Gracias roman prove con esta instrucción y todo me funcioné excelente


Gracias de nuevo
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
Reactivar onhint rafa_adrim OOP 5 24-01-2006 16:22:57


La franja horaria es GMT +2. Ahora son las 03:58:50.


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