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 16-12-2009
erasmorc erasmorc is offline
Miembro
 
Registrado: ago 2004
Posts: 66
Poder: 20
erasmorc Va por buen camino
Menu configurable

Tengo un componente Actionlist, en el cual tengo varias opciones de menu configuradas que en su procedimiento excecute realizan varias acciones como desplegar pantallas, reportes etc, como puedo hacer para que un boton en el evento action reemplazarlo por el valor de una variable que sera una de las opcioes de mi action list. La idea es hacer un menu configurable entonces yo tengo todos los nombre de los action list en una base de datos entonces quiero seleccionar uno y ejecutarlo desde un boton, asi podre ejecutar todas las opciones del menu que desee, pero tengo el problema de que los nombres de los action list almacenados en la tabla son caracteres y el evento action del boton solo maneja datos TbasicAction como puedo hacer esto.

Gracias anticipadas.
Responder Con Cita
  #2  
Antiguo 17-12-2009
Avatar de defcon1_es
defcon1_es defcon1_es is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuenca - España
Posts: 533
Poder: 21
defcon1_es Va por buen camino
Puedes buscar el TAction por su nombre y ejecutarlo

Puedes buscar el TAction por su nombre y ejecutarlo:
Código Delphi [-]
procedure TFormPrincipal.Ejecutar_Action(const Nombre: String);
var i:Integer;
begin
// Hay que buscar el componente TAction que tiene el mismo caption que el item, y ejecutarlo.
  for i:= 0 to FormPrincipal.ComponentCount -1 do
  begin
    if (FormPrincipal.Components[i] is TAction)
    then begin
// Puedes compararlo con el Caption del Action, 
// que seguro es más inteligible que el Nombre (Name) de los Action.
// Depende de lo que tengas guardado en esa lista.
      if (TAction(FormPrincipal.Components[i]).Name = Nombre) 
      then begin
        TAction(FormPrincipal.Components[i]).Execute;
        break;
      end;
    end;
  end;  
end;
__________________
Progress Openedge
https://abevoelker.com/progress_open...dered_harmful/


Delphi forever...

Última edición por defcon1_es fecha: 17-12-2009 a las 10:18:51.
Responder Con Cita
  #3  
Antiguo 17-12-2009
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.269
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 erasmorc Ver Mensaje
Tengo un componente Actionlist, en el cual tengo varias opciones de menu configuradas que en su procedimiento excecute realizan varias acciones como desplegar pantallas, reportes etc,...

...yo tengo todos los nombre de los action list en una base de datos entonces quiero seleccionar uno y ejecutarlo desde un boton, asi podre ejecutar todas las opciones del menu que desee,...
No acabo de entender bien cual es el problema.
Si tienes los nombres de las Action y quieres ejecutar una a partir de su nombre (propiedad Name), basta con un código similar a este:

Código Delphi [-]
var
  comp:TComponent;
begin

  // Buscar la action
  comp := FindComponent(nombre_Accion);
  if Assigned(Comp) then begin
    if (comp is TAction) then begin
      TAction(comp).Execute;
    end;
  end;
__________________
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
  #4  
Antiguo 17-12-2009
erasmorc erasmorc is offline
Miembro
 
Registrado: ago 2004
Posts: 66
Poder: 20
erasmorc Va por buen camino
Neftali al parecer no me explique bien, primero te voy a explicar lo que quiero hacer de forma general y luego el caso en especifico. Quiero hacer un menu que no sea estatico, en donde yo coloque en una tabla los nombre de los items de una action list de forma tal que si quiero agregar una opcion al menu solo tenga que hacer una entrada en la tabla con el item del action list correspondiente. Hasta ahi todo va bien, el problema surge cuando seleccion una linea de la tabla y quiero que se ejecute, por ejemplo un item del action list se llama MnCuentas yo quiero poder hacer que presionando un boton este item se ejecute, y es facil si solo fuera uno porque bien facil puedo hacer al evento Action del boton que presionare que sea igual al nombre del action list, pero recuera que estos items estan en una tabla y no puedo pasar al evento action del boton un campo de una tabla. Ese basicamente es mi problema, te agradeceria sobre manera si me prestas tu conocimiento en esto. Gracias anticipadas
Responder Con Cita
  #5  
