Sign in Join

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

Mailing lists / lazarus-es / 2009-11

Error en funci?n while

15 messages · 7 people · –

Reply by email Subscribe to this list Your subscription

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

Raistware
to Ismael L. Donis Garc?a: He estado todo este fin de semana atascado en un error que me da la funci�n while, he…

Ismael L. Donis Garc?a escribi�:

He estado todo este fin de semana atascado en un error que me da la funci�n while, he tratado por todas las v�as que conozco y no he podido solucionar el problema.

Saludos:
Lo primero, busca un poco por internet tutoriales b�sicos de Pascal, en especial referente a bucles, porque tienes un lio que no te enteras. Lo segundo, *while* no es ninguna funci�n, es una palabra reservada, algo dr�sticamente distinto.
'*break*' funciona para 'romper' bucles, en C y derivados. En pascal '*break*', que yo recuerde, solo tiene uso en un *case ... of*. Para bucles se utiliza '*Continue*', que lo que hace es continuar con el siguiente. En tu ejemplo, un simple *continue *te basta, puesto que ya has puesto una de las condiciones en el while para que salga: bolhenc false

Show quoted text 129 lines
Al ejecutar la funci�n while en una funci�n que a la ves es llamada por otra funci�n y que esta otra funci�n es llamada por un evento, me ocurre el error. Le adjunt� en otro mensaje un proyecto de ejemplo pero fue retenido, el mismo ten�a sintise del error para ver si me pueden ayudar o es alg�n error del lazarus o del fpc. Por lo que copio y pego el c�digo del formulario para que pueda ser revisado, es un formulario con 1 boton. unit uprueba; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, StrUtils; type { TForm1 } TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormShow(Sender: TObject); private { private declarations } function datos(): Boolean; public { public declarations } function IniExistHead(fileini: string; head: string): boolean; end; var Form1: TForm1; implementation { TForm1 } procedure TForm1.Button1Click(Sender: TObject); var fileini: String; begin {$IFDEF UNIX} fileini := GetEnvironmentVariable ('HOME') + '/mprima.ini'; {$ELSE} fileini := ExtractFilePath (Application.Exename) + 'mprima.ini'; {$ENDIF} if datos () then begin Showmessage ('El archivo ya exist�a'); Showmessage (fileini); end else Showmessage ('El archivo fue creado'); end; procedure TForm1.FormShow(Sender: TObject); begin Button1Click(sender); end; function TForm1.datos(): Boolean; var fileini: String; logfile: TFileStream; begin {$IFDEF UNIX} fileini := GetEnvironmentVariable ('HOME') + '/mprima.ini'; {$ELSE} fileini := ExtractFilePath (Application.Exename) + 'mprima.ini'; {$ENDIF} if FileExists (fileini) then if IniExistHead(fileini, 'Datos') = false then result := false else result := true else begin logfile := TFileStream.Create (fileini, fmCreate or fmOpenReadWrite); logfile.free; result := false; end; end; function TForm1.IniExistHead(fileini: string; head: string): boolean; var bolhenc: boolean; strlinea, strhead: string; oldfileini: TextFile; begin bolhenc := false; AssignFile (oldfileini, fileini); Append (oldfileini); // abre un archivo existente showmessage ('Punto 1'); while (not bolhenc) and (not eof(oldfileini)) do begin showmessage ('Punto 2'); readln(oldfileini, strlinea); strlinea := trim(strlinea); if strlinea '' then if leftstr(strlinea, 1) ';' then if strlinea = strhead then begin bolhenc := true; // al documentar la proxima linea el error se da aqu� //break; // si descomento esta linea me da error aqui end; end; closefile(oldfileini); result := bolhenc; end; initialization {$I uprueba.lrs} end.

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

Reply by email

JoshyFun
to Ismael L. Donis Garc?a: He estado todo este fin de semana atascado en un error que me da la funci�n while, he…

Hello Ismael,

Monday, November 23, 2009, 5:51:40 PM, you wrote:

ILDGa> He estado todo este fin de semana atascado en un error que me da la funci�n ILDGa> while, he tratado por todas las v�as que conozco y no he podido solucionar ILDGa> el problema.
ILDGa> Al ejecutar la funci�n while en una funci�n que a la ves es llamada por otra ILDGa> funci�n y que esta otra funci�n es llamada por un evento, me ocurre el ILDGa> error.

Lo primero ser�a decir cu�l es el error que te da ;)

Veo que llamas al procedimiento desde "FormShow" el cual se invoca cada vez que muestras el formulario, y como tienes ShowMessage, cada vez que aceptas el showmessage deber�a invocarse un nuevo "FormShow". Vamos que hacer cosas en el FormShow no es buena idea normalmente. Si quieres que algo suceda una vez se ha cargado el form tiene el evento "manual" AfterConstruction:

