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 30-03-2004
Avatar de yusnerqui
yusnerqui yusnerqui is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuba
Posts: 679
Poder: 21
yusnerqui Va por buen camino
Angry Procedures como parámetros

Saludos amigos, nesecito pasar un procedimiento como parámetro, me explico, tengo varias ventanas de captación de datos, y una ventana que me sirve de buscador para cualquiera de los caotadores, pero al realizar la búsqueda en la ventana buscar debo ejecutar el procedimiento que actualiza los datos en el captador activo, he pensado que si pudiera pasar este procedimiento como parámetro al buscador resolbería mi problema pero no sé como hacerlo. Alguna idea.

Gracias por la atención

Saludos Yusnerqui.
__________________
Lo importante no es llegar primero, sino saber llegar.

Para que puedas llegar mejor lee la Guia de Estilo

Responder Con Cita
  #2  
Antiguo 30-03-2004
Avatar de Magician^
Magician^ Magician^ is offline
Miembro
 
Registrado: mar 2004
Ubicación: Lima - Perú
Posts: 74
Poder: 21
Magician^ Va por buen camino
Yo lo uso de la siguiente manera:


Código:
 
//Por ejemplo para implementar una unidad con funciones matemáticas útiles:
 
unit MTools;
 
interface
 
type tfx=function(x:real):real;
 
function dfx(fx:tfx;x:real;h:real):real;
 
...
 
implementation
 
//funcion que calcula la derivada de fx respecto a x
 
function dfx(fx:tfx;x:real;h:real):real; 
....
 
end;
 
//---------------------------------------------------------------------------------
 
//En el programa principal puedo hacer uso de la unidad de la siguiente manera:
//Defino mi función (A,B,C son constantes previamente definidas):
 
uses MTools;
 
function U1(x:real):real;
begin
Result:=A*x*x/2 + B*x*x*x + C;
end;
 
function U2
(x:real):real;
begin
...
end;
 
function U3
(x:real):real;
begin
...
end;
 
 
//Y para usar la función:
 
dy1:=dfx(@U1,x,0.1);
dy2:=dfx(@U2,x,0.1);
dy3:=dfx(@U3,x,0.1);

También para procedimientos:

Código:
 
type
	tDisplay=procedure;			 // Definimos el tipo
 
//---------------------------------------------------------------------------------
 
procedure Display;
begin
 
//Esta puede ser una rutina de visualización
 
end;
 
//---------------------------------------------------------------------------------
 
procedure Show(Display:tDisplay);
begin
 
... //calculos intermedios
 
	if (CONDICION) then Display; // Aquí se ejecuta el procedimiento
...
 
end;
 
//---------------------------------------------------------------------------------
 
//Y podríamos llamar a Show pasando como parámetro el procedimiento Display:
 
Show(@Display)
Espero te sirva de algo.

Salu2
__________________
MAGICIAN^
Lima - Perú
=======
MagicTech.blogspot.com

Última edición por Magician^ fecha: 30-03-2004 a las 17:24:53.
Responder Con Cita
  #3  
Antiguo 30-03-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
la verdad tu pregunta no es muy clara...

