Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus-es / 2011-07

ventanas no modales

13 messages · 4 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Paola Bruccoleri

Hola a todos..

siempre he tenido como costumbre crear ventanas modales. Ahora... si qusiera que toda la aplicaci�n trabajara con ventanas NO modales, �qu� deber� hacer y qu� precauciones deber� tomar?

Creo de esta manera los forms:
var  f5: TNumeradores;
....
          f5:= TNumeradores.Create(Self);
          try
            f5.ShowModal;
          finally
            f5.Free;
          end;

Pens� en cambiar por f5.Show, sacar el f5.free y en el evento OnClose del form, poner
closeAction:= caFree;

Aparentemente funciona....
pero,..suponiendo que eso lo hago en dos forms diferentes, para poder tenerlos abiertos a la vez, al abrir uno se me desaparece el otro y viceversa; adem�s, si por casualidad hago clic fuera del form, �ste desaparece.

�c�mo lo hacen Uds?
muchas gracias
chauuuuuuuuuu

Reply by email

Maxi
to Paola Bruccoleri

En realidad no desaparecen, solo que si tu main ocupa toda la pantalla no los ves. Podes mejorar el codigo preguntando si ya esta creado y reactivarlo con un nuevo show, que ademas te evita crear 2 veces el mismo form.

El 26/07/11, Paola Bruccoleri <pbruccoleri en adinet.com.uy> escribi�:

Show quoted text 38 lines
Hola a todos.. siempre he tenido como costumbre crear ventanas modales. Ahora... si qusiera que toda la aplicaci�n trabajara con ventanas NO modales, �qu� deber� hacer y qu� precauciones deber� tomar? Creo de esta manera los forms: var f5: TNumeradores; .... f5:= TNumeradores.Create(Self); try f5.ShowModal; finally f5.Free; end; Pens� en cambiar por f5.Show, sacar el f5.free y en el evento OnClose del form, poner closeAction:= caFree; Aparentemente funciona.... pero,..suponiendo que eso lo hago en dos forms diferentes, para poder tenerlos abiertos a la vez, al abrir uno se me desaparece el otro y viceversa; adem�s, si por casualidad hago clic fuera del form, �ste desaparece. �c�mo lo hacen Uds? muchas gracias chauuuuuuuuuu _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
No a la obsolecencia programada: http://dimensionargentina.blogspot.com/2011/01/todo-esta-disenado-para-romperse.html Twitter: @nenunocomar Identi.ca: @nenuno Linux User #495070 Ubuntu User #28504 http://miexperiencialinux.blogspot.com/ El que pregunta aprende, y el que contesta aprende a responder.

Reply by email

José Mejuto
to Paola Bruccoleri: Hola a todos.. siempre he tenido como costumbre crear ventanas modales. Ahora... si…

Hello Paola,

Wednesday, July 27, 2011, 1:09:35 AM, you wrote:

PB> Creo de esta manera los forms:
PB> var f5: TNumeradores;
PB> ....
PB> f5:= TNumeradores.Create(Self);
PB> try
PB> f5.ShowModal;
PB> finally
PB> f5.Free;
PB> end;
[...]
PB> Aparentemente funciona....
PB> pero,..suponiendo que eso lo hago en dos forms diferentes, para poder PB> tenerlos abiertos a la vez, al abrir uno se me desaparece el otro y PB> viceversa; adem�s, si por casualidad hago clic fuera del form, �ste PB> desaparece.

f5:= TNumeradores.Create(Self);
f5.PopupParent:=Self;
f5.Show;
Best regards, Jos�

Reply by email

Paola Bruccoleri
to José Mejuto

El 27/07/2011 05:46 a.m., Jos� Mejuto escribi�:

