Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-10-2007
Stanley Stanley is offline
Registrado
 
Registrado: abr 2007
Posts: 8
Poder: 0
Stanley Va por buen camino
Question Como retornar un valor en Delphi

Veran soy muy nuevo en esto y programo en otros lenguajes los cuales me permiten devolver el valor de una funcion por medio de un Return valor, pero veo que en delphi esto no es asi, agradecería si alguna persona me puede indicar como hacer para llamar una funcion o procedimiento y que este devuelva un valor
Responder Con Cita
  #2  
Antiguo 27-10-2007
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.556
Poder: 25
egostar Va camino a la fama
Cita:
Empezado por Stanley Ver Mensaje
Veran soy muy nuevo en esto y programo en otros lenguajes los cuales me permiten devolver el valor de una funcion por medio de un Return valor, pero veo que en delphi esto no es asi, agradecería si alguna persona me puede indicar como hacer para llamar una funcion o procedimiento y que este devuelva un valor
Código Delphi [-]
function TForm1.Algo:Integer;
begin
   Result := 2;
end;

Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #3  
Antiguo 27-10-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Hola Stanley,
La otra opción es con un procedimiento que tenga una variable "por valor":

Código Delphi [-]
procedure Algo(var Numero: integer);
begin
  Numero := (Numero * Numero) + Numero;
end;

Se que el ejemplo es tonto... pero bueno. El lenguaje permite hacer que un procedimiento o función regrese un resultado "por valor". En ocasiones es necesario implementar así, pero en otras no tiene sentido. Como la del ejemplo. Lo correcto sería convertirlo en función:
Código Delphi [-]
function Algo(Numero: integer): integer;
begin
  result := (Numero * Numero) + Numero;
end;

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #4  
Antiguo 28-10-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Hola Stanley,
Te agradezco que te pusieras en contacto conmigo por MP (Mensaje Privado) para agradecerme que te fui de ayuda.
Lo que creo conveniente hacerte notar es que aqui preferimos que tus dudas estén a disposición de todos. Tratamos de ofrecer ayuda en forma desinteresada y para el bien de toda la comunidad y no por mensajes privados o "en linea". Ya que de esa manera el conocimiento queda en poder de pocos.
No es una reprimenda, sino una aclaración.

Con respecto a tu duda, básicamente la estructura de una unit es como sigue:

Código Delphi [-]
unit UEjemplo;

interface
{Aqui declaro el cuerpo y la estructura. Todo en forma declarativa,
y no en forma "procedimental". Es decir que en esta sección no se encuentra
el código sino la declaración.
La sección interface sirve para hacer público el comportamiento de la unidad.
Es decir que lo declarado aquí será visto desde "afuera"}

{En este ejemplo desde cualquier otra unidad que haga uso de ésta (UEjemplo) se
podrá ver:
 * UNA_CONSTATE
 * TArreglo
 * TClase
}

uses
  {Unidades que usa la Unit UEjemplo}
  SysUtils, QDialogs;

const
  UNA_CONSTANTE = 1000;

type
  TArreglo = array[1..UNA_CONSTANTE] of integer;

  {Un ejemplo de clase}
  TClase = class
    {Una clase tiene 4 secciones: private, protected, public, published}
    private
    {Desde afuera de la clase no se puede tener acceso a esta sección. Por
      Tanto FCantidad es privada, solo puede ser empleada desde "adentro"
      de la propia clase}
      FCantidad: integer;
      {Primero se listan las variables y luego las funciones y/o procedimientos}
      procedure SetCantidad(Value: integer);
    public
     {Lo dispuesto en public es visto desde afuera. Cantidad es una propiedad
     y permite cambiar el valor de FCantidad mediante SetCantidad}
      property Cantidad: integer read FCantidad write SetCantidad;
  end;


implementation
{Lo declarado en implementation no es visto desde afuera. Tiene 2 propósitos:
1. Ocultar alguna función o procedimiento
2. Mantener el código}

var unArreglo: TArreglo;

procedure ProcedimientoOculto;
{Este procedimiento está oculto. No puede ser visto desde afuera}
var i: integer;
begin
  for i := 0 to UNA_CONSTANTE do
    unArreglo[i] := i;
end;

procedure Aviso;
begin
  ShowMessage('Se ha disparado la unidad');
end;

