Ir al contenido



Foto

Asignación de una función como variable en el evento onClick

onClick funciones variables

  • Por favor identifícate para responder
1 respuesta en este tema

#1 AlexeyOr

AlexeyOr

    Newbie

  • Miembros
  • Pip
  • 1 mensajes

Escrito 24 junio 2019 - 11:26

Hola, 

Me gustaría solicitar su ayuda en un tema con el que he estado trabajando sin encontrar una solución. Estoy tratando de crear una función que me permita crear un popup dinámico, esto es, en una base de datos tengo almacenada la información sobre los elementos que debe contener el popup y la función que debe de llamar en cada item, esto se tiene que crear en tiempo de ejecución.

 

Esto es lo que tengo:


delphi
  1. type
  2. TNotifyEvent = procedure(Sender: TObject) of object;
  3.  
  4.  
  5. procedure TForm1.arma_popup(clase,origen : String);
  6. var
  7. cons, nombre, funcion : String;
  8. imagen,i : integer;
  9. tt : Tmenuitem;
  10. proc :TNotifyEvent;
  11. pt: TPoint;
  12. begin

 

   // los datos del menú que vienen de la base de datos estan contenidos en dm.q3
 

delphi
  1. i:=0; //inicializar contador
  2. PopGral.Items.Clear; // limpiar items del menú
  3.  
  4. GetCursorPos( pt ); //obtener coordenadas de donde aparecerá el popup
  5. g_X := pt.x;
  6. g_Y := pt.y;
  7.  
  8.  
  9. while not dm.q3.Eof do begin
  10. // obtener los datos necesarios para la creación del menú
  11. nombre:=dm.q3.fieldbyname( 'nombre' ).AsString; // nombre que se mostrará al usuario
  12. funcion:=dm.q3.fieldbyname( 'funarbol' ).AsString // nombre de la función
  13.  
  14. // crear los items para el popup con el contenido de los elementos de la base de datos
  15. tt := Tmenuitem.Create( PopGral );
  16. tt.Caption := nombre;
  17. gral.PopGral.Items.Add( tt );
  18.  
  19. proc:=funcion; // <-- aqui es donde manda el error: incompatible types TNotifyEvent and String
  20. PopGral.Items[ i ].OnClick := proc;
  21.  
  22. i:=i+1;
  23. dm.q3.Next;
  24. end;
  25.  
  26. end;

 
No se como puedo asignarle el nombre de la función que contiene la variable "funcion" al evento onClick, espero puedan ayudarme.
 
De antemano gracias.

  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.257 mensajes
  • LocationArgentina

Escrito 24 junio 2019 - 04:16

Buenos días AlexeyOr,

¡Bienvenido a DelphiAccess! Esperamos que esta comunidad se convierta en tu 2do hogar y te sientas muy a gusto.

 

He editado tu mensaje para dar formato al código. Puedes hacerlo tu mismo. Para ello debes usar las etiquetas code: En el formulario donde escribes el mensaje verás un botón con los simbolos <>. Al presionar se te mostrará una ventana para seleccionar el lenguaje y un memo en el cual puedes pegar el código. Al aceptar verás que se ha colocado el código preformateado en la vista previa en el lugar donde tenías el cursor.

En cuanto pulses en "enviar" y se publique el mensaje verás el código hermosamente formateado.

 

Respecto a tu duda, el problema está en que la variable funcion es de tipo String, y en ella lo único que tienes guardado es el nombre de la función. Mientras que OnClick es un tipo TNotifyEvent. Para que funcione debes tener declaradas tus funciones, las cuáles deben seguir la misma "nomeclatura" que del evento.  Luego en función del nombre que leas en la base de datos, asignas tu función. Algo como esto:


delphi
  1. // Declaracion
  2. procedure F1(Sender: TObject);
  3. procedure F2(Sender: TObject);
  4. procedure F3(Sender: TObject);
  5.  
  6.  
  7. // Asignacion
  8. algo.OnClick := F1;
  9. algo.OnClick := F2;
  10. algo.OnClick := F3;

Naturalmente las funciones deben estar implementadas con su código. Y para hacer la asignación deberás valerte de un case o ifs para determinar cual corresponde pasar.

 

Espero que se entienda. Si tienes nuevas dudas, aquí estaremos.

 

Saludos,


  • 0