Show quoted text 23 lines
Hello Paola, Wednesday, July 27, 2011, 1:09:35 AM, you wrote: PB> Creo de esta manera los forms: PB> var f5: TNumeradores; PB> .... PB> f5:= TNumeradores.Create(Self); PB> try PB> f5.ShowModal; PB> finally PB> f5.Free; PB> end; [...] PB> Aparentemente funciona.... PB> pero,..suponiendo que eso lo hago en dos forms diferentes, para poder PB> tenerlos abiertos a la vez, al abrir uno se me desaparece el otro y PB> viceversa; adem�s, si por casualidad hago clic fuera del form, �ste PB> desaparece. f5:= TNumeradores.Create(Self); f5.PopupParent:=Self; f5.Show;

Hola Maxi y Jos�..
muchas gracias por la ayuda...

Ahora hice esto:

          if not Assigned(f5) then
            begin
             f5:= TNumeradores.Create(Self);
            end;
          f5.PopupParent:=Self;
          f5.Show;
y
          if not Assigned(f1) then
            begin
             f1:= TRespaldo.Create(Self);
            end;
          f1.PopupParent:=Self;
          f1.Show;

y pasa algo que no capto.
Estoy probando esto solo en 2 opciones del men� principal, no en todo el sistema. (los forms TNumeradores y TRespaldo)
Arranca el programa y hago clic en la opci�n de respaldo.... se crea form. Hago clic nuevamente, no pasa por "not assigned" porque sigue estando en nil, y crea otra instancia.... y as� sucesivamente. Si hago lo mismo pero con el otro form, de entrada SIGSEG!.. depurando veo que f5 ya tiene asignado un valor $2a y claro, no lo crea y cuando va a hacer el show... explota.
A los forms les puse nombres f1 a f10... ser� que est�n asociadas a las teclas correspondientes por ejemplo? en la deputaci�n veo que algunas est�n en NIL, otras con ese tipo de valores y otras con un mont�n de cosas que ni puedo pegar ac�...

gracias por cq ayuda
chauuuuuuuuuuu

Reply by email

José Mejuto
to Paola Bruccoleri

Hello Paola,

Thursday, July 28, 2011, 6:36:57 PM, you wrote:

PB> y pasa algo que no capto.
PB> Estoy probando esto solo en 2 opciones del men� principal, no en todo el PB> sistema. (los forms TNumeradores y TRespaldo)
PB> Arranca el programa y hago clic en la opci�n de respaldo.... se crea PB> form. Hago clic nuevamente, no pasa por "not assigned" porque sigue PB> estando en nil, y crea otra instancia.... y as� sucesivamente. PB> Si hago lo mismo pero con el otro form, de entrada SIGSEG!.. depurando PB> veo que f5 ya tiene asignado un valor $2a y claro, no lo crea y cuando PB> va a hacer el show... explota.

Si tiene el valor $2A desde luego, ese no es un valor v�lido, tu problema, casi seguro, es que como al cerrar el form lo liberas con "caFree" la variable ha dejado de tener sentido, ya que apunta a una zona de memoria liberada.

Si s�lo quieres que se abra una ventana de cada tipo en vez del "if Assigned" tienes que crearte una funci�n tipo:

function ReciclaVentana(const aFormClassName: ansistring): TForm;
var
  j: integer;
begin
  Result:=nil;
  for j:=0 to Screen.FormCount-1 do begin
    if UpperCase(Screen.Forms[j].ClassName)=UpperCase(aFormClassName) then begin
      Result:=Screen.Forms[j];
      break;
    end;
  end;
end;
....
var
  f5: TForm;
begin
  f5:=ReciclaVentana('TF5'); //TF5 es la clase de la ventana.
  if not Assigned(f5) then begin
    f5:=TF5.Create(Self);
    f5.PopupParent:=Self;
  end;
  f5.show;
end;

Si quieres declarar "f5" como un TF5, ser�a algo as�:

....
var
  f5: TF5;
begin
  TForm(f5):=ReciclaVentana('TF5'); //TF5 es la clase de la ventana.
  if not Assigned(f5) then begin
    f5:=TF5.Create(Self);
    f5.PopupParent:=Self;
  end;
  f5.show;
