Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-04-2008
JXJ JXJ is offline
Miembro
 
Registrado: abr 2005
Posts: 2.475
Poder: 21
JXJ Va por buen camino
Question ¿Es procedure ó function ó class?

¿cuando hay declaraciones de este tipo.
son. procedures, function o class?

Código Delphi [-]
type
TXmlProgressEvent = procedure (Sender: TObject; Size: integer) of object; 

type TTmp_Lib = function(s_Data:String):Pchar;stdcall;

//este codigo es de innosetup
//A veces no tienen 
//Type
 TEnumIniSectionProc = procedure(const Line: PChar; const Ext: Integer) of object;

//se usa en otro procedure                  //aqui
    procedure EnumIniSection(const EnumProc: TEnumIniSectionProc;
//este codigo es de innosetup
¿como se usan?
¿por que se usan?
Por que no tienen una implementacion de la function o procedure
sino solamente su uso.
Responder Con Cita
  #2  
Antiguo 06-04-2008
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
Declaraciones del tipo:

Código Delphi [-]
type
  Txxxxx = procedure(Parametros) of object;

Son tipo de evento. Por ejemplo:

Código Delphi [-]
type
  TNotifyEvent = procedure (Sender: TObject) of object;

Suelen ir acabadas de "event" en el nombre

Una vez declarada una variable de ese tipo puedes usarla así:

Código Delphi [-]
type
  TNotifyEvent = procedure (Sender: TObject) of object;

...

var
  Evento: TNotifyEvent;

procedure Saluda(Sender: TObject);
begin
...
end;

....
procedure...
begin
...
Evento:=Saluda;
Evento;
...
end;

No sé si lo he explicado bien.

En un componente:

Código Delphi [-]
type
 TComponente = class(TComponent)
   private
     FMiEvento: TNotufyEvent;
   ...
   published
     property MiEvento: TNotifyEvent read FMiEvento write FMiEvento;

crearía el evento "MiEvento" que aparecería en el inspector de objetos (así, como detalle).


Salu2.


Añado: antes de llamar a un evento como un procedure, hay que asegurarse de que tiene algo asignado:

Código Delphi [-]
If Assigned(MiEvento) then MiEvento(parametros);
Responder Con Cita
  #3  
Antiguo 06-04-2008
JXJ JXJ is offline
Miembro
 
Registrado: abr 2005
Posts: 2.475
Poder: 21
JXJ Va por buen camino
Muchas gracias ixMike
no se me habia ocurrido que fuese un evento.
Responder Con Cita
  #4  
Antiguo 06-04-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Sobre:

type TTmp_Lib = function(s_Data:String):Pchar;stdcall;

En este caso vendrá de una Dll. Te muestro otro ejemplo más claro:
Código Delphi [-]
function  Suma(a,b: integer):integer;
function Resta(a,b: integer):integer;

type TOperaciones = function (ValorA, ValorB:integer):integer;


var LaOperacion :TOperaciones;
begin
  if combo1.itemindex = 1 then
    LaOperacion := suma
  else
   LaOperacion := Resta;

  c:= LaOperacion( x, y); // llamamos a la suma o a la resta.

Yo diría que es una herramienta más, sabiendo el prototipo (si es un procedimiento o una función además de número y tipos de parámetros de entrada y salida) puedes trabajar con dichas funciones sin saber lo que hacen internamente. Por ejemplo, tú haces un componente que tiene las dos operaciones anteriores (suma y resta), distribuyes la documentación y no distribuyes el código fuente. Con esas definiciones, cualquiera puede hacer una operación llamada Multiplicación.


En cuanto a estos señores:
Código Delphi [-]
 TEnumIniSectionProc = procedure(const Line: PChar; const Ext: Integer) of object;

 procedure EnumIniSection(const EnumProc: TEnumIniSectionProc;
Es lo que se denomina Callbacks, ¿funciones retroalimentadas?

Podríamos decir (en lenguaje sencillo) que es la implementación de los típicos eventos de delphi pero a nivel de API de Windows.

Usando ese ejemplo: Se supone que EnumIniSection leerá todas las secciones que tiene un archivo .ini, y por cada sección que encuentre, hace ejecutar el "EnumProc" que no es más que un método de un objeto:
Código Delphi [-]
type Tmio = Class(Tobject)
  public 
     constructor Create;
     procedure Informame(const Line: Pchar; const Ext: integer);
end;
... 

procedure Tmio.Informame(const Line: Pchar; const Ext: integer);
begin 
  ShowMessage(' sección ' + Line);
end;

constructor Tmio.Create;
begin 
  EnumIniSection(Informame);
end;

La API está plagada de callbacks, por ejemplo la clase TTimer, lo único que hace es encapsular en típicas clases de delphi, las llamadas a SetTimer que requiere de funciones retroalimentadas.

Por si no ha quedado claro: No hay implementación de esas funciones, porque quien lo implementa eres tú, como usuario del módulo o componente. El que hizo el módulo "EnumIniSection" te da la posiblidad de informarte cuando se lee una Sección y de que tú puedas ejecutar tu propio código.

Edito: creo que no me he expresado muy claramente que digamos.... pero a estas horas .... jeje, pregunta si eso...) Voy a por otro café a ver si me espabilo

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 06-04-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Para matizar un poco lo dicho por Miguel y Lepe, no necesariamente son eventos, pero sí tipos y variables "procedimentales". En sí los eventos que vemos, por ejemplo, en el inspector de objetos, son propiedades de tipo procedimental. Es decir, que el valor que guardan es una dirección de memoria; la ubicación en memoria de una rutina de código. Pero no todos los valores procedimentales son utilizados para implementar eventos.

En cuanto a las funciones callback, éstas se conocen en castellano como rutinas de retrollamada.

En este hilo se habló hace poco sobre el tema de los valores procedimentales. Creo que puede serte de utilidad JXJ:

http://www.clubdelphi.com/foros/show...274#post276274

Saludos.

Al González.
Responder Con Cita
  #6  
Antiguo 07-04-2008
JXJ JXJ is offline
Miembro
 
Registrado: abr 2005
Posts: 2.475
Poder: 21
JXJ Va por buen camino
aaa

Miguel y Lepe, Al , gracias. por decirme que son
"functions y procedures de tipo callback".

y por los ejemplos.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
llamar a procedure desde otra procedure anubis Varios 23 04-03-2010 19:44:37
FutureValue Function chino150 Varios 2 28-01-2008 23:07:16
Tablas en Function rolando_s Conexión con bases de datos 2 23-12-2004 22:26:59
Create Function rickymarti Firebird e Interbase 1 02-12-2004 11:37:00
Function vtdeleon OOP 1 25-11-2004 08:22:48


La franja horaria es GMT +2. Ahora son las 13:22:06.


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