{ --- Aqui comienza el cuerpo de la clase ----}
procedure TClase.SetCantidad(Value: integer);
begin
  if Value <> FCantidad
     then FCantidad := Value
     else raise Exception.Create('Cantidad ya tiene dicho valor');
end;

initialization
{Esta sección es opcional. Y se usa para que cuando se "inicie" esta unidad
 se disparen algunos procedimientos, funciones, eventos.. etc}
  ProcedimientoOculto;
  Aviso;

end.
Ahora para hacer uso de UEjemplo sólo basta con ir a la unidad correspondiente (no necesariamente dicha unit debe corresponder a algún form) y declararla en la parte uses:

Código Delphi [-]
uses
  UEjemplo;

Como podrás observar... UEjemplo no tiene o no le pertenece a ningún form.
En el ejemplo que te expuse están expuesto los temas más comunes con respecto a tus dudas. Viendo que recién te inicias en Delphi te sugiero una buena lectura: La Cara Oculta de Delphi 4. Al pdf lo vas a ubicar muy fácil con sólo buscarlo en San Google (o el buscador de tu predilección). Concretamente te sugiero empezar a leer:
Capitulo 3. Unidades, proyectos y paquetes. Allí está bien explicado como está estructurada una unit.
Capítulo 6 y 7. Programación Orientada a Objetos. Allí se trata lo referente a clases.

Bueno creo que con eso ya tienes para empezar. Ya sabes, ante problemas:
1. Buscar en los foros.
2. Si la búsqueda no fue satisfactoria:
2.1. Si existe un hilo en que se trate el tema ya sea en forma superficial o algo similar, postear tus dudas allí.
2.2. Si no hay hilo con dicha temática. Iniciar uno.

Recuerda que cuanto mayores detalles puedas aportarnos con respecto a tus inconvenientes más te podremos ser de ayuda.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #5  
Antiguo 28-10-2007
Stanley Stanley is offline
Registrado
 
Registrado: abr 2007
Posts: 8
Poder: 0
Stanley Va por buen camino
Ayuda con funciones

Cita:
Empezado por Delphius Ver Mensaje
Hola Stanley,
Te agradezco que te pusieras en contacto conmigo por MP (Mensaje Privado) para agradecerme que te fui de ayuda.
Lo que creo conveniente hacerte notar es que aqui preferimos que tus dudas estén a disposición de todos. Tratamos de ofrecer ayuda en forma desinteresada y para el bien de toda la comunidad y no por mensajes privados o "en linea". Ya que de esa manera el conocimiento queda en poder de pocos.
No es una reprimenda, sino una aclaración.

Con respecto a tu duda, básicamente la estructura de una unit es como sigue:

Código Delphi [-]unit UEjemplo;

interface {Aqui declaro el cuerpo y la estructura. Todo en forma declarativa,
y no en forma "procedimental". Es decir que en esta sección no se encuentra
el código sino la declaración.
La sección interface sirve para hacer público el comportamiento de la unidad.
Es decir que lo declarado aquí será visto desde "afuera"} {En este ejemplo desde cualquier otra unidad que haga uso de ésta (UEjemplo) se
podrá ver:
* UNA_CONSTATE
* TArreglo
* TClase
} uses {Unidades que usa la Unit UEjemplo} SysUtils, QDialogs; const UNA_CONSTANTE = 1000; type TArreglo = array[1..UNA_CONSTANTE] of integer;

{Un ejemplo de clase} TClase = class {Una clase tiene 4 secciones: private, protected, public, published} private {Desde afuera de la clase no se puede tener acceso a esta sección. Por
Tanto FCantidad es privada, solo puede ser empleada desde "adentro"
de la propia clase} FCantidad: integer; {Primero se listan las variables y luego las funciones y/o procedimientos} procedure SetCantidad(Value: integer);
public {Lo dispuesto en public es visto desde afuera. Cantidad es una propiedad
y permite cambiar el valor de FCantidad mediante SetCantidad} property Cantidad: integer read FCantidad write SetCantidad;
end;


implementation {Lo declarado en implementation no es visto desde afuera. Tiene 2 propósitos:
1. Ocultar alguna función o procedimiento
2. Mantener el código} var unArreglo: TArreglo;

procedure ProcedimientoOculto;
{Este procedimiento está oculto. No puede ser visto desde afuera} var i: integer;
begin for i := 0 to UNA_CONSTANTE do unArreglo[i] := i; end;