end;

No se si me he explicado.... El c�digo lo he escrito al vuelo.

PB> A los forms les puse nombres f1 a f10... ser� que est�n asociadas a las PB> teclas correspondientes por ejemplo? en la deputaci�n veo que algunas

No, no est�n asocidas a nada.

Best regards, Jos�

Reply by email

Paola Bruccoleri
to José Mejuto

El 28/07/2011 03:03 p.m., Jos� Mejuto escribi�:

Show quoted text 21 lines
Hello Paola, Thursday, July 28, 2011, 6:36:57 PM, you wrote: PB> y pasa algo que no capto. PB> Estoy probando esto solo en 2 opciones del men� principal, no en todo el PB> sistema. (los forms TNumeradores y TRespaldo) PB> Arranca el programa y hago clic en la opci�n de respaldo.... se crea PB> form. Hago clic nuevamente, no pasa por "not assigned" porque sigue PB> estando en nil, y crea otra instancia.... y as� sucesivamente. PB> Si hago lo mismo pero con el otro form, de entrada SIGSEG!.. depurando PB> veo que f5 ya tiene asignado un valor $2a y claro, no lo crea y cuando PB> va a hacer el show... explota. Si tiene el valor $2A desde luego, ese no es un valor v�lido, tu problema, casi seguro, es que como al cerrar el form lo liberas con "caFree" la variable ha dejado de tener sentido, ya que apunta a una zona de memoria liberada.

pero el tema es que por ah� no pas� porque esto sucede cuando arranco por primera vez el programa y hago clic en esa opci�n. Todav�a no la cerr� ninguna vez!
por eso es que no se de d�nde sale ese valor.
Puse otros nombres de variables pero es igual.. no es que por ah� me haya quedado alguna asignaci�n perdida.
Ver� de implementar tu idea.
muchas gracias
chauuuuuuuuu

Reply by email

Paola Bruccoleri
to Paola Bruccoleri

El 28/07/2011 03:09 p.m., Paola Bruccoleri escribi�:

Show quoted text 6 lines
pero el tema es que por ah� no pas� porque esto sucede cuando arranco por primera vez el programa y hago clic en esa opci�n. Todav�a no la cerr� ninguna vez! por eso es que no se de d�nde sale ese valor. Puse otros nombres de variables pero es igual.. no es que por ah� me haya quedado alguna asignaci�n perdida.

agrrrrrr.... lo solucion�!
mi problema era por el lugar d�nde estaba declarando estas variables: var

   f1: TRespaldo;

etc....

ahora las declar� en la secci�n Implementation del formulario principal.

Ahora, otras preguntas....

si alguien desarrolla sistemas usando esta modalidad de forms, que parece que a algunos usuarios les gusta m�s que las modales.. qu� otras precauciones deber� tener? supongo que es obvio con el tema de la apertura de datasets (tablas o querys) de uso com�n. Porque estoy viendo que quiz�s tenga algunos l�os con unas tablitas que uso asiduamente y que coloqu� en un datamodule porque x ej cuando abra uno de los forms donde los uso, y si luego abro otro y cierro.. se me cerrar� la tabla en cuesti�n ocasionando el desastre!..

Estoy buscando mails viejos de la lista acerca de este tema y veo que la �nica forma de solucionar esto es poniendo en todos los form los datasets/datasources .

�alg�n otro tip?
muchas gracias
chauuuuuuuu

Reply by email

Walter
to Paola Bruccoleri

Hola....
Tal vez, usando otro Datamodule para poner los accesos a la bd, ahi estarias programando en las famosas tres capas, pero ojo, vas a tener que controlar que ya no est� abierta, solo eso.

Saludos

Walter Mes�n
*Servicio t�cnico de computadoras, notebooks y netbooks.* Particulares y empresas.
*Hardware/Software.
Programas a medida.
Retiro y entrega a domicilio.