procedure AfterConstruction(); override;
procedure AfterConstruction();
begin
  showmessage('Esto s�lo pasa una vez, cuando se ha creado el form por
  completo');
end;

Puede ser que ese sea el error o no, pero sin saber cual es el error, mal asunto.

Best regards, JoshyFun

Reply by email

Ismael L. Donis Garc?a

He estado todo este fin de semana atascado en un error que me da la funci�n while, he tratado por todas las v�as que conozco y no he podido solucionar el problema.

Al ejecutar la funci�n while en una funci�n que a la ves es llamada por otra funci�n y que esta otra funci�n es llamada por un evento, me ocurre el error.

Le adjunt� en otro mensaje un proyecto de ejemplo pero fue retenido, el mismo ten�a sintise del error para ver si me
pueden ayudar o es alg�n error del lazarus o del fpc.

Por lo que copio y pego el c�digo del formulario para que pueda ser revisado, es un formulario con 1 boton.

unit uprueba;
{$mode objfpc}{$H+}
interface

uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,

  StdCtrls, StrUtils;
type
  { TForm1 }
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { private declarations }
    function datos(): Boolean;
  public
    { public declarations }
    function IniExistHead(fileini: string; head: string): boolean;
  end;
var
  Form1: TForm1;
implementation

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
  var
    fileini: String;
begin
  {$IFDEF UNIX}
    fileini := GetEnvironmentVariable ('HOME') + '/mprima.ini';
  {$ELSE}
    fileini := ExtractFilePath (Application.Exename) + 'mprima.ini';
  {$ENDIF}
  if datos () then
    begin
      Showmessage ('El archivo ya exist�a');
      Showmessage (fileini);
    end
  else
    Showmessage ('El archivo fue creado');
end;
procedure TForm1.FormShow(Sender: TObject);
begin
 Button1Click(sender);
end;
function TForm1.datos(): Boolean;
  var
    fileini: String;
    logfile: TFileStream;
begin
  {$IFDEF UNIX}
    fileini := GetEnvironmentVariable ('HOME') + '/mprima.ini';
  {$ELSE}
    fileini := ExtractFilePath (Application.Exename) + 'mprima.ini';
  {$ENDIF}
  if FileExists (fileini) then
    if IniExistHead(fileini, 'Datos') = false then
      result := false
    else
      result := true
  else
    begin
      logfile := TFileStream.Create (fileini, fmCreate or fmOpenReadWrite);
      logfile.free;
      result := false;
    end;
end;
function TForm1.IniExistHead(fileini: string; head: string): boolean;
  var
    bolhenc: boolean;
    strlinea, strhead: string;
    oldfileini: TextFile;
begin
  bolhenc := false;
  AssignFile (oldfileini, fileini);
  Append (oldfileini); // abre un archivo existente
  showmessage ('Punto 1');
  while (not bolhenc) and (not eof(oldfileini)) do
    begin
  showmessage ('Punto 2');
      readln(oldfileini, strlinea);
      strlinea := trim(strlinea);
      if strlinea  '' then
        if leftstr(strlinea, 1)  ';' then
          if strlinea = strhead then
            begin
              bolhenc := true; // al documentar la proxima linea el error se
da aqu�
              //break; // si descomento esta linea me da error aqui
            end;
    end;
  closefile(oldfileini);
  result := bolhenc;
end;
initialization
  {$I uprueba.lrs}
end.

Saludos.
=========
�� ISMAEL ��
=========
PD: El atasco me es tal que el viernes por la tarde llam� a un amigo por tel�fono que tiene Internet y el domingo me descarg� la �ltima versi�n existente y hoy por la ma�ana la instal� y sigue el problema igual con Lazarus-0.9.29-22700-fpc-2.3.1-20091122-win32.exe

=========
�� ISMAEL ��
=========
"O�r o leer sin reflexionar es una ocupaci�n in�til". Confucio (551-479 a. C.); fil�sofo chino.

Earlier message 25 lines
----- Mensaje original ----- De: <lazarus-es-bounces en lists.lazarus.freepascal.org> Para: <ismael en citricos.co.cu> Enviado: lunes, 23 de noviembre de 2009 08:44 Asunto: El mensaje enviado a Lazarus-es espera la aprobacion del moderador El mensaje que ha enviado a la lista 'Lazarus-es' y que versa sobre: Error en funci?n while Ha sido retenido en espera de que el moderador de la lista lo revise y apruebe. Ha sido retenido por: El cuerpo del mensaje es demasiado grande: 1043459 bytes con un l�mite de 40 KB O se mandar� el mensaje a la lista o se le enviar� una notificaci�n con la decisi�n del moderador. Si desea cancelar este env�o, puede hacerlo a trav�s de la siguiente URL: http://lists.lazarus.freepascal.org/mailman/confirm/lazarus-es/c9394a62e92623e1ecaf5989780bf49ceb9b5ae0

Reply by email

Ismael L. Donis Garc?a
to JoshyFun: ILDGa> He estado todo este fin de semana atascado en un error que me da la funci�n…

El showmessage lo puse para ver el error en que linea era, porque no sab�a en que linea lo daba.

Y por ello pude detectar que era en la linea:

while (not bolhenc) and (not eof(oldfileini)) do

aunque se refleja en la linea:

bolhenc := true;

Yo antes le ten�a puesto break y con break puesto se refleja en la l�nea del break, pero realente ocurre cuando entra a la linea del while

Cuando lo prob� con break era el while de la siguiente forma:

while not eof(oldfileini) do

Y de las 2 formas da el error: Unknown Run-Time error: 104

Osea la funci�n de puebas las puedes tomar de la siguiente forma y probarlas desde un boton, aunque realmento yo las necesito que se ejecute cuando se muestre el formulario.

procedure TForm1.Button1Click(Sender: TObject);
  var
    fileini: String;
begin
  {$IFDEF UNIX}
    fileini := GetEnvironmentVariable ('HOME') + '/mprima.ini';
  {$ELSE}
    fileini := ExtractFilePath (Application.Exename) + 'mprima.ini';
  {$ENDIF}
  if datos () then
      Showmessage ('El archivo ya exist�a') // Esto es solo para probar si
funciona realmente aqu� va otra cosa
  else
    Showmessage ('El archivo fue creado'); // Esto es solo para probar si
funciona realmente aqu� va otra cosa
end;
function TForm1.datos(): Boolean;
  var
    fileini: String;
    logfile: TFileStream;
begin
  {$IFDEF UNIX}
    fileini := GetEnvironmentVariable ('HOME') + '/mprima.ini';
  {$ELSE}
    fileini := ExtractFilePath (Application.Exename) + 'mprima.ini';
  {$ENDIF}
  if FileExists (fileini) then
    if IniExistHead(fileini, 'Datos') = false then
      result := false
    else
      result := true
  else
    begin
      logfile := TFileStream.Create (fileini, fmCreate or fmOpenReadWrite);
      logfile.free;
      result := false;
    end;
end;
function TForm1.IniExistHead(fileini: string; head: string): boolean;
  var
    bolhenc: boolean;
    strlinea, strhead: string;
    oldfileini: TextFile;
begin
  bolhenc := false;
  AssignFile (oldfileini, fileini);
  Append (oldfileini); // abre un archivo existente
  while (not bolhenc) and (not eof(oldfileini)) do
    begin
      readln(oldfileini, strlinea);
      strlinea := trim(strlinea);
      if strlinea  '' then
        if leftstr(strlinea, 1)  ';' then
          if strlinea = strhead then
            begin
              bolhenc := true; // al documentar la proxima linea el error se
da aqu�
              //break; // si descomento esta linea me da error aqui
            end;
    end;
  closefile(oldfileini);
  result := bolhenc;
end;

Saludos
=========
�� ISMAEL ��
=========

Earlier message 48 lines
----- Mensaje original ----- De: "JoshyFun" <joshyfun en gmail.com> Para: "Spanish version of Lazarus List" <lazarus-es en lists.lazarus.freepascal.org> Enviado: lunes, 23 de noviembre de 2009 10:42 Asunto: Re: [Lazarus-es] Error en funci?n while Hello Ismael, Monday, November 23, 2009, 5:51:40 PM, you wrote: ILDGa> He estado todo este fin de semana atascado en un error que me da la funci�n ILDGa> while, he tratado por todas las v�as que conozco y no he podido solucionar ILDGa> el problema. ILDGa> Al ejecutar la funci�n while en una funci�n que a la ves es llamada por otra ILDGa> funci�n y que esta otra funci�n es llamada por un evento, me ocurre el ILDGa> error. Lo primero ser�a decir cu�l es el error que te da ;) Veo que llamas al procedimiento desde "FormShow" el cual se invoca cada vez que muestras el formulario, y como tienes ShowMessage, cada vez que aceptas el showmessage deber�a invocarse un nuevo "FormShow". Vamos que hacer cosas en el FormShow no es buena idea normalmente. Si quieres que algo suceda una vez se ha cargado el form tiene el evento "manual" AfterConstruction: procedure AfterConstruction(); override; procedure AfterConstruction(); begin showmessage('Esto s�lo pasa una vez, cuando se ha creado el form por completo'); end; Puede ser que ese sea el error o no, pero sin saber cual es el error, mal asunto. -- Best regards, JoshyFun