procedure Aviso;
begin ShowMessage('Se ha disparado la unidad');
end;

{ --- Aqui comienza el cuerpo de la clase ----} procedure TClase.SetCantidad(Value: integer);
begin if Value <> FCantidad
then FCantidad := Value
else raise Exception.Create('Cantidad ya tiene dicho valor');
end;

initialization {Esta sección es opcional. Y se usa para que cuando se "inicie" esta unidad
se disparen algunos procedimientos, funciones, eventos.. etc} ProcedimientoOculto; Aviso; end.

Ahora para hacer uso de UEjemplo sólo basta con ir a la unidad correspondiente (no necesariamente dicha unit debe corresponder a algún form) y declararla en la parte uses:

Código Delphi [-]uses UEjemplo;


Como podrás observar... UEjemplo no tiene o no le pertenece a ningún form.
En el ejemplo que te expuse están expuesto los temas más comunes con respecto a tus dudas. Viendo que recién te inicias en Delphi te sugiero una buena lectura: La Cara Oculta de Delphi 4. Al pdf lo vas a ubicar muy fácil con sólo buscarlo en San Google (o el buscador de tu predilección). Concretamente te sugiero empezar a leer:
Capitulo 3. Unidades, proyectos y paquetes. Allí está bien explicado como está estructurada una unit.
Capítulo 6 y 7. Programación Orientada a Objetos. Allí se trata lo referente a clases.

Bueno creo que con eso ya tienes para empezar. Ya sabes, ante problemas:
1. Buscar en los foros.
2. Si la búsqueda no fue satisfactoria:
2.1. Si existe un hilo en que se trate el tema ya sea en forma superficial o algo similar, postear tus dudas allí.
2.2. Si no hay hilo con dicha temática. Iniciar uno.

Recuerda que cuanto mayores detalles puedas aportarnos con respecto a tus inconvenientes más te podremos ser de ayuda.

Saludos,
Lo que me escribes aqui me ayuda, en cierto punto, pero a la hora de declarar una funcion tipo publica

public
function selemes(varMes: integer): integer;

y luego coloco el codigo en la parte de implementacion
function selemes(varMes: integer): integer
begin
//aqui va el codigo
end
el borland developer me dice que la declaración de la funcion no es correcta me indica que le falta algo.

Es cierto que soy un completo novato en delphi, ya que lo que yo deseo hacer siempre lo he hecho facilmente en fox o en VB.net que es crear un metodo o una clase que contenga todas las funciones y en el codigo simplemente me refiero a esa funcion como x = selemes(1) o x = myfunciones.selemes(1)

me seria de mucha ayuda un ejemplo, es cierto que lo que Delphius me indica funciona para los procedimientos que uso pero lo que me mata es que coloco el uses en el formulario y aunque le haya agregado procedimientos publicos y variables publicas en el codigo del form coloco
edit1.text := Proceds.Tclass.
pero despues de este punto no me aparece nada aun con el ejemplo que Delphius hizo, ya que lo copie tal y como esta y no pude ver la tArreglo solo pude ver la TCLass, pero no vi los procedimientos que coloque despues de tipo publico
Responder Con Cita
  #6  
Antiguo 28-10-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
el borland developer me dice que la declaración de la funcion no es correcta me indica que le falta algo.
Los procedimientos o funciones no deben ser declarados públicos o privados. Pertenecen siempre al ámbito en que se declaran, sean globales (a una unidad o unidades), o locales (anidados). Son los métodos de los objetos los que pueden tener distintos tipos de "visibilidad". De este modo, si tratas de escribir algo así:

Código Delphi [-]

unit Foo;

interface

public function Foo(): boolean;

implementation

public function Foo(): boolean;
begin
  {...}
  result := true;
end;

end.

El compilador se quejará, puesto que la palabra reservada "public" está demás en la declaración de la función, y también en su implementación. Lo mismo es válido para los procedimientos. Sin embargo, los métodos de un objeto sí que pueden contar con dicha palabra clave para indicar su visibilidad.

Código Delphi [-]

unit Foo;

interface

type
  TFoo = class
  public 
    function Foo(): boolean;
  end;

implementation

{ TFoo }

function TFoo.Foo(): boolean;
begin
  {...}
  result := true;
end;

end.

No sé si al menos con esta cuestión te he podido ayudar en algo.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 28-10-2007 a las 23:11:04.
Responder Con Cita
  #7  