**http://www.compu-solutions.com.ar*

El 29 de julio de 2011 12:23, Paola Bruccoleri
<pbruccoleri en adinet.com.uy>escribi�:

Show quoted text 45 lines
El 28/07/2011 03:09 p.m., Paola Bruccoleri escribi�: pero el tema es que por ah� no pas� porque esto sucede cuando arranco > por primera vez el programa y hago clic en esa opci�n. Todav�a no la cerr� > ninguna vez! > por eso es que no se de d�nde sale ese valor. > Puse otros nombres de variables pero es igual.. no es que por ah� me haya > quedado alguna asignaci�n perdida. > agrrrrrr.... lo solucion�! mi problema era por el lugar d�nde estaba declarando estas variables: var f1: TRespaldo; etc.... ahora las declar� en la secci�n Implementation del formulario principal. Ahora, otras preguntas.... si alguien desarrolla sistemas usando esta modalidad de forms, que parece que a algunos usuarios les gusta m�s que las modales.. qu� otras precauciones deber� tener? supongo que es obvio con el tema de la apertura de datasets (tablas o querys) de uso com�n. Porque estoy viendo que quiz�s tenga algunos l�os con unas tablitas que uso asiduamente y que coloqu� en un datamodule porque x ej cuando abra uno de los forms donde los uso, y si luego abro otro y cierro.. se me cerrar� la tabla en cuesti�n ocasionando el desastre!.. Estoy buscando mails viejos de la lista acerca de este tema y veo que la �nica forma de solucionar esto es poniendo en todos los form los datasets/datasources . �alg�n otro tip? muchas gracias chauuuuuuuu ______________________________**_________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.**freepascal.org<Lazarus-es en lists.lazarus.freepascal.org> http://lists.lazarus.**freepascal.org/mailman/**listinfo/lazarus-es<http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es>

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20110729/1910fda2/attachment.html>

Reply by email

Paola Bruccoleri
to Walter

El 29/07/2011 01:09 p.m., Walter escribi�:

Show quoted text 6 lines
Hola.... Tal vez, usando otro Datamodule para poner los accesos a la bd, ahi estarias programando en las famosas tres capas, pero ojo, vas a tener que controlar que ya no est� abierta, solo eso. Saludos

y cu�l es la funci�n para controlar que no est� abierta? byeeeeeeeeee

Reply by email

Paola Bruccoleri
to Paola Bruccoleri: El 28/07/2011 03:09 p.m., Paola Bruccoleri escribi�: agrrrrrr.... lo solucion�! mi…

El 29/07/2011 12:23 p.m., Paola Bruccoleri escribi�:

Show quoted text 14 lines
El 28/07/2011 03:09 p.m., Paola Bruccoleri escribi�: > pero el tema es que por ah� no pas� porque esto sucede cuando arranco > por primera vez el programa y hago clic en esa opci�n. Todav�a no la > cerr� ninguna vez! > por eso es que no se de d�nde sale ese valor. > Puse otros nombres de variables pero es igual.. no es que por ah� me > haya quedado alguna asignaci�n perdida. agrrrrrr.... lo solucion�! mi problema era por el lugar d�nde estaba declarando estas variables: var f1: TRespaldo; etc.... ahora las declar� en la secci�n Implementation del formulario principal.
de todas maneras, el closeAction:= caFree me deja "mugre" en la
variable, por tanto, no puedo usar el if Assigned(f5)...
deber�a poner f5:= nil... pero deber�a f5 ser global, porque sino "no
existe" obviamente.

En qu� lugar aconsejan Uds declarar todas las variables de los formularios? en alguna unidad global?

En este momento, en el formulario principal tengo:

implementation
uses
frmRespaldo, frmABMMonedas, frmLicitaciones, frmObras, frmListaClientes, Basicas, funciones, frmNumeradores, frmObrasPorFinalizar, frmListadoObras,

   frmPolizasVigentes, frmListadoAntecedentes, dm;

