Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Problema de asignación de puntero desde una cadena (https://www.clubdelphi.com/foros/showthread.php?t=81238)

Sapiem 25-10-2012 14:12:00

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

Ñuño Martínez 25-10-2012 14:47:40

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. :cool:

Por cierto, usa el botón de código para formatearlo:

Sapiem 25-10-2012 17:27:57

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.

Casimiro Notevi 25-10-2012 18:36:54

Recuerda poner los tags al código fuente, ejemplo:



Gracias :)

Ñuño Martínez 26-10-2012 21:44:52

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. :)

ecfisa 26-10-2012 22:14:41

Hola.

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

Saludos. :)


La franja horaria es GMT +2. Ahora son las 15:26:45.

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