Reply by email

Ismael L. Donis García
to Raistware: Ismael L. Donis Garc?a escribi�: Saludos: Lo primero, busca un poco por internet…

1ro No tengo acceso a Internet: por lo que no puedo buscar por esa v�a.

2do Se que while es una palabra reservado de muchos lenguajes de programaci�n: pero cuando digo funci�n while me refiero a la acci�n que hace while dentro del lenguaje que en difinitiva debe ser una funci�n interna del lenguaje.

3ra te copio textual lo que dice el archivo rtl.pdf que me hizo llegar un miebro de la lista que lamentablemente no recuerdo ahora quien fue.

36.9.25 Break

Synopsis: Exit current loop construct.

Declaration: procedure Break

Visibility: default

Description: Break jumps to the statement following the end of the current repetitive statement. The code

between the Break call and the end of the repetitive statement is skipped. The condition of the

repetitive statement is NOT evaluated.

This can be used with For, var{repeat} and While statements.

Note that while this is a procedure, Break is a reserved word and hence cannot be redefined.

Errors: None.

See also: Continue (1234), Exit (1246)

Listing: ./refex/ex87.pp

4to Acabo de probar con la (palabra reservada) continue y tambi�n da error al entrar en el while.

En otro mensaje mando la imagen del error para que veas.

Saludos
=========
|| ISMAEL ||
=========

