Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > Lazarus, FreePascal, Kylix, etc.
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-06-2012
jasmad jasmad is offline
Miembro
NULL
 
Registrado: jul 2011
Posts: 75
Poder: 14
jasmad Va por buen camino
Thumbs up se puede enviar un procedimiento como parametro a otro??

Hola,

alguien sabe si es posible enviar un procedimiento como parametro de otro por ejemplo:
Código Delphi [-]
procedure HacerAlgoYLlamarUnProcedimientoDesconocido(procedimientoDesconocido : procedure);
begin
     codigo...
     procedimientoDesconocido;//
end;

Última edición por jasmad fecha: 26-06-2012 a las 19:20:49.
Responder Con Cita
  #2  
Antiguo 26-06-2012
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.549
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Sí.
Puedes mirar como ejemplo el método Synchronize de la clase TThread.

Código Delphi [-]
procedure Synchronize(Method: TThreadMethod);

Si miras los ejemplos sobre threads del FTP, verás varias de estas llamadas.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 26-06-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
En el caso que comenta Neftali, el parámetro es un método. También puedes pasar procedimientos regulares como parámetros a otro procedimiento pero tienes que declarar un tipo de datos para ello. Es decir, no puedes usar directamente la palabra reservada procedure en la declaración del parámetro.

Aquí un ejemplo:

Código Delphi [-]
type
  TProcDesconocido = procedure;

procedure HazAlgo(Proc: TProcDesconocido);
begin
  Proc;
end;

procedure Saluda;
begin
  ShowMessage('Hola');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  HazAlgo(Saluda);
end;

El tipo procedure puede también tener parámetros:

Código Delphi [-]
type
  TProcDesconocido = procedure (S: String);

procedure HazAlgo(Proc: TProcDesconocido);
begin
  Proc('mundo');
end;

procedure Saluda(S: String);
begin
  ShowMessage('Hola ' + S);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  HazAlgo(Saluda);
end;

// Saludos
Responder Con Cita
  #4  
Antiguo 26-06-2012
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.927
Poder: 26
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Tambien se puede usar metodos anonimos:

http://docs.embarcadero.com/products...thods_xml.html
Código Delphi [-]
function MakeAdder(y: Integer): TFuncOfInt;
begin
Result := { start anonymous method } function(x: Integer)
  begin
    Result := x + y;
    end; { end anonymous method }
end;
__________________
El malabarista.
Responder Con Cita
  #5  
Antiguo 26-06-2012
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Cita:
Empezado por mamcx Ver Mensaje
Tambien se puede usar metodos anonimos:
Pero sino me equivoco, estos están solamente disponibles a partir de D2009.
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #6  
Antiguo 12-07-2012
jasmad jasmad is offline
Miembro
NULL
 
Registrado: jul 2011
Posts: 75
Poder: 14
jasmad Va por buen camino
perdon por la respuesta tardia
gracias por sus respuestas que me han servido de mucho
lo que me parecio muy interezante fue lo del
Código:
Synchronize(Method: TThreadMethod)
que menciono Neftali y estoy planeando implementar pero no se donde llamarlo
sera en el execute del thread ?
lo que quiero es implementar una clase thread que envie en un hilo un conjunto de instrucciones y ejecute un dataset.post o dataset.append y veo que el Synchronize puede ayudar a ejecutar el post sin saltarse algun paso que bote la aplicacion como un dataset.commit que se ejecute en el hilo principal sin haber ejecutado el post que esta en el hilo aparte,
no se si me explico
Responder Con Cita
  #7  
Antiguo 13-07-2012
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.549
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por jasmad Ver Mensaje
que menciono Neftali y estoy planeando implementar pero no se donde llamarlo
sera en el execute del thread ?
No normal es que esté en el Execute, si.
Piensa que cuando en el thread debes acceder a un elemento/objeto que no pertenece al thread, como por ejemplo los componentes de la VCL que están definidos fuera (la VCL no es Thread-safe) debes hacerlo llamando a este método.

Ten en cuenta que si te pasas el tiempo del Thread lamando a Synchronize, el resultado será como si no utilizaras el thread.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #8  
Antiguo 13-07-2012
jasmad jasmad is offline
Miembro
NULL
 
Registrado: jul 2011
Posts: 75
Poder: 14
jasmad Va por buen camino
synchronize

creo que te entiendo,
si tengo una clase que hereda a tthread tengo que hacer el llamado de synchronize en el execute
algo asi:
Código Delphi [-]
procedure TPublisher.Execute;
begin
   try
      if(Self.tabla.State in dsEditModes)then begin
         Synchronize(@Self.tabla.Post);
      end;
   except
      on e:exception do handleException(e);
   end;
end;
y en una funcion que guarde los cambios del dataset
crear una instancia y llamarlo antes del commit
algo asi:
Código Delphi [-]
procedure TdmConexionDB.aceptarCambiosDataSet(var dataset: TIBCTable);
var
  posteador:TPublisher;
  bm:string;
