[RESUELTO] Eliminar TActions creadas en runtime...
#1
Escrito 14 enero 2010 - 05:02
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!!!!!!
#2
Escrito 14 enero 2010 - 05:12
Salud OS
#3
Escrito 14 enero 2010 - 05:15
o
TAction.Item [n] := NIL;
#4
Escrito 14 enero 2010 - 05:18
Tengo esta funcion en mi clase base que me permite crear las acciones:
function TfrmMain.CreaAccion(sName, sCaption, sHint, sCategory: string; iImageIndex, iTag: integer; var acAct: TAction): boolean; begin acAct := TAction.Create(self); with acAct do begin Category := sCategory; Name := sName; ImageIndex := iImageIndex; Tag := iTag; Caption := sCaption; Hint := sHint; //ShortCut := 121; OnExecute := ExecutaAction; end; end;
después en la instancia de mi forma llamo esta funcion recorreindo una tabla por medio de un query
... CreaAccion('acRep'+FieldByName('rep_id').AsString, FieldByName('rep_name').AsString, 'Reporte|Reporte '+FieldByName('rep_name').AsString, 'Reportes', 1, FieldByName('rep_id').Asinteger,acNew); ItemNew := vbMenu.Items.Add; with ItemNew do begin Name := 'miRep'+FieldByName('rep_id').AsString; Action := acNew; Visible := True; end; ...
pero en mi TActionsList tengo otras Acciones que no quiero borrar
#5
Escrito 14 enero 2010 - 05:21
Salud OS
#6
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.
#7
Escrito 14 enero 2010 - 05:26
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
#8
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.
#9
Escrito 14 enero 2010 - 05:41
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...
#10
Escrito 14 enero 2010 - 05:43
como control no puedo recorrer un TAction que mala pata...
Sí es posible recorrerlo.
For i := 1 to ActionList1.Items.Count -1 do ActionList1.Items [i] .Caption := IntToStr(i);
#11
Escrito 14 enero 2010 - 05:56
for i := 0 to alActions.ActionCount - 1 do if alActions.Actions[i].Category='Reportes' then 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....
#12
Escrito 14 enero 2010 - 05:57
Salud OS
#13
Escrito 14 enero 2010 - 06:02
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.
#14
Escrito 14 enero 2010 - 06:09
var Form1: TForm1; acAct: TAction; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var I: Integer; begin for I := 1 to 3 do begin with acAct do begin Category := 'REporTES'; Name := 'Action'+inttostr(ActionList1.ActionCount+i); Tag := 1; Caption := 'caption'; Memo1.Lines.Add(Name) end; end; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin acAct.Free end; procedure TForm1.FormShow(Sender: TObject); begin acAct := TAction.Create(nil); end;
Salud OS
#15
Escrito 14 enero 2010 - 06:14
#16
Escrito 14 enero 2010 - 06:42
eh aqui lo que hice:
... for i := Self.ComponentCount-1 downto 0 do if (Self.Components[i] is tAction) then if (Self.Components[i] as TAction).Category='Reportes' then begin (Self.Components[i] as TAction).Free; end; while not Eof do begin CreaAccion('acRep'+FieldByName('rep_id').AsString, FieldByName('rep_name').AsString, 'Reporte|Reporte '+FieldByName('rep_name').AsString, 'Reportes', 1, FieldByName('rep_id').Asinteger, acNew); ...
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..
#17
Escrito 14 enero 2010 - 06:48
Salud OS
#18
Escrito 14 enero 2010 - 06:50
Felicidades, haz resuelto un enigma de un programa.