Ir al contenido


Foto

[RESUELTO] Eliminar TActions creadas en runtime...


  • Por favor identifícate para responder
17 respuestas en este tema

#1 razadi

razadi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 681 mensajes
  • LocationMéxico D.F.

Escrito 14 enero 2010 - 05:02

Que tal amigos tengo un problemita, creo que debe ser algo sencillo, pero ahorita ya me entable!!!! :

Estoy creando unas acciones "TAction" en runtime, pero cuando vuelvo a ejecutar nuevamente el preoceso. Obviamente me dice que existe una Accion con ese nombre.

¿Como puedo borrar las acciones de una categoria para que no me siceda eso, es decir si existen las acciones de una categoria X que las borre y luego las vuelvo a crear?

HEEEELLLLPPP!!!!!! :shocked:


  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.261 mensajes
  • LocationMéxico

Escrito 14 enero 2010 - 05:12

Como estás creando la acción amigo razadi, lo que yo pienso es que debes de validar si existe una accion antes de crearla.

Salud OS
  • 0

#3 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 14 enero 2010 - 05:15

TAction.Clear;

o

TAction.Item [n] := NIL;
  • 0

#4 razadi

razadi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 681 mensajes
  • LocationMéxico D.F.

Escrito 14 enero 2010 - 05:18

Hola amigo mira lo que estoy haciendo es lo siguiente:

Tengo esta funcion en mi clase base que me permite crear las acciones:


delphi
  1. function TfrmMain.CreaAccion(sName, sCaption, sHint, sCategory: string;
  2.   iImageIndex, iTag: integer; var acAct: TAction): boolean;
  3. begin
  4.   acAct := TAction.Create(self);
  5.   with acAct do begin
  6.     Category := sCategory;
  7.     Name := sName;
  8.     ImageIndex := iImageIndex;
  9.     Tag := iTag;
  10.     Caption := sCaption;
  11.     Hint := sHint;
  12.     //ShortCut := 121;
  13.     OnExecute := ExecutaAction;
  14.   end;
  15. end;



después en la instancia de mi forma llamo esta funcion recorreindo una tabla por medio de un query



delphi
  1. ...
  2.     CreaAccion('acRep'+FieldByName('rep_id').AsString,
  3.                 FieldByName('rep_name').AsString,
  4.                 'Reporte|Reporte '+FieldByName('rep_name').AsString,
  5.                 'Reportes',
  6.                 1,
  7.                 FieldByName('rep_id').Asinteger,acNew);
  8.  
  9.       ItemNew := vbMenu.Items.Add;
  10.       with ItemNew do begin
  11.         Name := 'miRep'+FieldByName('rep_id').AsString;
  12.         Action := acNew;
  13.         Visible := True;
  14.       end;
  15. ...



pero en mi TActionsList tengo otras Acciones que no quiero borrar
  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.261 mensajes
  • LocationMéxico

Escrito 14 enero 2010 - 05:21

Ok, la duda que tengo es ¿porque la vuelves a generar?

Salud OS
  • 0

#6 razadi

razadi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 681 mensajes
  • LocationMéxico D.F.

Escrito 14 enero 2010 - 05:24

Ok, la duda que tengo es ¿porque la vuelves a generar?

Salud OS


Es por que en esa tabla se van almacenando reportes y pueden agregarse o eliminarse y debe refrescar el sistema esa parte.
  • 0

#7 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.261 mensajes
  • LocationMéxico

Escrito 14 enero 2010 - 05:26

Entiendo

Analizando tu código, veo que estas asignando el mismo tag a todas las acciones que estas creando, si quieres borrarlas puedes crear una funcion que borre todas las acciones que tengan el tag = 1 antes de crear nuevas.

Obviamente debes de cambiar el tag de las acciones que no quieres borrar.

Salud OS
  • 0

#8 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 14 enero 2010 - 05:28

..en esa tabla se van almacenando reportes y pueden agregarse o eliminarse y debe refrescar el sistema esa parte.


¿Y no es más fácil recrear TODO el contenido del TActionList a partir de la tabla? En mi muy humilde opinión para construir, primero hay que destruir. Ahora, lo que puedes hacer es tener una constante o un contador que te guarde la cantidad de acciones que NO DEBES borrar, y construir un ciclo que a partir de la siguiente posición de borre los que no necesitas. Y a partir de ahí, reconstruir el TActionList.
  • 0

#9 razadi

razadi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 681 mensajes
  • LocationMéxico D.F.

Escrito 14 enero 2010 - 05:41

No amigo egostar, el tag es el identificador del reporte, lo que es comun es la propiedad "Category", pero ahora me enfreto a algo que no habia visto. y lo comento en la respuesta a TiammatMX.

No es mala idea amigo TiammatMX, el problema que revisando el TActionList, da la casualidad que las acciones que creo en runtime no se asignan a este componente.