begin
  activarTransaccion;
  try
  try
    bm:=dataset.Bookmark;
    //la idea es que con el synchronize se ejecute el post antes del commit porque el programa se caeria
    //pero que corra en otro hilo para que no se pegue la aplicacion
    posteador:=TPublisher.Create(dataset);//esta linea ejecuta en un hilo aparte el codigo que se encuentra en el execute de TPublisher
    transacciones.CommitRetaining;
  except
    on e: Exception do
    begin
      transacciones.RollbackRetaining;
      MessageDlg('Error '+e.ToString,'aceptarCambiosDataSet ' + dataset.Name + #13#10 + e.Message,mtError, [mbOK], 0);
    end;
  end;
  finally
     dataset.Bookmark:=bm;
  end;
end;
yo lo entendi asi pero si me equivoco en algo te agradeceria que me corrigieras

gracias

Última edición por jasmad fecha: 13-07-2012 a las 23:46:31.
Responder Con Cita
  #9  
Antiguo 27-03-2014
belpab belpab is offline
Miembro
 
Registrado: sep 2007
Posts: 47
Poder: 0
belpab Va por buen camino
Thumbs up ¿Cómo pasar un procedimiento por parámetros a otro?

Hola a todos.

Estoy intentando seguir los pasos que me dice Roman y no consigo pasar un procedimiento por parámetros a otro.

Os explico lo que quiero hacer y me comentáis si veis que estoy haciendo mal.

intento hacer un procedimiento que cree una botonera de TPV pero queme sirva para cualquier tabla.

Código Delphi [-]
procedure TForm1.cargararticulos(Pagina, filas, columnas: Integer;panel : tscrollbox; tabla : tclientdataset;proc : TProcDesconocido);

este procedimiento crea la botonera con el cliendataset que se le pasa ( parámetro “tabla”) en el tscrollbox que se le pasa ( parámetro “panel” ) y quiero asignarle al evento click de cada botón un procedimiento ( parámetro “proc”).

para ello me he creado un tipo “TProcDesconocido” así:

Código Delphi [-]
  TProcDesconocido = procedure (SENDER: TObject);

y me he definido el procedimiento “PonClickArticulos”

Código Delphi [-]
procedure PonClickArticulos(Sender: TObject);

que hace lo que yo quiero asignar al evento click y que paso al procedimiento “cargararticulos” en el parámetro “proc”.

Quedaría algo así
Código Delphi [-]
  

type
  TProcDesconocido = procedure (SENDER: TObject);

…
  private
    procedure PonClickArticulos(Sender: TObject);
    procedure CargarArticulos(Pagina, filas, columnas: Integer;
      panel : tscrollbox; tabla : tclientdataset;proc : TProcDesconocido );
…

procedure TForm1.PonClickArticulos(Sender: TObject);
beginEnd;

procedure TForm1.cargararticulos(Pagina, filas, columnas: Integer;panel : tscrollbox; tabla : tclientdataset;proc : TProcDesconocido);
var
  Boton: tspeedbutton;
begin
…
Boton:= TSpeedButton.Create(Self);
Boton.OnClick:= Proc;

end;

…

procedure TForm1.button1Click(Sender: TObject);
begin
…

  CargarArticulos(p,f,c,scrollBArticulos,TablaArticulos,PonClickArticulos);
end;


y al compilar me devuelve este error

[DCC Error] principal.pas(218): E2009 Incompatible types: 'method pointer and regular procedure'

alguien me puede decir que estoy haciendo mal...

Un saludo y gracias de antemano.

Última edición por Casimiro Notevi fecha: 27-03-2014 a las 19:10:00.
Responder Con Cita
  #10  
Antiguo 27-03-2014
belpab belpab is offline
Miembro
 
Registrado: sep 2007
Posts: 47
Poder: 0
belpab Va por buen camino
Hola a todos.

Estoy intentando seguir los pasos que me dice Roman y no consigo pasar un procedimiento por parámetros a otro.

Os explico lo que quiero hacer y me comentáis si veis que estoy haciendo mal.

intento hacer un procedimiento que cree una botonera de TPV pero queme sirva para cualquier tabla.

Código Delphi [-]
procedure TForm1.cargararticulos(Pagina, filas, columnas: Integer;panel : tscrollbox; tabla : tclientdataset;proc : TProcDesconocido);
este procedimiento crea la botonera con el cliendataset que se le pasa ( parámetro “tabla”) en el tscrollbox que se le pasa ( parámetro “panel” ) y quiero asignarle al evento click de cada botón un procedimiento ( parámetro “proc”).

para ello me he creado un tipo “TProcDesconocido” así:

Código Delphi [-]
  TProcDesconocido = procedure (SENDER: TObject);
y me he definido el procedimiento “PonClickArticulos”

Código Delphi [-]
procedure PonClickArticulos(Sender: TObject);
que hace lo que yo quiero asignar al evento click y que paso al procedimiento “cargararticulos” en el parámetro “proc”.

Quedaría algo así
Código Delphi [-]
type
  TProcDesconocido = procedure (SENDER: TObject);

…
  private
    procedure PonClickArticulos(Sender: TObject);
    procedure CargarArticulos(Pagina, filas, columnas: Integer;
      panel : tscrollbox; tabla : tclientdataset;proc : TProcDesconocido );
…

procedure TForm1.PonClickArticulos(Sender: TObject);
beginEnd;

procedure TForm1.cargararticulos(Pagina, filas, columnas: Integer;panel : tscrollbox; tabla : tclientdataset;proc : TProcDesconocido);
var
  Boton: tspeedbutton;
begin
…
Boton:= TSpeedButton.Create(Self);
Boton.OnClick:= Proc;

end;

…

procedure TForm1.button1Click(Sender: TObject);
begin
…

  CargarArticulos(p,f,c,scrollBArticulos,TablaArticulos,PonClickArticulos);
end;

y al compilar me devuelve este error

[DCC Error] principal.pas(218): E2009 Incompatible types: 'method pointer and regular procedure'

alguien me puede decir que estoy haciendo mal...

Un saludo y gracias de antemano.

Última edición por ecfisa fecha: 28-03-2014 a las 04:11:48. Razón: corregir etiquetas [delphi] (WYSIWYG)
Responder Con Cita
  #11  
Antiguo 27-03-2014
belpab belpab is offline
Miembro
 
Registrado: sep 2007
Posts: 47
Poder: 0
belpab Va por buen camino
lo paso a este hilo. Por error abri uno nuevo cuando queria seguir el hilo
Responder Con Cita
  #12  
Antiguo 27-03-2014
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Lo que sucede es que una instancia de TProcDesconocido debe ser un procedimiento independiente o desconocido, que no forme parte de ninguna clase u objeto. Tú estás pasando lo que se conoce como "Procedure of Object", un procedimiento de objeto. Es por eso del error de "Tipos incompatibles".

PonClickArticulos al ser parte de la clase TForm1 viene a ser un Procedure of Object. Para que tu código compile mejor utiliza la clase TNotifyEvent (Ya definida por Delphi por su popularidad) en el parámetro proc del procedimiento CargarArticulos.:

Código Delphi [-]
private
    procedure PonClickArticulos(Sender: TObject);
    procedure CargarArticulos(Pagina, filas, columnas: Integer;
      panel : tscrollbox; tabla : tclientdataset;proc: TNotifyEvent );
…

procedure TForm1.PonClickArticulos(Sender: TObject);
beginEnd;

procedure TForm1.cargararticulos(Pagina, filas, columnas: Integer;panel : tscrollbox; tabla : tclientdataset;proc: TNotifyEvent);
var
  Boton: tspeedbutton;
begin
…
Boton:= TSpeedButton.Create(Self);
Boton.OnClick:= Proc;

end;

…

procedure TForm1.button1Click(Sender: TObject);
begin
…

  CargarArticulos(p,f,c,scrollBArticulos,TablaArticulos,PonClickArticulos);
end;
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #13  
Antiguo 28-03-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola belpab.
Cita:
Empezado por belpab Ver Mensaje
lo paso a este hilo. Por error abri uno nuevo cuando queria seguir el hilo
No te preocupes, combiné ambos hilos en el inicial.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #14  
Antiguo 28-03-2014
belpab belpab is offline
Miembro
 
Registrado: sep 2007
Posts: 47
Poder: 0
belpab Va por buen camino
Ok muchas gracias ecfisa.

Funciona perfectamente Chirs muchas gracias a ti tambien. No conocía esa clase. De momento funciona perfectamente dentro de la unit del formulario. Voy a probar a sacarla a otra unit que tengo de procedimientos para llamarla desde cualquier parte del programa. a ver que tal se me da. aunque me temo que me dará problemas al usar controles visuales como el speedbutton.

Muchísimas gracias a todos. Como siempre me ha sido de gran ayuda este Maravilloso foro del que tanto he aprendido.

Última edición por belpab fecha: 28-03-2014 a las 11:04:23.
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
Como enviar parametro fecha a rave Krmn Impresión 0 12-10-2011 01:45:10
Enviar a VK_F1 como parametro mRoman OOP 4 01-05-2010 18:44:56
Pasar Matriz como parametro a un procedimiento Caro Varios 2 28-07-2006 18:20:12
¿ Cómo se puede enviar un form a otro dispositivo de imagen o monitor ? dannytec Varios 3 09-04-2006 12:35:32
Ayuda, como llamar a un procedimiento desde otro procedimiento? Ariatna Varios 1 01-02-2005 05:05:35


La franja horaria es GMT +2. Ahora son las 00:46:05.


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