[Lazarus-es] Error en formularios y lazreport
Ismael L. Donis Garcia
slibre en citricos.co.cu
Mar Jul 21 22:36:57 CEST 2015
Respondo entre Líneas
========
| ISMAEL |
========
Only for the small landowners and Cubans companies
Website: www.sisconge.byethost15.com
www.sisconge.hol.es
>----- Original Message -----
>From: "Maxi" <maximiliano.duarte en gmail.com>
>To: "Spanish version of Lazarus List"
><lazarus-es en lists.lazarus.freepascal.org>
>Sent: Monday, July 20, 2015 4:25 PM
>Subject: Re: [Lazarus-es] Error en formularios y lazreport
>
>es porque en algun momento estas llamando algo que ya se destruyó o el
>reporte intenta acceder a algo que no puede.
>
>Cada formulario tiene una variable publlica con el objeto por lo que
>si puedes llamarlo.
>
>Si Tdm.IniSis(); se usa para iniciar para que lo vuelves a llamar?
Porque al logearte seleccionas la unidad en la que vas a trabajar, y según
el usuario que te logees seran los permisos que tengas y a las opciones del
sistema que puedas entrar y que tengas visibles en los menus.
>Te digo como hago siempre yo en mis aplicaciones
>
>Desde el proyecto dejo crear automaticamente:
>Modulo de datos con conexion a DB solamente
>->Antes del seguir valido el usuario sino cierro todo
>Modulo de datos con tablas y consultas
>Modulo de datos con lookups
>Formulario principal
Tengo antes un formulario de información que es el splash
Después un formulario de logeo donde seleccionas la entidad en la que vas a
trabajar y se logea el usuario con el sistema
Y después de logeado es que entra el formulario principal.
>Despues de iniciar recien llamo al resto de cosas despues de iniciar
>el form principal. Y uso herencia de formularios, me ahorra mucho
>codigo y configuraciones.
>Lo que noté que el splash lo creas pero no lo destruyes. y si un
>formulario lo vas a recrear luego he visto que usan .FreeAndNil.
>Por eso es mejor crearlo en en proyecto y destruirlo lo antes posible.
Si lo destuyo lo que lo hago en otro procedimieto que no te lo havía puesto
por no considerarlo necesario:
procedure Tdm.entrar();
begin
if length(struser) = 0 then struser := 'administrador';
if (cnsc.Connected or cnsch.Connected or cnos.Connected) then
FinConexServer();
IniConexServer;
Application.CreateForm(Tflogin, flogin);
flogin.ShowModal;
flogin.Free;
if blnend then
cerrarme()
else
begin
fconta.lblestado.Caption := 'Listo';
fconta.Show;
fsplash.Free;
end;
end;
>
>cambia la creacion:
>Application.CreateForm(Tfconta, fconta);
>por
>Tfconta.Create(Application);
>
No lo puedo hacer porque sino falla el siguiente procedimieto que está
dentro del formulario "flogin" ya que no encuentra inicialzado al formulario
"fconta"
procedure Tflogin.mnuother(buser: boolean);
begin
with fconta do begin
mnuherod.Visible := buser;
mnuherbh.Visible := buser;
mnuhercs.Visible := buser;
mnuherbar2.Visible := buser;
mnuherec.Visible := buser;
mnuhercp.Visible := buser;
mnuherbar3.Visible := buser;
mnuherid.Visible := buser;
mnuhereh.Visible := buser;
mnuherbar4.Visible := buser;
end;
end;
>Aunque insisto que eso solo sirve si deseas que el objeto Application
>se encargue de destruir todo al cerrar la aplicacion.
>
>Para el splash esto:
>begin
> RequireDerivedFormResource := True;
> Application.Initialize;
> splash :=(TFormSplash.Create(nil);
> splash.update;
> Application.CreateForm(TForm1, Form1);
> Application.CreateForm(TForm2, Form2);
> Application.CreateForm(TForm3, Form3);
> ... mas formularios
> splash.Free;
> Application.Run;
>end.
Para splah lo cambié por:
fsplash:=Tfsplash.Create(nil);
fsplash.Update;
Como me comentaste pero sigue dando el mismo error al generar el error
después de ejecutar el procedimiento procedure Tdm.IniSis(); por segunda
vez.
También cambie a fconta por:
fconta:=Tfconta.Create(nil);
fconta.Update;
Y ejecuta igual que como lo tenía antes, pero también da el mismo error.
>
>Seguimos en contacto
>
Este día lo tove todo ocupado que recien ahora es que me puedo sentar
delante de la PC
Seguimos en contacto
>El día 20 de julio de 2015, 16:49, Ismael L. Donis Garcia
><slibre en citricos.co.cu> escribió:
>> Respondo entre lineas.
>>
>> Ante todo recuerda que nunca he trabajado con Delphi por lo que provengo
>> de
>> la filosofía de Microsoft la cual de hecho me gusta mucho "me refiero la
>> filosofía de programación".
>>
>>> ----- Original Message ----- From: "Maxi" <maximiliano.duarte en gmail.com>
>>> To: "Spanish version of Lazarus List"
>>> <lazarus-es en lists.lazarus.freepascal.org>
>>> Sent: Monday, July 20, 2015 12:54 PM
>>> Subject: [Lazarus-es] Error en formularios y lazreport
>>>
>>
>>> El día 18 de julio de 2015, 11:57, Ismael L. Donis Garcia
>>> <slibre en citricos.co.cu> escribió:
>>>
>>>> En el encabezamiento del grupo das click secundario y marcas las opción
>>>> de
>>>> Forzar Nueva Página.
>>>>
>>>> Respecto a Delphi ni me preguntes. Jamas en la vida lo he usado, nunca
>>>> me
>>>> ha
>>>> gustado. En windows siempre había trabajado con Visual Estudio.
>>>>
>>>> He mirado a Lazarus porque es libre y multiplataforma y como yo me he
>>>> tirado
>>>> ultimamente para Linux, soy el encargado en mi empresa en difundir el
>>>> soft
>>>> libre. De hecho el sistema operativo que uso por defecto es Jessie,
>>>> aunque
>>>> tengo PC virtuales con 1 millón de sistemas porque viy haciendo
>>>> estudios
>>>> de
>>>> los que puedo hacerme, ahora mismo estoy mirando a Manjaro OpenRC el
>>>> cual
>>>> ha
>>>> tenido una bueba aceptación.
>>>>
>>>> En estos momentos estoy parado en Lazarus, hoy voy a instalar la
>>>> versión
>>>> 1.4.2 a ver si me resuelve un problema que tengo precisamente con
>>>> lazreport
>>>> el cual me da una ecepción si cierro todos los formulario abiertos
>>>> desde
>>>> un
>>>> modulo de datos y los vuelvo a abrir. Al volver abrir los formulario y
>>>> tratar de visualizar algo en lazreport este tira una ecepción y me
>>>> cierra
>>>> el
>>>> programa la rutina que tengo para cerrar los formularios es la
>>>> siguiente:
>>>>
>>>> procedure Tdm.IniSis();
>>>> var
>>>> f: Tforigen;
>>>> i: integer;
>>>> begin
>>>> DecimalSeparator:='.';
>>>> ThousandSeparator:=',';
>>>> ShortDateFormat := 'dd/mm/yyyy';
>>>> blnend := false;
>>>> intciclo := 0;
>>>> intfilas := 0;
>>>> intnivel := 0;
>>>> lngentidad := 0;
>>>> struser := '';
>>>> strerror := '';
>>>> for i := Screen.FormCount - 1 downto 0 do begin
>>>> if Screen.Forms[i].Name <> Self.Name then begin
>>>> if Screen.Forms[i].Name <> 'fconta' then Screen.Forms[i].Free;
>>>> end;
>>>> end;
>>>> for i := Screen.FormCount - 1 downto 0 do begin
>>>> if Screen.Forms[i].Name <> Self.Name then Screen.Forms[i].Free;
>>>> end;
>>>> Application.CreateForm(Tfconta, fconta);
>>>> Application.CreateForm(Tfsplash, fsplash);
>>>> fsplash.Show;
>>>> Application.ProcessMessages;
>>>> if datos() then
>>>> entrar()
>>>> else
>>>> begin
>>>> f:=Tforigen.Create(Self);
>>>> f.IniSystem:=true;
>>>> f.ShowModal;
>>>> f.Free;
>>>> if blnend then
>>>> cerrarme()
>>>> else if datos() then
>>>> begin
>>>> intciclo := intciclo + 1;
>>>> entrar()
>>>> end
>>>> else
>>>> cerrarme();
>>>> end;
>>>> end;
>>>>
>>>> El error que me da es el siguiente:
>>>> El proyecto XXXX ha lanzado una excepción de la clase Éxternal:
>>>> SIGSEGV'
>>>> En
>>>> Archivo '.\include\control.inc'en linea 3260
>>>>
>>>> Pero no veo cual puede ser el error porque si no cierro los formularios
>>>> con
>>>> la rutina anterior nunca me da ese error, lo peor del caso es que a
>>>> veces
>>>> si
>>>> tengo que utilizar ese procedimiento.
>>>>
>>>> Por ese motivo voy a instalar la versión 1.4.2 a ver si persiste el
>>>> problema.
>>>>
>>>> Saludos Cordiales
>>>> ========
>>>> | ISMAEL |
>>>> ========
>>>
>>>
>>> Paso a otro hilo para que sirva despues.
>>>
>>> Creo que primero debes dejar al modulo de datos solo para datos, y
>>> hacer las creaciones y destrucciones mas controladas.
>>>
>>>> Application.CreateForm(Tfsplash, fsplash);
>>>> fsplash.Show;
>>>
>>>
>>> el splash lo creas en el proyecto
>>
>>
>> Ya esta creado en el proyecto el formulario. En esas lineas lo que hace
>> segun la filosofía de microsoft es
>> 1.- crear una instancia del formulario
>> 2.- mostrar la intancia
>>
>> Yo en las propiedades del proyecto tengo a modulo de datos solamente para
>> que se cree el formulario automaticamente los demás no.
>>
>>>
>>>> Application.CreateForm(Tfconta, fconta);
>>>
>>>
>>> No usaria esto sino Tfconta.Create(self), aunque en tu caso usaria el
>>> envento occlose y le pondria caFree, que lo destruye al salir del
>>> form, con eso te olvidas de liberarlo y no usaria Self sino nil (sin
>>> pariente)
>>
>>
>> Si pongo:
>> Tfconta.Create(self);
>> o
>> Tfconta.Create(nil);
>>
>> Despues no puedo mostrar el formulario con:
>> fconta.Show;
>>
>> Ni tampoco puedo usar el siguiente procedimiento por ejemplo ''que lo uso
>> tal como está" lo cual tengo en otro formulario.
>>
>> procedure Tflogin.mnuother(buser: boolean);
>> begin
>> with fconta do begin
>> mnuherod.Visible := buser;
>> mnuherbh.Visible := buser;
>> mnuhercs.Visible := buser;
>> mnuherbar2.Visible := buser;
>> mnuherec.Visible := buser;
>> mnuhercp.Visible := buser;
>> mnuherbar3.Visible := buser;
>> mnuherid.Visible := buser;
>> mnuhereh.Visible := buser;
>> mnuherbar4.Visible := buser;
>> end;
>> end;
>>
>> Ya que no encuentra a fconta
>>
>>>
>>> procedure TFormPrincipal.FormClose(Sender: TObject; var
>>> CloseAction:TCloseAction);
>>> begin
>>> CloseAction:=caFree;
>>> end;
>>>
>>
>> Puse la declaración CloseAction:=caFree; en todo los FormClose y persiste
>> el
>> problema
>>
>>>
>>> Te ayudo si quieres
>>>
>>
>> No estaría de más, por el contrario sería bien venida toda ayuda.
>>
>> Así como lo tengo todo funciona bien. Excepto los reportes que si se
>> visualizan bien la primera vez que se use el procedimiento procedure
>> Tdm.IniSis(); pero si lo ejecuto por segunda vez entonces es cuando me
>> dan
>> error los reportes.
>>
>> Ese procedimieto se ejecuta siempre al iniciar la apliación y ahi todo
>> funciona bien, pero si mando a ejecutar ese procedimiento por segunda vez
>> los reportes dan error, pero el trabajo con los formularios no da error
>> alguno.
>>
>> Saludos Reiterados
>> ========
>> | ISMAEL |
>> ========
>> Only for the small landowners and Cubans companies
>> Website: www.sisconge.byethost15.com
>> www.sisconge.hol.es
More information about the Lazarus-es
mailing list