PDA

Ver la Versión Completa : Ayuda con llamado a funcion


compuin
18-11-2016, 17:07:27
Buenos dias foro, tengo el siguiente problema.

En una Unit 1 tengo una funcion llamada ZodiacName pero al momento de llamarla desde otra unit me arroja el error de Undeclared identifier: 'ZodiacName'

Alguna pista ?

Gracias de antemano

roman
18-11-2016, 17:11:55
En la otra unidad debes agregar la primera en la cláusula uses:


uses Unit1;


LineComment Saludos

compuin
18-11-2016, 17:14:16
Gracias

Asi lo hice pero aun asi me arroja ese mensaje de error y no lo compila

roman
18-11-2016, 17:15:34
ZodicaName ¿es una función o un método (de un formulario, por ejemplo)?

LineComment Saludos

compuin
18-11-2016, 17:16:37
Es una funcion

function ZodiacName(juldate: double):string;
var
degree, sign, minute, second: integer;
zs, ms, ss: String;
begin
juldate := juldate + 1/120;
sign := trunc(juldate/30);
degree := trunc(juldate) - sign*30;
minute := trunc(frac(juldate) * 60.0);
second := trunc(frac(juldate * 60) * 60.0);
zs := Format('%0.2d',[degree]);
ms := Format('%0.2d',[minute]);
ss := Format('%0.2d',[second]);
Result := zs + '°' + ' ' + ms + '''' + ' ' + ss + '"' + ZodiacNames[sign] ;
end;

roman
18-11-2016, 17:19:18
¿Donde está declarada? ¿En la sección interface o en la sección implementation?

LineComment Saludos

compuin
18-11-2016, 17:22:33
En Implementation

roman
18-11-2016, 17:27:17
Ahí esté el problema. Coloca esta línea en interface:


function ZodiacName(juldate: double):string;


Otras unidades sólo pueden ver lo que está en interface.

LineComment Saludos

compuin
18-11-2016, 17:29:47
Ahora me arroja lo siguiente

Declaration expected but 'USES' found

AgustinOrtu
18-11-2016, 17:30:15
Estas cosas se solucionan en un periquete si publican todo el codigo fuente relevante, con el mensaje de error del compilador y en que linea. Si no hay que ir adivinando como lo esta haciendo (y encima acertando) roman

Lo que esta en la seccion de implementation es privado a la unidad en cuestion; la unica que puede acceder a dicha funcion es la propia unidad. De hecho, dependiendo de como la tengas declarada puede tener distintos alcances


unit Unit1;

interface

implementation

function Zod: string; // declaracion de la cabecera, sin implementar: de esta manera es visible en toda la unit

function Foo: string;
begin
Result := 'Foo';
end;

procedure Algo;
var
s: string;
begin
s := Foo; // funciona, porque foo esta implementada mas arriba que este procedimiento
s := Bar; // no funciona!, porque esta declarada debajo; este procedimiento "no ve" la funcion Bar
s := Zod; // este caso si funciona porque la cabecera esta declarada
end;

function Bar: string;
begin
Result := 'Bar';
end;

function Zod: string;
begin
Result := 'Zod';
end;

roman
18-11-2016, 17:34:20
Ahora me arroja lo siguiente

Declaration expected but 'USES' found

Supongo que estás poniendo la línea antes del uses.


unit unit1;

interface

uses
Tal, tal y tal;

function ZodiacName(juldate: double):string;

interface

uses
Tal, tal y tal;

function ZodiacName(juldate: double):string;
var
degree, sign, minute, second: integer;
zs, ms, ss: String;
begin
juldate := juldate + 1/120;
sign := trunc(juldate/30);
degree := trunc(juldate) - sign*30;
minute := trunc(frac(juldate) * 60.0);
second := trunc(frac(juldate * 60) * 60.0);
zs := Format('%0.2d',[degree]);
ms := Format('%0.2d',[minute]);
ss := Format('%0.2d',[second]);
Result := zs + '°' + ' ' + ms + '''' + ' ' + ss + '"' + ZodiacNames[sign] ;
end;

end.


LineComment Saludos