Antiguo 17-12-2009
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.269
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 erasmorc Ver Mensaje
...por ejemplo un item del action list se llama MnCuentas yo quiero poder hacer que presionando un boton este item se ejecute, y es facil si solo fuera uno porque bien facil puedo hacer al evento Action del boton que presionare que sea igual al nombre del action list, pero recuera que estos items estan en una tabla y no puedo pasar al evento action del boton un campo de una tabla.
Pues tal vez sigo sin entenderte, pero creo que el cóigo de anes funcionaría. sólo tienes que pasar el nombre de la acción que deseas:

Código Delphi [-]
var
  comp:TComponent;
begin

  // Buscar la action
  comp := FindComponent('MnCuentas');
  if Assigned(Comp) then begin
    if (comp is TAction) then begin
      TAction(comp).Execute;
    end;
  end;
__________________
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
  #6  
Antiguo 17-12-2009
erasmorc erasmorc is offline
Miembro
 
Registrado: ago 2004
Posts: 66
Poder: 20
erasmorc Va por buen camino
comp := FindComponent('MnCuentas');

Es que precisamente esto que has hecho es el problema, no puedo pasar el nombre del action list dentro del codigo osea no puedo hacer esto comp := FindComponent('MnCuentas'); porque solo me funcionaria para ese item del action list, cuando lo que quiero es que funcione para cualquiera que yo seleccione dentro de la tabla, en otras palabras ese Mncuentas deberia ser un campo del query por ejemplo form1.querynombrecampo.value pero esto no se como hacerlo, si esto fuera posible yo solo tendria que posicionarme en un registro de la tabla en donde estan los action list y selecciono la opcion de menu que deseo y presiono un boton y esa opcion se ejecutaria, de esta forma el menu seria dinamico. Gracias anticipadas.
Responder Con Cita
  #7  
Antiguo 17-12-2009
Avatar de juanlaplata
juanlaplata juanlaplata is offline
Miembro
 
Registrado: ene 2007
Ubicación: La Plata, Bs. As. (Argentina)
Posts: 212
Poder: 18
juanlaplata Va por buen camino
una ves programe algo como eso, y aqui el codigo.
Código Delphi [-]
procedure TBase.actualizarBotones(Pantalla:string);
var i:integer;
    accion :TAction;
    boton : TToolButton ;
    Form :TForm;
begin
Form := Application.FindComponent(Pantalla) as TForm;
if Form <> nil then
    begin
    Base.Shortcuts.Close;
    Base.Shortcuts.Filtered := False;
    Base.Shortcuts.Filter := 'Pantalla = '+ quotedStr(Pantalla);
    Base.Shortcuts.Filtered := True;
    Base.Shortcuts.Open;
    Base.Shortcuts.First;
    for i:=0  to Base.Shortcuts.RecordCount-1 do
        begin
        accion := Form.FindComponent(Base.ShortcutsShortcut.AsString) as TAction;
        if(accion <> nil )then
            begin
            boton := Form.FindComponent(Base.ShortcutsBoton.AsString) as TToolButton;
            if(boton <> nil )then
                begin
                accion.OnExecute := boton.OnClick;
                boton.Hint := Base.ShortcutsCaptionShortcut.AsString + ' / ' +Base.ShortcutsHintBoton.AsString ;
                end;
            end;
        Base.Shortcuts.Next;
        end;
    end
else ShowMessage('Sin Pantalla  ');
end;
En resumen de tu caso creo q sin problemas podrias hacer
Código Delphi [-]
comp := FindComponent(form1.querynombrecampo.asString);
Responder Con Cita
  #8  
Antiguo 17-12-2009
erasmorc erasmorc is offline
Miembro
 
Registrado: ago 2004
Posts: 66
Poder: 20
erasmorc Va por buen camino
Buenas tardes,

Bien sigo sin entender, tienen que tenerme paciencia porque soy un novato en programacion orientada a objetos y hay cosas que no las comprendo.

De tu ejemplo pude saber como convertir un texto a Taction y eso ya es un avance, pero aun no me funciona lo que quiero hacer mira este codigo

procedure TFMenuUsuarios.cxButton5Click(Sender: TObject);
var comp : Taction;
begin
comp := FindComponent (FUsuarios.QMenuNombreObjeto.Value) as TAction;
TAction(comp).Execute;
end;


se supone que deberia funcionar ahi lo que hago es segun el registro en que estoy posicionado ejecuto la action del action list, ya que el contenido de ese registro es el nombre del item en el action list. Pero no funciona.

Sin embargo si sustituyo la variable por el nombre directo del item del action list si funciona. seria algo asi

procedure TFMenuUsuarios.cxButton5Click(Sender: TObject);
var comp : Taction;
begin
comp := FindComponent (MnCuentas) as TAction;
TAction(MnCuentas).Execute;
end;


Donde MnCuentas es unos de los action list contenidos en la tabla desde donde estoy ejecutando.

Espero haberme explicado correctamente para ver si me pueden dar alguna ayuda sobre esto. Gracias anticipadas.
Responder Con Cita
  #9  
Antiguo 17-12-2009
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.269
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 erasmorc Ver Mensaje
Es que precisamente esto que has hecho es el problema, no puedo pasar el nombre del action list dentro del codigo osea no puedo hacer esto comp := FindComponent('MnCuentas'); porque solo me funcionaria para ese item del action list, cuando lo que quiero es que funcione para cualquiera que yo seleccione dentro de la tabla
Esto es un ejemplo, en realidad lo que tienes que utilizar en ese lugar es una variable.
En tu caso un campo de tu tabla debe tener asociado en nombre del TAction, sino no hay forma de "enganchar" lo que tienes en Base de Datos, con lo que tienes en código.

¿Exactamente qué tienes almacenado en la tabla? ¿Cuales son los campos?

Cita:
Empezado por erasmorc Ver Mensaje
...en otras palabras ese Mncuentas deberia ser un campo del query por ejemplo form1.querynombrecampo.value pero esto no se como hacerlo
Pues añadiendo a tu tabla ese campo y accediendo a ese valor tal y como te han comentado antes:

Código Delphi [-]
  StrNombreAccion := Query.FieldByName('NombreAccion').AsString;
__________________
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
  #10  
Antiguo 17-12-2009
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.269
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
Hola.
Añade TAG's al código para que se lea mejor.

El problema es que esos dos códigos no son equivalentes, ya que en el segundo:
Código Delphi [-]
  TAction(MnCuentas).Execute;

MnCuentas no es el nombre del componente, sino el componente en sí.

Vamos por partes (como dijo Jack el destripador...)

Coloca el siguiente código:

Código Delphi [-]
var
  Str:string;
  comp:TComponent;
begin

  // Extraer el nombre
  Str := FUsuarios.QMenuNombreObjeto.Value;
  MessageDlg('Nombre la la Action: ' + Str, mtInformation, [mbOK], 0);

  Str := FUsuarios.QMenuNombreObjeto.AsString;
  MessageDlg('Nombre la la Action (string): ' + Str, mtInformation, [mbOK], 0);

  // Buscar la Taction
  comp := FindComponent(Str);
  // encontrado
  if Assigned(Comp) then begin
    MessageDlg('Encontrado el componente: ' + Str, mtInformation, [mbOK], 0);
    if (comp is TAction) then begin
      // encontrada la TAction
      TAction(comp).Execute;
    end;
  end
  else begin
    MessageDlg('No encontrado el componente: ' + Str, mtWarning, [mbOK], 0);
  end;

Ejecútalo, paso a paso, si hace falta y dinos qué mensajes te salen...
__________________
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
  #11  
Antiguo 17-12-2009
erasmorc erasmorc is offline
Miembro
 
Registrado: ago 2004
Posts: 66
Poder: 20
erasmorc Va por buen camino
Buenos dias,