var

   f1: TRespaldo;
   f2: .....

etc....

yo creo que deber�a pasarse lo que est� en el uses de la parte de implementation a la parte interface de alguna unidad global, para que las fN sean accesibles..

chauuuuuuuuuuuu

Reply by email

Paola Bruccoleri
to José Mejuto: PB> y pasa algo que no capto. PB> Estoy probando esto solo en 2 opciones del men�…

El 28/07/2011 03:03 p.m., Jos� Mejuto escribi�:

Show quoted text 65 lines
Hello Paola, Thursday, July 28, 2011, 6:36:57 PM, you wrote: PB> y pasa algo que no capto. PB> Estoy probando esto solo en 2 opciones del men� principal, no en todo el PB> sistema. (los forms TNumeradores y TRespaldo) PB> Arranca el programa y hago clic en la opci�n de respaldo.... se crea PB> form. Hago clic nuevamente, no pasa por "not assigned" porque sigue PB> estando en nil, y crea otra instancia.... y as� sucesivamente. PB> Si hago lo mismo pero con el otro form, de entrada SIGSEG!.. depurando PB> veo que f5 ya tiene asignado un valor $2a y claro, no lo crea y cuando PB> va a hacer el show... explota. Si tiene el valor $2A desde luego, ese no es un valor v�lido, tu problema, casi seguro, es que como al cerrar el form lo liberas con "caFree" la variable ha dejado de tener sentido, ya que apunta a una zona de memoria liberada. Si s�lo quieres que se abra una ventana de cada tipo en vez del "if Assigned" tienes que crearte una funci�n tipo: function ReciclaVentana(const aFormClassName: ansistring): TForm; var j: integer; begin Result:=nil; for j:=0 to Screen.FormCount-1 do begin if UpperCase(Screen.Forms[j].ClassName)=UpperCase(aFormClassName) then begin Result:=Screen.Forms[j]; break; end; end; end; ..... var f5: TForm; begin f5:=ReciclaVentana('TF5'); //TF5 es la clase de la ventana. if not Assigned(f5) then begin f5:=TF5.Create(Self); f5.PopupParent:=Self; end; f5.show; end; Si quieres declarar "f5" como un TF5, ser�a algo as�: ..... var f5: TF5; begin TForm(f5):=ReciclaVentana('TF5'); //TF5 es la clase de la ventana. if not Assigned(f5) then begin f5:=TF5.Create(Self); f5.PopupParent:=Self; end; f5.show; end; No se si me he explicado.... El c�digo lo he escrito al vuelo.

Hola Jos�..
tu c�digo funcion� perfecto!.... estoy viendo de implementarlo para hacer algunos forms no modales.
muchas gracias
chauuuuuuuuuu

Reply by email

José Mejuto
to Paola Bruccoleri: El 29/07/2011 12:23 p.m., Paola Bruccoleri escribi�: de todas maneras, el closeAction:=…

Hello Paola,

you wrote
> ahora las declar� en la secci�n Implementation del formulario principal.
PB> de todas maneras, el closeAction:= caFree me deja "mugre" en la
PB> variable, por tanto, no puedo usar el if Assigned(f5)...
PB> deber�a poner f5:= nil... pero deber�a f5 ser global, porque sino "no
PB> existe" obviamente.

No, no las hagas globales, no es necesario y s�lo te va a complicar la vida, hazla local al procedimiento que hace el Create nada m�s, si quieres una referencia a esa ventana desde otro punto del c�digo has de usar el "ReciclaVentana" para que te devuelva un puntero a ese form. Ejemplo:

procedure CreaElForm();
var
  F5: TF5;
begin
  TForm(F5):=ReciclaVentana('TF5');
  if not Assigned(F5) then begin
    F5:=TF5.Create(Self);
  end;
  F5.Show;
end;
procedure OtraFuncionQueNecesitaF5();
var
  LaMismaf5: TF5;