Earlier message 152 lines
----- Mensaje original ----- De: Raistware Para: Spanish version of Lazarus List Enviado: lunes, 23 de noviembre de 2009 10:41 Asunto: Re: [Lazarus-es] Error en funci?n while Ismael L. Donis Garc?a escribi�: He estado todo este fin de semana atascado en un error que me da la funci�n while, he tratado por todas las v�as que conozco y no he podido solucionar el problema. Saludos: Lo primero, busca un poco por internet tutoriales b�sicos de Pascal, en especial referente a bucles, porque tienes un lio que no te enteras. Lo segundo, while no es ninguna funci�n, es una palabra reservada, algo dr�sticamente distinto. 'break' funciona para 'romper' bucles, en C y derivados. En pascal 'break', que yo recuerde, solo tiene uso en un case ... of. Para bucles se utiliza 'Continue', que lo que hace es continuar con el siguiente. En tu ejemplo, un simple continue te basta, puesto que ya has puesto una de las condiciones en el while para que salga: bolhenc false Al ejecutar la funci�n while en una funci�n que a la ves es llamada por otra funci�n y que esta otra funci�n es llamada por un evento, me ocurre el error. Le adjunt� en otro mensaje un proyecto de ejemplo pero fue retenido, el mismo ten�a sintise del error para ver si me pueden ayudar o es alg�n error del lazarus o del fpc. Por lo que copio y pego el c�digo del formulario para que pueda ser revisado, es un formulario con 1 boton. unit uprueba; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, StrUtils; type { TForm1 } TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormShow(Sender: TObject); private { private declarations } function datos(): Boolean; public { public declarations } function IniExistHead(fileini: string; head: string): boolean; end; var Form1: TForm1; implementation { TForm1 } procedure TForm1.Button1Click(Sender: TObject); var fileini: String; begin {$IFDEF UNIX} fileini := GetEnvironmentVariable ('HOME') + '/mprima.ini'; {$ELSE} fileini := ExtractFilePath (Application.Exename) + 'mprima.ini'; {$ENDIF} if datos () then begin Showmessage ('El archivo ya exist�a'); Showmessage (fileini); end else Showmessage ('El archivo fue creado'); end; procedure TForm1.FormShow(Sender: TObject); begin Button1Click(sender); end; function TForm1.datos(): Boolean; var fileini: String; logfile: TFileStream; begin {$IFDEF UNIX} fileini := GetEnvironmentVariable ('HOME') + '/mprima.ini'; {$ELSE} fileini := ExtractFilePath (Application.Exename) + 'mprima.ini'; {$ENDIF} if FileExists (fileini) then if IniExistHead(fileini, 'Datos') = false then result := false else result := true else begin logfile := TFileStream.Create (fileini, fmCreate or fmOpenReadWrite); logfile.free; result := false; end; end; function TForm1.IniExistHead(fileini: string; head: string): boolean; var bolhenc: boolean; strlinea, strhead: string; oldfileini: TextFile; begin bolhenc := false; AssignFile (oldfileini, fileini); Append (oldfileini); // abre un archivo existente showmessage ('Punto 1'); while (not bolhenc) and (not eof(oldfileini)) do begin showmessage ('Punto 2'); readln(oldfileini, strlinea); strlinea := trim(strlinea); if strlinea '' then if leftstr(strlinea, 1) ';' then if strlinea = strhead then begin bolhenc := true; // al documentar la proxima linea el error se da aqu� //break; // si descomento esta linea me da error aqui end; end; closefile(oldfileini); result := bolhenc; end; initialization {$I uprueba.lrs} end. ------------------------------------------------------------------------------

Reply by email

Paola Bruccoleri
to Raistware: Ismael L. Donis Garc?a escribi�: Saludos: Lo primero, busca un poco por internet…

Raistware escribi�:

Show quoted text 18 lines
Ismael L. Donis Garc?a escribi�: > He estado todo este fin de semana atascado en un error que me da la funci�n > while, he tratado por todas las v�as que conozco y no he podido solucionar > el problema. > Saludos: Lo primero, busca un poco por internet tutoriales b�sicos de Pascal, en especial referente a bucles, porque tienes un lio que no te enteras. Lo segundo, *while* no es ninguna funci�n, es una palabra reservada, algo dr�sticamente distinto. '*break*' funciona para 'romper' bucles, en C y derivados. En pascal '*break*', que yo recuerde, solo tiene uso en un *case ... of*. Para bucles se utiliza '*Continue*', que lo que hace es continuar con el siguiente. En tu ejemplo, un simple *continue *te basta, puesto que ya has puesto una de las condiciones en el while para que salga: bolhenc false

Hola Raistware
es una pena que t� no hayas visto las posdata de los mensajes anteriores de Ismael, donde dice claramente que no tiene acceso a la web; s�lo tiene, a veces, la posibilidad de enviar o recibir alg�n mail, y no s� siquiera si todos los d�as. Si hubieras visto su mail, te habr�s fijado que es cubano y m�s o menos se sabe cual es la situaci�n en ese pa�s respecto al acceso a internet. Lo que puedes hacer, es enviarle, en trozos de a 600K (por sus limitaciones) alg�n manual de pascal para que estudie.
Muchos saludos..

Reply by email

JoshyFun
to Ismael L. Donis Garc?a: No sab�a de la existencia de ese evento ya que no aparece en la ventana de eventos,…

Hello Ismael,

Monday, November 23, 2009, 7:51:27 PM, you wrote:

ILDGa> No sab�a de la existencia de ese evento ya que no aparece en la ventana de ILDGa> eventos, pero de todas formas da el error.

El optimizador de Pascal te est� jugando una mala pasada. Abre las preferencias del compilador y en optimizaci�n ponle "Level 0", ya que "Level 1" hace pocas optimizaciones, pero alguna si (elimina alguna lineas de c�digo a veces).

No estoy seguro de que este sea el problema, mi manejo de "ficheros pascal" es m�s bien nulo (no los uso desde hace m�s de 15 a�os).

---------------------
[...]
  AssignFile (oldfileini, fileini);
  Append (oldfileini); // abre un archivo existente
  APPEND ??? Ser� Reset no ?
  while (not bolhenc) and (not eof(oldfileini)) do
    begin
      readln(oldfileini, strlinea);

READ ??????
----------------------

Best regards, JoshyFun

Reply by email

Ismael L. Donis Garc?a
to JoshyFun: ILDGa> He estado todo este fin de semana atascado en un error que me da la funci�n…

No sab�a de la existencia de ese evento ya que no aparece en la ventana de eventos, pero de todas formas da el error.

Saludos cordiales
=========
�� ISMAEL ��
=========

Earlier message 48 lines
----- Mensaje original ----- De: "JoshyFun" <joshyfun en gmail.com> Para: "Spanish version of Lazarus List" <lazarus-es en lists.lazarus.freepascal.org> Enviado: lunes, 23 de noviembre de 2009 10:42 Asunto: Re: [Lazarus-es] Error en funci?n while Hello Ismael, Monday, November 23, 2009, 5:51:40 PM, you wrote: ILDGa> He estado todo este fin de semana atascado en un error que me da la funci�n ILDGa> while, he tratado por todas las v�as que conozco y no he podido solucionar ILDGa> el problema. ILDGa> Al ejecutar la funci�n while en una funci�n que a la ves es llamada por otra ILDGa> funci�n y que esta otra funci�n es llamada por un evento, me ocurre el ILDGa> error. Lo primero ser�a decir cu�l es el error que te da ;) Veo que llamas al procedimiento desde "FormShow" el cual se invoca cada vez que muestras el formulario, y como tienes ShowMessage, cada vez que aceptas el showmessage deber�a invocarse un nuevo "FormShow". Vamos que hacer cosas en el FormShow no es buena idea normalmente. Si quieres que algo suceda una vez se ha cargado el form tiene el evento "manual" AfterConstruction: procedure AfterConstruction(); override; procedure AfterConstruction(); begin showmessage('Esto s�lo pasa una vez, cuando se ha creado el form por completo'); end; Puede ser que ese sea el error o no, pero sin saber cual es el error, mal asunto. -- Best regards, JoshyFun

Reply by email

Walter Mesón
to JoshyFun: ILDGa> No sab�a de la existencia de ese evento ya que no aparece en la ventana de…

Hola JoshyFun....

Show quoted text 9 lines
ILDGa> No sab�a de la existencia de ese evento ya que no aparece en la ventana de ILDGa> eventos, pero de todas formas da el error. El optimizador de Pascal te est� jugando una mala pasada. Abre las preferencias del compilador y en optimizaci�n ponle "Level 0", ya que "Level 1" hace pocas optimizaciones, pero alguna si (elimina alguna lineas de c�digo a veces).

Perd�n por mi pregunta, es que si bien hace a�os que estoy programando en Delphi (primero Delphi 5 y ahora en Delphi 7), reci�n hace un tiempo relativamente corto que estoy haciendo uso "paralelamente" de Lazarus y me encuentro que �ste tiene muchas cosas para "ajustar" de las que a simple vista un usuario com�n no las ve ni se entera que existen, como por ejemplo, lo que indic�s mas arriba con respecto a la optimizaci�n del entorno.
Mi pregunta (en realidad, mi pedido) es ver si se puede, en alg�n lugar o aqu� mismo se pudiera armar una especie de tutorial donde se indique la mejor forma de ajustar la performance o publicar "tips" que nos permita sacarle mejor jugo a Lazarus.Googleando he encontrado algo de informaci�n bastante dispersa, en distintos idiomas y por lo que veo, desde el punto de vista de la documentaci�n, pero no desde la experiencia de usuario.

Por lo que veo, este foro tiene gente que ya lleva bastante tiempo y experiencia en Lazarus, tal vez nos podr�an dar una mano en ese tema.

S�lo eso, una sugerencia, nada mas.

Gracias.

Saludos. * Walter * Visit� http://porlavueltadenelsonyfabri.blogspot.com ------------ pr�xima parte ------------ A non-text attachment was scrubbed... Name: wmeson.vcf Type: text/x-vcard Size: 163 bytes Desc: no disponible URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20091123/7b163415/attachment.vcf>

Reply by email

JoshyFun
to Walter Mesón

Hello Walter,

Monday, November 23, 2009, 8:17:13 PM, you wrote:

WM> Mi pregunta (en realidad, mi pedido) es ver si se puede, en alg�n lugar WM> o aqu� mismo se pudiera armar una especie de tutorial donde se indique WM> la mejor forma de ajustar la performance o publicar "tips" que nos WM> permita sacarle mejor jugo a Lazarus.Googleando he encontrado algo de WM> informaci�n bastante dispersa, en distintos idiomas y por lo que veo, WM> desde el punto de vista de la documentaci�n, pero no desde la WM> experiencia de usuario.

En realidad esto mismo pasa en el optimizador de Delphi, lo que sucede aqu� es que como el debugger es externo (GDB) a veces el error lo da en una linea, pero te muestra la siguiente (o incluso 2 o 3 m�s abajo) ya que alguna de las anteriores ha sido eliminada por el optimizador (entiende que no hace nada de nada). Estos peque�os "tips" los vas cogiendo poco a poco, o a veces de casualidad como este que comento.

Lo mejor es el foro de Lazarus o bien las wikis de freepascal y lazarus, pero la verdad en estas es muy dif�cil buscar informaci�n relevante.

Best regards, JoshyFun

Reply by email

Juan Carlos
to Ismael L. Donis Garc?a: El showmessage lo puse para ver el error en que linea era, porque no sab�a en que linea…

Hola Ismael.

Utilizas la estructuta c�clica while para recorrer el archivo y vas leyendo cada l�nea con el procedimiento ReadLn. El procedimiento Append que usas abre el archivo y lo prepara para adicionar informaci�n. Me parese que debes sustituir Append y en su lugar utilizar Reset que abre el archivo y lo deja listo para realizar la lectura.

Saludos a todos, Juan Carlos.