como control no puedo recorrer un TAction  que mala pata...
  • 0

#10 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 14 enero 2010 - 05:43

como control no puedo recorrer un TAction  que mala pata...


Sí es posible recorrerlo.



delphi
  1. For i := 1 to ActionList1.Items.Count -1 do
  2.     ActionList1.Items [i] .Caption := IntToStr(i);


  • 0

#11 razadi

razadi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 681 mensajes
  • LocationMéxico D.F.

Escrito 14 enero 2010 - 05:56

mmm nop amigo, el TActionList no almacena los TAction creados en runtime



delphi
  1. for i := 0 to alActions.ActionCount - 1 do
  2.       if alActions.Actions[i].Category='Reportes' then
  3.         alActions.Actions[i].Free;



puse este codigo pero cuando se inicia por primera ves y el ActionCount me regresa 5, mi proceso agrega 3 TAcions mas y cuando vuelvo a pasar por este proceso me siguen apareciendo 5 acciones y despues me truena poque dice que ya hay un componente con ese nombre....
  • 0

#12 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.261 mensajes
  • LocationMéxico

Escrito 14 enero 2010 - 05:57

Todo lo que creas en runtime, se queda en memoria, por lo que necesitas crear un archivo digamos INI donde almacenes las acciones creadas y las vuelvas a crear cuando tu aplicacion se inicia.

Salud OS
  • 0

#13 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 14 enero 2010 - 06:02

Dos posibilidades:

a) Alguna mala instancia del TActionList, es decir, que tienes más de un TActionList y por eso no puedes accederlo y te rebuzna el error.

b) La creación de tus acciones vía runtime está creando una acción en estado NIL y no alcanzas a detectarla..., pero Delphi sí.


El punto es que sí es posible acceder al TActionList, sólo que me vas a tener que esperar que llegue a casa para poder ponerte un pequeño pedazo de código que creo que puede servirte.
  • 0

#14 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.261 mensajes
  • LocationMéxico

Escrito 14 enero 2010 - 06:09

Intenta con esto:



delphi
  1. var
  2.   Form1: TForm1;
  3.   acAct: TAction;
  4.  
  5. implementation
  6.  
  7. {$R *.dfm}
  8.  
  9. procedure TForm1.Button1Click(Sender: TObject);
  10. var
  11.   I: Integer;
  12. begin
  13.   for I := 1 to 3 do
  14.   begin
  15.     with acAct do
  16.     begin
  17.       Category := 'REporTES';
  18.       Name := 'Action'+inttostr(ActionList1.ActionCount+i);
  19.       Tag := 1;
  20.       Caption := 'caption';
  21.       Memo1.Lines.Add(Name)
  22.     end;
  23.   end;
  24. end;
  25.  
  26. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  27. begin
  28. acAct.Free
  29. end;
  30.  
  31. procedure TForm1.FormShow(Sender: TObject);
  32. begin
  33.   acAct := TAction.Create(nil);
  34. end;



Salud OS
  • 0

#15 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 14 enero 2010 - 06:14

Muy buena solución. De hecho, creo que es la que mejor se puede adaptar a las necesidades del compañerito.
  • 0

#16 razadi

razadi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 681 mensajes
  • LocationMéxico D.F.

Escrito 14 enero 2010 - 06:42

Gracias a ambos por su apoyo, a lo mejor no fue la mejor solucion pero me funciono y se adapta a lo que tengo.

eh aqui lo que hice:



delphi
  1. ...
  2.     for i := Self.ComponentCount-1 downto 0 do
  3.       if (Self.Components[i] is tAction) then
  4.         if (Self.Components[i] as TAction).Category='Reportes' then begin
  5.           (Self.Components[i] as TAction).Free;
  6.         end;
  7.     while not Eof  do begin
  8.       CreaAccion('acRep'+FieldByName('rep_id').AsString,
  9.                 FieldByName('rep_name').AsString,
  10.                 'Reporte|Reporte '+FieldByName('rep_name').AsString,
  11.                 'Reportes',
  12.                 1,
  13.                 FieldByName('rep_id').Asinteger,
  14.                 acNew);
  15. ...



Ya lo probe quitando reportes y agregando reportes en la tabla y si funciona en ocaciones como que le tengo que dar dos veces pero ya no me marca error y si me refresca las acciones, por su ayuda le doy las gracias..

(y) (y) (y) (y) (y) (y) (y) (y) (y) (y) (y) (y)
  • 0

#17 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.261 mensajes
  • LocationMéxico

Escrito 14 enero 2010 - 06:48

Que bien amigo razadi, que bueno que salio el asunto (y)

Salud OS
  • 0

#18 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 14 enero 2010 - 06:50

Sigo en la terca. Hay otra manera de hacerlo, pero por el momento, hasta que no llegue a casa, la solución es adecuada.

Felicidades, haz resuelto un enigma de un programa.
  • 0