begin
  TForm(LaMismaf5):=ReciclaVentana('TF5');
  if Assigned(LaMismaf5) then begin
    LaMismaf5.ActualizaValores();
  end else begin
    DebugLn('La ventana F5 no est� disponible, no creada o destruida');
  end;
end;

PB> En qu� lugar aconsejan Uds declarar todas las variables de los PB> formularios? en alguna unidad global?

No, no... De esas ventanas s�lo puede haber una instancia por lo que comentas (ya que antes eran modales) por lo tanto lo m�s f�cil es usar el m�todo del "reciclaventana" ya que otras implementaciones m�s "limpias" son mucho m�s complejas.

La ventana no est� referenciada por ninguna variable, digamos que simplemente existe, con el "reciclaventana" le pedimos que nos busque entre las creadas una de la clase que digamos, y que nos la entregue de vuelta.

Best regards, Jos�

Reply by email

Maxi
to José Mejuto

El servidor me elimin� el mensaje
para hacer lo que queres es mas facil, si esta creada la reflotas, sino la creas.
el findcomponent dependiendo desde donde haces la busqueda es donde lo va a encontrar, si el parent de tu creacion es Aplication lo buscas desde ahi si es pareriente al formnulario de que lo crea osea self solo haces findcomponent

var
   f:tcomponent;
begin
   f:= Application.FindComponent('Form4') ;
     If f  nil then
     Begin
       TForm(f).Show;
     end
     else
     Begin
          with Tform4.Create(Application) do
               Show;
     end;

El 29 de julio de 2011 17:07, Jos� Mejuto <joshyfun en gmail.com> escribi�:

Show quoted text 62 lines
Hello Paola, Friday, July 29, 2011, 7:04:13 PM, you wrote: >> ahora las declar� en la secci�n Implementation del formulario principal. PB> de todas maneras, el closeAction:= caFree me deja "mugre" en la PB> variable, por tanto, no puedo usar el if Assigned(f5)... PB> deber�a poner f5:= nil... pero deber�a f5 ser global, porque sino "no PB> existe" obviamente. No, no las hagas globales, no es necesario y s�lo te va a complicar la vida, hazla local al procedimiento que hace el Create nada m�s, si quieres una referencia a esa ventana desde otro punto del c�digo has de usar el "ReciclaVentana" para que te devuelva un puntero a ese form. Ejemplo: procedure CreaElForm(); var F5: TF5; begin TForm(F5):=ReciclaVentana('TF5'); if not Assigned(F5) then begin F5:=TF5.Create(Self); end; F5.Show; end; procedure OtraFuncionQueNecesitaF5(); var LaMismaf5: TF5; begin TForm(LaMismaf5):=ReciclaVentana('TF5'); if Assigned(LaMismaf5) then begin LaMismaf5.ActualizaValores(); end else begin DebugLn('La ventana F5 no est� disponible, no creada o destruida'); end; end; PB> En qu� lugar aconsejan Uds declarar todas las variables de los PB> formularios? en alguna unidad global? No, no... De esas ventanas s�lo puede haber una instancia por lo que comentas (ya que antes eran modales) por lo tanto lo m�s f�cil es usar el m�todo del "reciclaventana" ya que otras implementaciones m�s "limpias" son mucho m�s complejas. La ventana no est� referenciada por ninguna variable, digamos que simplemente existe, con el "reciclaventana" le pedimos que nos busque entre las creadas una de la clase que digamos, y que nos la entregue de vuelta. -- Best regards, Jos� _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
No a la obsolecencia programada: http://dimensionargentina.blogspot.com/2011/01/todo-esta-disenado-para-romperse.html Twitter: @nenunocomar Identi.ca: @nenuno Linux User #495070 Ubuntu User #28504 http://miexperiencialinux.blogspot.com/ El que pregunta aprende, y el que contesta aprende a responder. ------------ pr�xima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20110801/05ab3020/attachment.html>

Reply by email