Earlier message 150 lines
----- Original Message ----- From: "Ismael L. Donis Garc?a" <ismael en citricos.co.cu> To: "Spanish version of Lazarus List" <lazarus-es en lists.lazarus.freepascal.org> Sent: Monday, November 23, 2009 10:10 AM Subject: Re: [Lazarus-es] Error en funci?n while El showmessage lo puse para ver el error en que linea era, porque no sab�a en que linea lo daba. Y por ello pude detectar que era en la linea: while (not bolhenc) and (not eof(oldfileini)) do aunque se refleja en la linea: bolhenc := true; Yo antes le ten�a puesto break y con break puesto se refleja en la l�nea del break, pero realente ocurre cuando entra a la linea del while Cuando lo prob� con break era el while de la siguiente forma: while not eof(oldfileini) do Y de las 2 formas da el error: Unknown Run-Time error: 104 Osea la funci�n de puebas las puedes tomar de la siguiente forma y probarlas desde un boton, aunque realmento yo las necesito que se ejecute cuando se muestre el formulario. procedure TForm1.Button1Click(Sender: TObject); var fileini: String; begin {$IFDEF UNIX} fileini := GetEnvironmentVariable ('HOME') + '/mprima.ini'; {$ELSE} fileini := ExtractFilePath (Application.Exename) + 'mprima.ini'; {$ENDIF} if datos () then Showmessage ('El archivo ya exist�a') // Esto es solo para probar si funciona realmente aqu� va otra cosa else Showmessage ('El archivo fue creado'); // Esto es solo para probar si funciona realmente aqu� va otra cosa end; function TForm1.datos(): Boolean; var fileini: String; logfile: TFileStream; begin {$IFDEF UNIX} fileini := GetEnvironmentVariable ('HOME') + '/mprima.ini'; {$ELSE} fileini := ExtractFilePath (Application.Exename) + 'mprima.ini'; {$ENDIF} if FileExists (fileini) then if IniExistHead(fileini, 'Datos') = false then result := false else result := true else begin logfile := TFileStream.Create (fileini, fmCreate or fmOpenReadWrite); logfile.free; result := false; end; end; function TForm1.IniExistHead(fileini: string; head: string): boolean; var bolhenc: boolean; strlinea, strhead: string; oldfileini: TextFile; begin bolhenc := false; AssignFile (oldfileini, fileini); Append (oldfileini); // abre un archivo existente while (not bolhenc) and (not eof(oldfileini)) do begin readln(oldfileini, strlinea); strlinea := trim(strlinea); if strlinea '' then if leftstr(strlinea, 1) ';' then if strlinea = strhead then begin bolhenc := true; // al documentar la proxima linea el error se da aqu� //break; // si descomento esta linea me da error aqui end; end; closefile(oldfileini); result := bolhenc; end; Saludos ========= �� ISMAEL �� ========= ----- Mensaje original ----- De: "JoshyFun" <joshyfun en gmail.com> Para: "Spanish version of Lazarus List" <lazarus-es en lists.lazarus.freepascal.org> Enviado: lunes, 23 de noviembre de 2009 10:42 Asunto: Re: [Lazarus-es] Error en funci?n while Hello Ismael, Monday, November 23, 2009, 5:51:40 PM, you wrote: ILDGa> He estado todo este fin de semana atascado en un error que me da la funci�n ILDGa> while, he tratado por todas las v�as que conozco y no he podido solucionar ILDGa> el problema. ILDGa> Al ejecutar la funci�n while en una funci�n que a la ves es llamada por otra ILDGa> funci�n y que esta otra funci�n es llamada por un evento, me ocurre el ILDGa> error. Lo primero ser�a decir cu�l es el error que te da ;) Veo que llamas al procedimiento desde "FormShow" el cual se invoca cada vez que muestras el formulario, y como tienes ShowMessage, cada vez que aceptas el showmessage deber�a invocarse un nuevo "FormShow". Vamos que hacer cosas en el FormShow no es buena idea normalmente. Si quieres que algo suceda una vez se ha cargado el form tiene el evento "manual" AfterConstruction: procedure AfterConstruction(); override; procedure AfterConstruction(); begin showmessage('Esto s�lo pasa una vez, cuando se ha creado el form por completo'); end; Puede ser que ese sea el error o no, pero sin saber cual es el error, mal asunto. -- Best regards, JoshyFun

Reply by email

JoshyFun
to Ismael L. Donis Garc?a: 1 Mill�n de gracias, no conoc�a la existencia de Reset. Ahora tengo otro problema…

Hello Ismael,

Tuesday, November 24, 2009, 12:04:39 AM, you wrote:

ILDGa> 1 Mill�n de gracias, no conoc�a la existencia de Reset. ILDGa> Ahora tengo otro problema mucho m�s sencillo para ustedes y es el siguiente. ILDGa> Yo quiero mostrar un formulario y de ese llamo la funci�n que en caso que me ILDGa> devuelva false me muestre otro formulario pero encima de este y si me lo ILDGa> muestra pero me oculta el que lo est� llamando.

Haces showmodal, cuyo significado es "Ponte encima de cualquier otro formulario y no permitas que otro se "suba" encima".

Prueba con:

ILDGa>   if datos () then
ILDGa>     begin
ILDGa>        // aqu� realizo una serie de operaciones
ILDGa>     end
ILDGa>   else
ILDGa>     begin
             frmorigen:=Tfrmorigen.Create(nil);
             frmorigen.show; // Muestra formularios entre iguales
             Self.BringToFront; // Obliga al actual a estar por encima
ILDGa>     end;
ILDGa> end;
Best regards, JoshyFun

Reply by email

Ismael L. Donis Garc?a
to JoshyFun: ILDGa> No sab�a de la existencia de ese evento ya que no aparece en la ventana de…

Pues no se que ser�a, desinstal�, reinstal� y revis� lo que me dijiste del compilador, y se solucion� todo. Lo que si al final cambi� de la versi�n:

