Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-10-2012
Sapiem Sapiem is offline
Miembro
 
Registrado: abr 2007
Posts: 24
Poder: 0
Sapiem Va por buen camino
Problema de asignación de puntero desde una cadena

Saludos:

Tengo el siguiente código y necesito que alguien me explique cómo debo lograr mi objetivo:



procedure MyClick(Self, Sender: TObject);
begin
ShowMessage('Caption del Sender: ' + TButton(Sender).Caption);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
M: TMethod;
S: string;
begin
M.Data := nil;
// M.Code := @MyClick; <---- así funciona ok

S:= 'MyClick'; <---- así asigno el valor del procedure a una variable, puesto que ella va a variar
M.Code:= @S; <--- aquí da error (como es lógico), pero es lo que quisiera lograr, que pueda asignar ese puntero a procedure desde una variable


Button1.OnClick := TNotifyEvent(M);
Button2.OnClick := TNotifyEvent(M);
Button3.OnClick := TNotifyEvent(M);

end;

Gracias
Responder Con Cita
  #2  
Antiguo 25-10-2012
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Evidentemente, no puedes asignar a un puntero a procedimiento la dirección de una cadena de caracteres.

Para empezar, S debe ser un puntero a procedimiento, igual que la propiedad/campo Code.

Código Delphi [-]
PROCEDURE MyClick (Self, Sender: TObject);
BEGIN
  ShowMessage ('Caption del Sender: ' + (Sender AS TButton).Caption);
END;

PROCEDURE TForm1.Button1Click (Sender: TObject);
VAR
  M: TMethod;
  S: PROCEDURE (a, b: TObject); { Esto es un puntero a procedimiento con dos parámetros tipo TObject }
BEGIN
  M.Data := nil;
  S := @MyClick; { Aquí estás obteniendo la dirección del procedimiento MyClick y asignándolo a S. }
  M.Code := S;   { Aquí estás asignando el contenido de S a M.Code (algo redundante, por cierto. }

  Button1.OnClick := M AS TNotifyEvent;
  Button2.OnClick := M AS TNotifyEvent;
  Button3.OnClick := M AS TNotifyEvent;
END;

Lo de usar "AS" es una cuestión de estilo.

Por cierto, usa el botón de código para formatearlo:
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine

Última edición por Ñuño Martínez fecha: 25-10-2012 a las 14:52:50.
Responder Con Cita
  #3  
Antiguo 25-10-2012
Sapiem Sapiem is offline
Miembro
 
Registrado: abr 2007
Posts: 24
Poder: 0
Sapiem Va por buen camino
Dudas

Gracias por responder..

Es cierto que no debo usar los punteros de strings así, pero fue para dar la idea de lo que necesito.

Es que tengo un código que en dependencia de cierto resultado, le voy asignar a un TMenuItem el evento OnClick según la función o procedimiento que me pasen como variable:

Digamos

Código Delphi [-]
Asignar(Menu1, 'FormClick');
Asignar(Menu2, 'Button1Click');

pero luego, puede que cambie de nuevo así:

Código Delphi [-]
Asignar(Menu1, 'Button1Click');
Asignar(Menu2, 'Button2Click');

Entonces con la función o procedimiento "Asignar", utilizaría:
Código Delphi [-]
function Asignar (MI: TMenuItem; CualEv: string);
begin
TMenuItem(MI).OnClick:= CualEv;
end;

es algo así la idea, ok. Ahora bien, yo puedo usar quizás:

Código Delphi [-]
function Asignar (MI: TMenuItem; CualEv: TNotifyEvent);
begin
TMenuItem(MI).OnClick:= TNotifyEvent(CualEv);
end;

pero desearía saber si lo puedo usar con cadena.

pd. No logro poner que el código me salga con estilo delphi, marco el icon, me sobrea el código, pero no lo publica como delphi.
Tampoco recibo las respuestas a mis hilos al correo, por qué..?

Gracias por todo.

Última edición por Casimiro Notevi fecha: 25-10-2012 a las 18:36:34.
Responder Con Cita
  #4  
Antiguo 25-10-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Recuerda poner los tags al código fuente, ejemplo:



Gracias
Responder Con Cita
  #5  
Antiguo 26-10-2012
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Creo que para lo que quieres hacer debes usar RTTI. Nunca he usado RTTI así que no sé ni cómo funciona, pero según he leído debería permitirte encontrar funciones, objetos, clases, propiedades y métodos por el nombre.

Respecto a los avisos por correo, los moderadores estamos comprobándolo.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #6  
Antiguo 26-10-2012
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.

Como bién menciona Ñuño podes hacerlo con RTTI, revisa este [ enlace ].

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía 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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problema con Asignacion a un Objeto. BEPAI Varios 12 10-04-2007 13:28:35
Almacenar la dirección de un puntero en una cadena abracadabra Varios 2 17-11-2006 19:16:18
Cargar puntero del raton desde un archivo zurech Varios 2 28-09-2005 16:34:23
Problema con asignacion de valores en un rango Valeric Servers 4 06-09-2005 13:44:04
Asignacion de cadena a un Dbgrip elpezfuma OOP 1 04-06-2003 09:24:09


La franja horaria es GMT +2. Ahora son las 22:02:03.


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