Antiguo 29-10-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por Stanley Ver Mensaje
me seria de mucha ayuda un ejemplo, es cierto que lo que Delphius me indica funciona para los procedimientos que uso pero lo que me mata es que coloco el uses en el formulario y aunque le haya agregado procedimientos publicos y variables publicas en el codigo del form coloco
edit1.text := Proceds.Tclass.
pero despues de este punto no me aparece nada aun con el ejemplo que Delphius hizo, ya que lo copie tal y como esta y no pude ver la tArreglo solo pude ver la TCLass, pero no vi los procedimientos que coloque despues de tipo publico
¿Sería posible que mostrases mayor código para ver como estas trabajando?

Ya dec te explicó que un procedimiento o función ajeno a una clase no debe ir precedido de alguna directiva public o private. Lo que debes hacer es:
1. Si la función o procedimiento debe ser y puede ser usada desde afuera (global, como dice dec) debe incorporarse la declaración en la sección interface:

Código Delphi [-]
unit Foo;

interface

function FooGlobal(): boolean;
// Esta declaraciòn hace que FooGlobal sea vista y usada desde afuera

implementation

function FooGlobal(): boolean;
begin
  result := true;
end;

end.

2. Si la función o procedimiento debe ser local, por tanto no puede ser vista y usada desde afuera. NO debe contar con la declaración en la sección interface:

Código Delphi [-]
unit Foo;

interface
{En interface no se se cuenta con la declaración de FooLocal. Solo puede ser usada localmente de cualquiera de estas formas:
1. Una función/procedimiento global "llama" a FooLocal
2. Aprovechando la sección Initialization y/o Finalization}

implementation

function FooLocal(): boolean;
begin
  result := true;
end;

end.

En el ejemplo que te envié ProcedimientoOculto y Aviso están declarados en forma local.

Me extraña que digas que no puedes ver el tipo TArreglo. Está en la sección interface.

Con respecto a la situación de las clases creo que dec dió una idea de como se procede. Allí si es necesario indicar la visibilidad (ojo: solo en la sección de interface) Como ya lo ha explicado dec, en implementation no se indica la visibilidad.
Por si la dudas, explico aprovechando la Foo de dec como es la estructura:

Código Delphi [-]
unit Foo;

interface

type
  TFoo = class
  // Inicio de la clase
  // Para proceder a dar visibilidad a los mètodos se procede asì:
  { Visibilidad
      1. Variables (si es Private)
      2. Propiedades
      3. Mètodos
  }

  public
  // aqui comienza la visibilidad public. Públic sólo posee un método Foo
    function Foo(): boolean;
  {el compilador solito interpreta donde comienza y termina la declaraciòn de las visibilidades. No hace falta un end, Ojo } 
  end; // aqui termina la clase

implementation

{ TFoo }

function TFoo.Foo(): boolean;
// Como ves... no hay ningún public o private aqui... el compilador solito
// se encarga de interpretar correctamente que tipo de visibilidad posee.
begin
  {...}
  result := true;
end;

end.

Creería que se entiende ahora. ¿Por casualidad leíste lo que te recomendé? Allí se explica detalladamente todas estas cuestiones.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]

Última edición por Delphius fecha: 29-10-2007 a las 04:05:24.
Responder Con Cita
  #8  
Antiguo 29-10-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Delphius
Ya dec te explicó que un procedimiento o función ajeno a una clase no debe ir precedido de alguna directiva public o private. Lo que debes hacer es:
Revisa el código fuente de tu mensaje Delphius, que se te fue la mano con los "public".
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #9  
Antiguo 29-10-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Gracias por el aviso Dec. No me había percatado de ello. Si Stanley se hubiera aparecido y probado con ello ya me mandaba al diablo

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Delphi-For-PHP: Modificar el valor de un tEdit maro PHP 4 29-09-2007 20:25:21
Como se inserta el valor de un checkbox? Ivan_25 C++ Builder 4 04-11-2005 11:02:51
Como paso el valor? jam888 Varios 4 08-10-2004 16:23:29
Cómo cambiar, desde Delphi, el próximo valor que tiene que dar un autogenerador Giniromero Conexión con bases de datos 4 20-09-2004 10:49:38
¿Cómo guardar el Valor de TColor como un String? nesetru Gráficos 3 27-02-2004 20:21:32


La franja horaria es GMT +2. Ahora son las 04:45:16.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi