Ir al contenido


Foto

Problemas con algunos tipos...

tipos

  • Por favor identifícate para responder
9 respuestas en este tema

#1 armadillo

armadillo

    Member

  • Miembros
  • PipPip
  • 13 mensajes

Escrito 21 julio 2015 - 11:08

Hola Amig@s,

Hace mucho tiempo que no ando por aqui, ya que hace mucho tiempo que no programo... pero ya estoy volviendo a las andadas, y por supuesto con dudas.

He empezado hacer algunos pinitos en Lazarus y estoy realmente bastante satisfecho, con el resultado y el proyecto Lazarus.

Bien vamos al grano, seguro es una tonteria pero estoy fuera de training y no se por donde agarrarlo.

 

El ejemplo es el siguiente:


delphi
  1. ...
  2. // aqui es donde la declaro
  3. public
  4. { public declarations }
  5. function TipoTelefono(var NroTel: String): String; // <-- Aqui me da el error
  6. ...
  7.  
  8. implementation
  9.  
  10. // Esta es la funcion en cuestion
  11. function TipoTelefono(var NroTel: String): String;
  12. begin
  13. if (NroTel[1]='8') or (NroTel[1]='9') then Result:='FIJO'
  14. else if (NroTel[1]='6') or (NroTel[1]='7') then Result:='MOVIL'
  15. end;
  16.  
  17. // Y aqui es donde la uso
  18. procedure TForm1.Button1Click(Sender: TObject);
  19. var
  20. LineasArchivo, Campos: TStringList;
  21. Tip_Tel, Segundos, LineaReg: String;
  22. i,x: Integer;
  23. begin
  24. Campos:=TStringList.Create;
  25. LineasArchivo:=TStringList.Create;
  26. Label1.Caption:='Iniciamos el proceso de Carga...';
  27. OpenDialog1.Execute;
  28. // Cargamos el archivo para procesar
  29. LineasArchivo.LoadFromFile(OpenDialog1.FileName);
  30. // Empezamos a procesar el Archivo
  31. for i:=1 to LineasArchivo.Count-1 do
  32. Begin
  33. LineaReg:=LineasArchivo[i];
  34. Campos.DelimitedText:=LineaReg; // Creamos el arreglo Campos
  35. Tip_Tel:=Campos[3];
  36. Campos.Add(TipoTelefono(Tip_Tel)); // Aqui la uso y me da el errror
  37. ...
  38. ...
  39. // Añado registros a MySQL con el arreglo Campos
  40. end;
  41. end;

En realidad el error me lo da en la compilacion del mismo en la parte de la declaracion de la funcion y este:

 

principal.pas(30,14) Error: Forward declaration not solved "TipoTelefono(var AnsiString):AnsiString;"

 

Pues si alguien sabe decirme que hacer os lo agradeceria


  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 21 julio 2015 - 11:28

Ummm... habría que ver el código completo y exacto. El primer error que aprecio es que hay un public y esto me hace pensar en que hay una declaración de una clase.

Has definido una función y por tu muestra del código, está dentro de la clase, por tanto se trataría de un método para la clase.

De ser correcto, tal implementación debiera ser:


delphi
  1. function NombreDeLaClase.TipoTelefono(var NroTel: string): string;
  2.  
  3. begin
  4.  
  5. // el código aquí
  6.  
  7. end;

El otro error que aprecio es que el tipo de dato que definiste para el parámetro de la función TipoTelefono es del tipo string, pero al momento de usarla, al pasarle el valor al parámetro le estás dando un tipo char. Es decir

 

tipo_tel := Campos[3];

 

Regresa un carácter. O para más simple: un char.

 

Entonces el parámetro para la función debiera ser justamente de ese tipo y no un string. Al ser char, éste solamente cuenta con un carácter por tanto no hace es posible hacer un tipo_tel[].

 

En resumen. La solución es:


delphi
  1. function TipoTelefono(Tipo: char): string;
  2.  
  3. begin
  4.  
  5. if Tipo = '8' ...
  6.  
  7. end;

Saludos,


  • 1

#3 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 21 julio 2015 - 07:20

Tal y como te dice Delphius, te tiene que quedar asi:
 


delphi
  1. implementation
  2.  
  3. function TipoTelefono(var NroTel: String): String;
  4. begin
  5.  
  6. end;
  7.  
  8. function TForm1.TipoTelefono(var NroTel: String): String;
  9. begin
  10.  
  11. end;

Tenes que referencia a la clase que implementa al metodo


  • 1

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 21 julio 2015 - 10:20

Tal y como te dice Delphius, te tiene que quedar asi:
 


delphi
  1. implementation
  2.  
  3. function TipoTelefono(var NroTel: String): String;
  4. begin
  5.  
  6. end;
  7.  
  8. function TForm1.TipoTelefono(var NroTel: String): String;
  9. begin
  10.  
  11. end;

Tenes que referencia a la clase que implementa al metodo

 

Y Cambiar el tipo del parámetro a char ;)

Aunque no se si realmente ese public que vemos corresponde al Form1. El código de muestra está recortado. Asi que puede ser Form1, TClaseTelefono, lo que sea...

 

Saludos,


  • 1

#5 armadillo

armadillo

    Member

  • Miembros
  • PipPip
  • 13 mensajes

Escrito 22 julio 2015 - 03:28

Hola Delphius y OrtuAgustin,

Antes de nada gracias por vuestras prontas respuestas,

Bueno la solucion fue lo que habeis dicho, el añadir el nombre del form en la implementación de la función, y listo todo quedo ok.

Yo creía que era un error de tipos de variables, cosa que me extrañaba ya que las dos estaban declaradas como String.

La variable Campo es una arreglo de string, por eso la usaba como Campo[1] o campo[3]...

 

Bien desde ya muchas gracias a los dos

Un Saludo


  • 0

#6 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 22 julio 2015 - 06:20

Siempre me mando la misma cagada y respondo en el sub foro de lazarus creyendo que estoy en delphi :p
 
En mi caso con dephi 2010 este codigo me funciona perfecto:


delphi
  1. type
  2. TForm1 = class(TForm)
  3. Edit1: TEdit;
  4. Button1: TButton;
  5. procedure Button1Click(Sender: TObject);
  6. private
  7. { Private declarations }
  8. function TipoTelefono(const NroTel: string): string;
  9. public
  10. { Public declarations }
  11. end;
  12.  
  13. var
  14. Form1: TForm1;
  15.  
  16. implementation
  17.  
  18. {$R *.dfm}
  19.  
  20. procedure TForm1.Button1Click(Sender: TObject);
  21. begin
  22. ShowMessage(TipoTelefono(Edit1.Text));
  23. ShowMessage(TipoTelefono(Edit1.Text[1]));
  24. end;
  25.  
  26. function TForm1.TipoTelefono(const NroTel: string): string;
  27. begin
  28. if (NroTel[1] = '8') or (NroTel[1] = '9') then
  29. Result := 'FIJO'
  30. else if (NroTel[1] = '6') or (NroTel[1] = '7') then
  31. Result := 'MOVIL'
  32. end;

Lo del TForm1 fue porque abajo le vi el ButtonClick que pertenecia a ese form, por eso me la juge :) pero obviamente podria ser cualquier cosa

 

Otro dato interesante es que si en ves de poner la declaracion de la funcion dentro del cuerpo de la clase TForm1 se hace fuera, entonces en ese caso se puede implementar la funcion sin que pertenezca "a nadie"


delphi
  1. type
  2. TForm1 = class(TForm)
  3. Edit1: TEdit;
  4. Button1: TButton;
  5. procedure Button1Click(Sender: TObject);
  6. private
  7. { Private declarations }
  8. public
  9. { Public declarations }
  10. end;
  11.  
  12. function TipoTelefono(const NroTel: string): string;
  13.  
  14. var
  15. Form1: TForm1;
  16.  
  17. implementation
  18.  
  19. {$R *.dfm}
  20.  
  21. procedure TForm1.Button1Click(Sender: TObject);
  22. begin
  23. ShowMessage(TipoTelefono(Edit1.Text));
  24. end;
  25.  
  26. function TipoTelefono(const NroTel: string): string;
  27. begin
  28. if (NroTel[1] = '8') or (NroTel[1] = '9') then
  29. Result := 'FIJO'
  30. else if (NroTel[1] = '6') or (NroTel[1] = '7') then
  31. Result := 'MOVIL'
  32. end;


  • 1

#7 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 22 julio 2015 - 11:02

Hola

 

Yo modificaría la función TipoTelefono() de ésta forma:

 


php
  1. function TForm1.TipoTelefono(const NroTel: string): string;
  2. begin
  3.   case NroTel[1] of
  4.     '8','9': Result := 'FIJO';
  5.     '6','7': Result := 'MOVIL';
  6. else Result := '';
  7.   end;

 
:smiley:
 
Saludos 
 
 

  • 1

#8 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 23 julio 2015 - 09:37

Yo cambiaría el tipo del parámetro NroTel por Char *-)

 

Saludos,


  • 0

#9 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 23 julio 2015 - 09:40

Yo cambiaría el tipo del parámetro NroTel por Char *-)
 
Saludos,

 
Sería exactamente lo mismo porque en la llamada tendrías que hacer esto: 
 


delphi
  1. ShowMessage( TipoTelefono( Edit1.Text[1] ) );

Saludos


  • 0

#10 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 23 julio 2015 - 10:41

Parece ser lo mismo, pero la cuestión es: ¿Para que pasar como parámetro todo el string si al final se necesita de un carácter? Tiene sentido pasar todo el string si se va a utilizar para algo más, dentro de la función. Además tampoco cuesta demasiado el poner cadena[1].

 

Saludos,


  • 1




IP.Board spam blocked by CleanTalk.