Lazarus-0.9.28.3-22354-fpc-2.2.4-20091031-win32.exe a
Lazarus-0.9.29-22700-fpc-2.3.1-20091122-win32.exe

En fin no supe como se solucion� el problema la funci�n original qued�:

function Tdtmmp.IniExistHead(fileini: string; head: string): boolean;
  //Revisa si existe una cabecera en el archivo ini especificado y si existe
devuelve true
  //El argumento fileini debe incluir la ruta completa del archivo
  var
    bolhenc: boolean;
    strlinea, strhead: string;
    oldfileini: TextFile;
begin
  bolhenc := false;
  strhead := HeadIniFormated(head);
  AssignFile (oldfileini, fileini);
  Reset(oldfileini); // abre un archivo existente
  while not eof(oldfileini) do
    begin
      readln(oldfileini, strlinea);
      strlinea := trim(strlinea);
      if strlinea  '' then
        if leftstr(strlinea, 1)  ';' then
          if strlinea = strhead then
            begin
              bolhenc := true;
              break;
            end;
    end;
  closefile(oldfileini);
  result := bolhenc;
end;

Perdonen las molestias causadas.
=========
�� ISMAEL ��
=========

Earlier message 44 lines
----- Mensaje original ----- De: "JoshyFun" <joshyfun en gmail.com> Para: "Spanish version of Lazarus List" <lazarus-es en lists.lazarus.freepascal.org> Enviado: lunes, 23 de noviembre de 2009 12:48 Asunto: Re: [Lazarus-es] Error en funci?n while Hello Ismael, Monday, November 23, 2009, 7:51:27 PM, you wrote: ILDGa> No sab�a de la existencia de ese evento ya que no aparece en la ventana de ILDGa> eventos, pero de todas formas da el error. El optimizador de Pascal te est� jugando una mala pasada. Abre las preferencias del compilador y en optimizaci�n ponle "Level 0", ya que "Level 1" hace pocas optimizaciones, pero alguna si (elimina alguna lineas de c�digo a veces). No estoy seguro de que este sea el problema, mi manejo de "ficheros pascal" es m�s bien nulo (no los uso desde hace m�s de 15 a�os). --------------------- [...] AssignFile (oldfileini, fileini); Append (oldfileini); // abre un archivo existente APPEND ??? Ser� Reset no ? while (not bolhenc) and (not eof(oldfileini)) do begin readln(oldfileini, strlinea); READ ?????? ---------------------- -- Best regards, JoshyFun

Reply by email

Ismael L. Donis Garc?a
to Juan Carlos: Hola Ismael. Utilizas la estructuta c�clica while para recorrer el archivo y vas leyendo

1 Mill�n de gracias, no conoc�a la existencia de Reset.

Ahora tengo otro problema mucho m�s sencillo para ustedes y es el siguiente.

Yo quiero mostrar un formulario y de ese llamo la funci�n que en caso que me devuelva false me muestre otro formulario pero encima de este y si me lo muestra pero me oculta el que lo est� llamando.

Lo tengo as�:

procedure Tfrmsplash.AfterConstruction();
var
  fileini: String;
begin
  inherited AfterConstruction();
  {$IFDEF UNIX}
    fileini := GetEnvironmentVariable ('HOME') + '/mprima.ini';
  {$ELSE}
    fileini := ExtractFilePath (Application.Exename) + 'mprima.ini';
  {$ENDIF}
  if datos () then
    begin
       // aqu� realizo una serie de operaciones
    end
  else
    begin
      Application.CreateForm(Tfrmorigen, frmorigen);
      frmorigen.ShowModal; // aqu� es donde quiero que lo muestre sin
ocultar a quien lo llam�
    end;
end;

Saludos reiterados y perd�neme tantas preguntas
=========
�� ISMAEL ��
=========
PD: No tengo acceso a Internet