Delphi tiene tipos procedurales, que son los que sirven de base al mecanismo de eventos. Si queres que no sea un simple procedimiento sino un método (en otras palabras, un procedimiento que pertenezca a un objeto, simplemente añadis "of object" a la declaración del tipo, como veras a continuación.

Podes hacer una declaración como la siguiente

Código:
Type
  TProcActualiza = Procedure(Parametro1 : Integer; Parametro2 : String) of object;

Procedure TForm1.Buscar(Actualizador : TProcActualiza);

Begin
  HacerLaBusqueda;
  Actualizador(Parametro1, Parametro2);
End;

Hola.

Procedure TForm2.Buscar;

Begin
  Form1.Buscar(Form2.Actualizar);
End;

Procedure TForm3.Buscar;

Begin
  Form1.Buscar(Form3.Actualizar);
End;
espero que el ejemplo te deje claro el asunto...

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #4  
Antiguo 30-03-2004
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
Cita:
Empezado por Magician^
Código:
function dfx(fx:tfx;x:real;h:real):real; 
....
 
end;
¡Eeeeh! ¡No vale! Yo quería ver la implementación de esta función!

Responder Con Cita
  #5  
Antiguo 30-03-2004
Avatar de yusnerqui
yusnerqui yusnerqui is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuba
Posts: 679
Poder: 21
yusnerqui Va por buen camino
Gracias

Muchas gracias amigos los ejemplos han sido muy explísitos y claros, logré que me compilara pero tengo otro problema el procedimiento que quiero pasar es heredado, osea tiene override en la declaración. con cualquiera de los otros procedimientos el programa funciona pero con este me da error de acceso. Gracias de nuevo y si tienen alguna idea me sería muy útil
__________________
Lo importante no es llegar primero, sino saber llegar.

Para que puedas llegar mejor lee la Guia de Estilo

Responder Con Cita
  #6  
Antiguo 30-03-2004
Avatar de Magician^
Magician^ Magician^ is offline
Miembro
 
Registrado: mar 2004
Ubicación: Lima - Perú
Posts: 74
Poder: 21
Magician^ Va por buen camino
Lightbulb Sobre la implementación de dfx

Sobre:


Cita:
Empezado por roman
¡Eeeeh! ¡No vale! Yo quería ver la implementación de esta función!

Puedes encontrar la implementación si búscas información sobre cálculo numérico, en general pueden haber varias implementaciones según el método que decidas usar, aqui te va una de las implementaciones:

Código:
function dfx(fx:tfx;x:real;h:real):real; {funcion que deriva fx respecto a x}
var ii,ji,ki:integer;
	p,s:real;
	xi:array[0..3]of real;
const
	n=3; {tercer grado}
begin
  Result:=0;
  xi[0]:=x-2*h; xi[1]:=x-h; xi[2]:=x; xi[3]:=x+h;
  for ii:=0 to n do
  begin
	s:=0;
	for ki:=0 to n do if ki<>ii then
	begin
	   p:=1;
	   for ji:=0 to n do if (ji<>ki) and (ji<>ii) then p:=p*(x-xi[ji]);
	   s:=s+p;
	end;
	p:=1;
	for ji:=0 to n do if ji<>ii then p:=p*(xi[ii]-xi[ji]);
	Result:=Result+s*fx(xi[ii])/p
  end;
end;
Servido
__________________
MAGICIAN^
Lima - Perú
=======
MagicTech.blogspot.com

Última edición por Magician^ fecha: 30-03-2004 a las 18:51:16.
Responder Con Cita
  #7  
Antiguo 30-03-2004
Avatar de yusnerqui
yusnerqui yusnerqui is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuba
Posts: 679
Poder: 21
yusnerqui Va por buen camino
Cool Yusnerqui

Bueno este mensaje es para que sepan como acavó todo. Pues declaré un procedimiento que su única función es llamar al procedimiento heredado y ese es el que paso como parámetro, no es una solución elegante pero me funciona a la perfección.

gracias de nuevo por su abitual ayuda.

un Saludo Yusnerqui.
__________________
Lo importante no es llegar primero, sino saber llegar.

Para que puedas llegar mejor lee la Guia de Estilo

Responder Con Cita
  #8  
Antiguo 30-03-2004
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
Cita:
Empezado por Magician^
Servido
Gracias Magician. Me siento algo apenado ya que realmente estaba bromeando un poco y de hecho erróneamente estaba pensando en derivación simbólica en lugar de numérica de manera que me dije: ¿Cómo ha de ser la función para aceptar una función arbitraria y derivarla?

Te pido disculpas.
Responder Con Cita
  #9  
Antiguo 30-03-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
pero es que con métodos virtuales no debieras tener ese problema, media vez case en el molde, ya que delphi resolverá esto en tiempo de ejecución, y pasará un puntero al método correcto, el ya heredado...

Además, si estas usando herencia, creo que podes evitarte el pasar un método. Simplemente pasá un puntero a la instancia actual de la forma.... y, la forma de busqueda, conociendo este ancestro, que llame al método virtual. Eso es polimorfismo!.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #10  
Antiguo 30-03-2004
Avatar de Magician^
Magician^ Magician^ is offline
Miembro
 
Registrado: mar 2004
Ubicación: Lima - Perú
Posts: 74
Poder: 21
Magician^ Va por buen camino
Cita:
Empezado por roman
Gracias Magician. Me siento algo apenado ya que realmente estaba bromeando un poco y de hecho erróneamente estaba pensando en derivación simbólica en lugar de numérica de manera que me dije: ¿Cómo ha de ser la función para aceptar una función arbitraria y derivarla?

Te pido disculpas.
Amigo, no te preocupes.

La función "derivar", acepta una función arbitraria pero esta debe de estar compilada en el código. En realidad también se puede implementar interpretación simbólica, para ello hay un paso intermedio. Inclusive podria ser tan potente como quisieras usando un interprete del tipo "JvInterpreter" del cual puedes obtener información en este enlace:
http://homepages.borland.com/jedi/jv...nterpreter.htm

Creo que esto debería de tener su propio hilo no?

Saludos.
__________________
MAGICIAN^
Lima - Perú
=======
MagicTech.blogspot.com
Responder Con Cita
  #11  
Antiguo 30-03-2004
Avatar de yusnerqui
yusnerqui yusnerqui is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuba
Posts: 679
Poder: 21
yusnerqui Va por buen camino
Cita:
Empezado por jachguate
pero es que con métodos virtuales no debieras tener ese problema, media vez case en el molde, ya que delphi resolverá esto en tiempo de ejecución, y pasará un puntero al método correcto, el ya heredado...
Uso Delphi 5 con windows 98 y me da error de acceso a la dirección FFFFFFFF... Estoy al pensar que mi Delphi está pasado de moda

Cita:
Empezado por jachguate
... conociendo este ancestro, que llame al método virtual. Eso es polimorfismo!.
El problema es que quiero usar este buscar no solo con las formas que pertenecen a mi clase TEditar sino que también me servirá para las formas que listan. Aunque ahora que pienso quizas sobrecargando el método creata pudiera obtener un resultado agradable, bueno de todos modos muchas gracias y luego les cuento
__________________
Lo importante no es llegar primero, sino saber llegar.

Para que puedas llegar mejor lee la Guia de Estilo

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


La franja horaria es GMT +2. Ahora son las 19:12:41.


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