Neftali es que ya tengo la tabla creada con los campos correspondientes, y hay un campo llamado NombreObjeto que contiene el nombre del action list que quiero ejecutar, pero es que ahi es que esta el problema porque cuando paso el contenido del campo para que sea ejectuado no funciona mira esto es lo que hago que no funciona

procedure TFMenuUsuarios.cxButton5Click(Sender: TObject);
var comp : Taction;
begin
comp := FindComponent (FUsuarios.QMenuNombreObjeto.Value) as TAction;
TAction(comp).Execute;
end;


Pero si hago esto mismo pero sustituyo el lugar donde esta el campo de la tabla por el nombre que esta contenido en el campo si me funciona que seria esto

procedure TFMenuUsuarios.cxButton5Click(Sender: TObject);
var comp : Taction;
begin
comp := FindComponent (MnCuentas) as TAction;
TAction(MnCuentas).Execute;
end;


Actualmente estoy atorado ahi, no se como resolverlo. Gracias por su colaboracion.
Responder Con Cita
  #12  
Antiguo 17-12-2009
erasmorc erasmorc is offline
Miembro
 
Registrado: ago 2004
Posts: 66
Poder: 20
erasmorc Va por buen camino
Buenos dias,

Dice que no encuentra el componente, es decir no entra al codigo de la ejecucion de la accion.

este es el mensaje 'No encontrado el componente:

Para contestar algo que preguntaste sobre Mncuentas, el actionlist se llama ActionList1 y MnCuentas es una accion que yo he creado dentro de ese actionlist.

Por eso los dos codigos que viste hace un momento si son equivalentes, porque lo que estoy haciendo es sustituyendo en uno de ellos el puntero de la tabla por el contenido que tiene ese campo en la misma tabla, porque en la tabla yo tengo en cada registro los nombres de acciones en el action list.
Responder Con Cita
  #13  
Antiguo 17-12-2009
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.269
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 erasmorc Ver Mensaje
Para contestar algo que preguntaste sobre Mncuentas, el actionlist se llama ActionList1 y MnCuentas es una accion que yo he creado dentro de ese actionlist.
Correcto; Y en tu Base de Datos como nombre de la Action debería ir el MnCuentas.

Creo que con un ejemplo se verá más claro...

Ahí tienes una pequeña tabla (XML) que tiene una serie de acciones definidas (nombre) que coinciden con las que existen en el programa.
Selecciona una línea del Grid y pulsa ejecutar; Eso a partir de lo que hay definido en el campo NOMBRE ejecuta la acción (TAction) que se llama igual y que está definida en el programa.
Archivos Adjuntos
Tipo de Archivo: zip Menu TAction BD.zip (6,5 KB, 16 visitas)
__________________
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
  #14  
Antiguo 17-12-2009
erasmorc erasmorc is offline
Miembro
 
Registrado: ago 2004
Posts: 66
Poder: 20
erasmorc Va por buen camino
Buenos dias,

Listo funciono o mejor dicho lo hiciste funcionar el tema estaba en que el actionlist estaba en una pantalla diferente de donde estaba ejecutando el boton, entonces lo unico que tuve que hacer es especificar donde iba a buscar el componente es decir cambiar esto

comp := Fmenu.FindComponent(Str)

Un millon de gracias, en verdad te lo agradezco bastante, voy a seguir trabajando con este proyecto porque ahora tocan pulir otras cositas, gracias.
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
Crear Cubos en un plano Configurable Efren2006 Gráficos 11 24-03-2009 15:12:10
QReport configurable por el usuario ?? Delphitest Impresión 1 02-02-2009 05:02:16
Showmessage configurable Marwuinh Varios 6 23-10-2008 22:05:37
iconos para el el menu main o pop menu... vroa74 Gráficos 0 06-10-2008 15:54:56
Imagen o texto sobre el menu / menu con align / menu movible dajaji Varios 12 21-09-2007 00:30:19


La franja horaria es GMT +2. Ahora son las 23:03:47.


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