Earlier message 168 lines
----- Mensaje original ----- De: "Juan Carlos" <juancarlos en cubalub.cupet.cu> Para: "Spanish version of Lazarus List" <lazarus-es en lists.lazarus.freepascal.org> Enviado: lunes, 23 de noviembre de 2009 04:08 Asunto: Re: [Lazarus-es] Error en funci?n while Hola Ismael. Utilizas la estructuta c�clica while para recorrer el archivo y vas leyendo cada l�nea con el procedimiento ReadLn. El procedimiento Append que usas abre el archivo y lo prepara para adicionar informaci�n. Me parese que debes sustituir Append y en su lugar utilizar Reset que abre el archivo y lo deja listo para realizar la lectura. Saludos a todos, Juan Carlos. ----- Original Message ----- From: "Ismael L. Donis Garc?a" <ismael en citricos.co.cu> To: "Spanish version of Lazarus List" <lazarus-es en lists.lazarus.freepascal.org> Sent: Monday, November 23, 2009 10:10 AM Subject: Re: [Lazarus-es] Error en funci?n while El showmessage lo puse para ver el error en que linea era, porque no sab�a en que linea lo daba. Y por ello pude detectar que era en la linea: while (not bolhenc) and (not eof(oldfileini)) do aunque se refleja en la linea: bolhenc := true; Yo antes le ten�a puesto break y con break puesto se refleja en la l�nea del break, pero realente ocurre cuando entra a la linea del while Cuando lo prob� con break era el while de la siguiente forma: while not eof(oldfileini) do Y de las 2 formas da el error: Unknown Run-Time error: 104 Osea la funci�n de puebas las puedes tomar de la siguiente forma y probarlas desde un boton, aunque realmento yo las necesito que se ejecute cuando se muestre el formulario. procedure TForm1.Button1Click(Sender: TObject); var fileini: String; begin {$IFDEF UNIX} fileini := GetEnvironmentVariable ('HOME') + '/mprima.ini'; {$ELSE} fileini := ExtractFilePath (Application.Exename) + 'mprima.ini'; {$ENDIF} if datos () then Showmessage ('El archivo ya exist�a') // Esto es solo para probar si funciona realmente aqu� va otra cosa else Showmessage ('El archivo fue creado'); // Esto es solo para probar si funciona realmente aqu� va otra cosa end; function TForm1.datos(): Boolean; var fileini: String; logfile: TFileStream; begin {$IFDEF UNIX} fileini := GetEnvironmentVariable ('HOME') + '/mprima.ini'; {$ELSE} fileini := ExtractFilePath (Application.Exename) + 'mprima.ini'; {$ENDIF} if FileExists (fileini) then if IniExistHead(fileini, 'Datos') = false then result := false else result := true else begin logfile := TFileStream.Create (fileini, fmCreate or fmOpenReadWrite); logfile.free; result := false; end; end; function TForm1.IniExistHead(fileini: string; head: string): boolean; var bolhenc: boolean; strlinea, strhead: string; oldfileini: TextFile; begin bolhenc := false; AssignFile (oldfileini, fileini); Append (oldfileini); // abre un archivo existente while (not bolhenc) and (not eof(oldfileini)) do begin readln(oldfileini, strlinea); strlinea := trim(strlinea); if strlinea '' then if leftstr(strlinea, 1) ';' then if strlinea = strhead then begin bolhenc := true; // al documentar la proxima linea el error se da aqu� //break; // si descomento esta linea me da error aqui end; end; closefile(oldfileini); result := bolhenc; end; Saludos ========= �� ISMAEL �� ========= ----- Mensaje original ----- De: "JoshyFun" <joshyfun en gmail.com> Para: "Spanish version of Lazarus List" <lazarus-es en lists.lazarus.freepascal.org> Enviado: lunes, 23 de noviembre de 2009 10:42 Asunto: Re: [Lazarus-es] Error en funci?n while Hello Ismael, Monday, November 23, 2009, 5:51:40 PM, you wrote: ILDGa> He estado todo este fin de semana atascado en un error que me da la funci�n ILDGa> while, he tratado por todas las v�as que conozco y no he podido solucionar ILDGa> el problema. ILDGa> Al ejecutar la funci�n while en una funci�n que a la ves es llamada por otra ILDGa> funci�n y que esta otra funci�n es llamada por un evento, me ocurre el ILDGa> error. Lo primero ser�a decir cu�l es el error que te da ;) Veo que llamas al procedimiento desde "FormShow" el cual se invoca cada vez que muestras el formulario, y como tienes ShowMessage, cada vez que aceptas el showmessage deber�a invocarse un nuevo "FormShow". Vamos que hacer cosas en el FormShow no es buena idea normalmente. Si quieres que algo suceda una vez se ha cargado el form tiene el evento "manual" AfterConstruction: procedure AfterConstruction(); override; procedure AfterConstruction(); begin showmessage('Esto s�lo pasa una vez, cuando se ha creado el form por completo'); end; Puede ser que ese sea el error o no, pero sin saber cual es el error, mal asunto. -- Best regards, JoshyFun

Reply by email

Ismael L. Donis Garc?a
to Juan Carlos: Hola Ismael. Utilizas la estructuta c�clica while para recorrer el archivo y vas leyendo

Gracias ya lo resolv� creo que de una forma ortodoxa, pero al menos funciona.

Con .show no me serv�a porque me dejaba pasar al otro formulario, tampoco me serv�a en el evento AfterConstruction ya que se ejecuta antes de mostrar el formulario, lo que no se porque en el evento .FormShow tambi�n se ejecuta antes de mostrar el formulario.

Necesitava un evento que se ejecutara despu�s de estar visible el formulario y el �nico que encontr� fue el .FormActivate por lo que tuve que usar una variable para evitar que el procedimiento se ejecutase de nuevo al cerrar el formulario.

Gracias a to2s
=========
�� ISMAEL ��
=========

Earlier message 43 lines
----- Mensaje original ----- De: "JoshyFun" <joshyfun en gmail.com> Para: "Spanish version of Lazarus List" <lazarus-es en lists.lazarus.freepascal.org> Enviado: lunes, 23 de noviembre de 2009 04:49 Asunto: Re: [Lazarus-es] Error en funci?n while Hello Ismael, Tuesday, November 24, 2009, 12:04:39 AM, you wrote: ILDGa> 1 Mill�n de gracias, no conoc�a la existencia de Reset. ILDGa> Ahora tengo otro problema mucho m�s sencillo para ustedes y es el siguiente. ILDGa> Yo quiero mostrar un formulario y de ese llamo la funci�n que en caso que me ILDGa> devuelva false me muestre otro formulario pero encima de este y si me lo ILDGa> muestra pero me oculta el que lo est� llamando. Haces showmodal, cuyo significado es "Ponte encima de cualquier otro formulario y no permitas que otro se "suba" encima". Prueba con: ILDGa> if datos () then ILDGa> begin ILDGa> // aqu� realizo una serie de operaciones ILDGa> end ILDGa> else ILDGa> begin frmorigen:=Tfrmorigen.Create(nil); frmorigen.show; // Muestra formularios entre iguales Self.BringToFront; // Obliga al actual a estar por encima ILDGa> end; ILDGa> end; -- Best regards, JoshyFun

Reply by email