Sign in Join

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

Mailing lists / lazarus-es / 2012-10

Error en paso de parametros

4 messages · 2 people · –

Reply by email Subscribe to this list Your subscription

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

Antonio Évora

Estimados listeros,
Trabajo con la revisi�n de SVN 35723 de Lazarus y fpc 2.4.4. y estoy teniendo un problema con el paso de par�metros a una funci�n. Llamo dos veces a la funci�n (exactamente la misma llamada) y la primera se pasa todo correctamente pero la segunda vez el primer par�metro no es pasado (pasa como cadena vac�a). A�ado el c�digo por si le quer�is dar un vistazo, en un proyecto nuevo pon�is un bot�n y listo..

Un saludo y gracias de antemano.
Antonio �vora

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

uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type
   TForm1 = class(TForm)
     Button1: TButton;
     procedure Button1Click(Sender: TObject);
   private
     { private declarations }
   public
     function StringToWhere(aString: string): boolean;
     { public declarations }
   end
var
   Form1: TForm1;
implementation
uses LazUTF8;
{$R *.lfm}
function GetSubString(aStr, aSeparator: string;
   EqualsIfNotSeparator, TrimParts: boolean; MinLenghtPartLeft,
   MinLenghtPartRight: integer; out aPartLeft, aPartRight: string): boolean;
begin
   Result:=(aStr'');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
   StringToWhere('1234|5678:0000');
end;
function ParseSubString(aStr: string; out aWhereField,
   aRelatedTable, aRelatedFieldID, aRelatedFieldCaption, aTabCaption:
string;
   out aObligatory: boolean): boolean;
begin
   Result:=false;
   aWhereField:='';
   aRelatedTable:='';
   aRelatedFieldID:='';
   aRelatedFieldCaption:='';
   aTabCaption:='';
   aObligatory:=false;
   //Separo el campo del resto
   if not GetSubString(aStr,'|',false,true,2,5,aWhereField,aStr) then
   begin
     //La aStr no es valida
     ShowMessage('Mal');
     exit;
   end;
   if not GetSubString(aStr,':',false,true,2,5,aWhereField,aStr) then
   begin
     //La aStr no es valida
     ShowMessage('Mal');
     exit;
   end;
   ShowMessage('Bien');
   Result:=true;
end;
function TForm1.StringToWhere(aString: string): boolean;
var
   Posicion: integer;
   SubString: string;
   aWhereField: string;
   aRelatedFieldID: string;
   aRelatedFieldCaption: string;
   aRelatedTable: string;
   aTabCaption: string;
   aObligatory: boolean;
begin
   Result:=false;
   //Trato el ultimo elemento
   if not ParseSubString(aString,aWhereField,aRelatedTable,aRelatedFieldID,
     aRelatedFieldCaption,aTabCaption,aObligatory) then
   begin
     //Y salgo
     exit;
   end;
   Result:=true;
end;
end.

Reply by email

José Mejuto
to Antonio Évora

El 21/10/2012 1:00, Antonio �vora escribi�:

Show quoted text 14 lines
Estimados listeros, Trabajo con la revisi�n de SVN 35723 de Lazarus y fpc 2.4.4. y estoy teniendo un problema con el paso de par�metros a una funci�n. Llamo dos veces a la funci�n (exactamente la misma llamada) y la primera se pasa todo correctamente pero la segunda vez el primer par�metro no es pasado (pasa como cadena vac�a). A�ado el c�digo por si le quer�is dar un vistazo, en un proyecto nuevo pon�is un bot�n y listo.. function GetSubString(aStr, aSeparator: string; EqualsIfNotSeparator, TrimParts: boolean; MinLenghtPartLeft, MinLenghtPartRight: integer; out aPartLeft, aPartRight: string): boolean; if not GetSubString(aStr,'|',false,true,2,5,aWhereField,aStr) then

Hola,

Pasas aStr 2 veces, al principio y al final. En GetSubString el primer par�metro no tiene modificador, pero los dos ultimos son tipo out, lo que quiere decir que la variable que se pase ah� ser� inicializada a "" justo antes de entrar en la funci�n.

Usa var en vez de out, o mejor variables diferentes. Pasar la misma variable en dos par�metros cuando uno va a ser modificado suele ser un desastre por norma general.

Reply by email

Antonio Évora
to José Mejuto

El 21/10/12 15:29, Jos� Mejuto escribi�:

Show quoted text 33 lines
El 21/10/2012 1:00, Antonio �vora escribi�: > Estimados listeros, > Trabajo con la revisi�n de SVN 35723 de Lazarus y fpc 2.4.4. y estoy > teniendo un problema con el paso de par�metros a una funci�n. Llamo dos > veces a la funci�n (exactamente la misma llamada) y la primera se pasa > todo correctamente pero la segunda vez el primer par�metro no es pasado > (pasa como cadena vac�a). A�ado el c�digo por si le quer�is dar un > vistazo, en un proyecto nuevo pon�is un bot�n y listo.. > > function GetSubString(aStr, aSeparator: string; > EqualsIfNotSeparator, TrimParts: boolean; MinLenghtPartLeft, > MinLenghtPartRight: integer; out aPartLeft, aPartRight: string): > boolean; > if not GetSubString(aStr,'|',false,true,2,5,aWhereField,aStr) then Hola, Pasas aStr 2 veces, al principio y al final. En GetSubString el primer par�metro no tiene modificador, pero los dos ultimos son tipo out, lo que quiere decir que la variable que se pase ah� ser� inicializada a "" justo antes de entrar en la funci�n. Usa var en vez de out, o mejor variables diferentes. Pasar la misma variable en dos par�metros cuando uno va a ser modificado suele ser un desastre por norma general. _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es

Gracias Jos�, simplemente cambiando "out" por "var" ya va perfectamente. Lo que me tenia "rayado" es que la primera llamada la hace perfectamente, errando en la segunda.

Gracias de nuevo.
Saludos.

Reply by email

José Mejuto
to Antonio Évora

El 21/10/2012 19:29, Antonio �vora escribi�:

Gracias Jos�, simplemente cambiando "out" por "var" ya va perfectamente. Lo que me tenia "rayado" es que la primera llamada la hace perfectamente, errando en la segunda.

Es que lo m�s correcto es decir que el resultado es impredecible ya que depende de m�ltiples factores ocultos y que seg�n c�mo sucedan y en que orden, puede pasar una cosa u otra, hasta un crash.

Reply by email