Hola hoy modifique una rutina que tiene como objetivo tomar el Nº de Tag de los edit visibles que tengo puestos dentro de un pagecontrol los guarda en un Array de enteros, luego se ordenan (Sort).... después se asigna estos valores a la propiedad Tag de los campos persistentes de Clientdataset que están en un datamodule y por ultimo se asigna los valores de los campos persistentes a los edit visibles de los page control de la ventana que tienen el asignado el mismo Nº de tag que los campos persistentes... Para el array utilice la la unit Generics.Collections que por los ejemplos que eh visto en internet solo se usa para aplicaciones de consola... el tema es que esto andada de maravilla, a no ser por un Access Violation que me esta dando al cerrar la aplicación.. creo que el motivo de esta violación debe ser la implementacion de esta Unit ya que antes de la modificación no salia este error y sale el este error solo cuando abro esta ventana, en las otras no utilizo esta rutina.
Cita:
---------------------------
Application Error
---------------------------
Exception EAccessViolation in module '@#&%'.exe at 00005DBE.
Access violation at address 00405DBE in module '@#&%.exe'. Read of address 8D726142.
---------------------------
Aceptar
---------------------------
|
Esta es mi rutina:
Código Delphi
[-]
procedure TvfInforNoved.AsignaMinMax2(vDataModulo: TDataModule; vTag: integer);
var
vI, vJ, vK: integer;
ListaDeTags: TList;
begin
vK := 0;
ListaDeTags:= TList.Create;
try
for vI := 0 to JfPageControlOrdenRango.Tabs.Count - 1 do
if JfPageControlOrdenRango.Tabs[vI].Visible then
for vJ := 0 to JfPageControlOrdenRango.Tabs[vI].Page.ControlCount - 1 do
if JfPageControlOrdenRango.Tabs[vI].Page.Controls[vJ] is TJfEdit then
if (JfPageControlOrdenRango.Tabs[vI].Page.Controls[vJ] as TJfEdit).Visible then
if (JfPageControlOrdenRango.Tabs[vI].Page.Controls[vJ] as TJfEdit).Tag >= vTag then
ListaDeTags.Add((JfPageControlOrdenRango.Tabs[vI].Page.Controls[vJ] as TJfEdit).Tag);
ListaDeTags.Sort;
for vI := 0 to vDataModulo.ComponentCount - 1 do
if vDataModulo.Components[vI] is TClientDataSet then
if (vDataModulo.Components[vI] as TClientDataSet).Tag <> 0 then
for vJ := 0 to (vDataModulo.Components[vI] as TClientDataSet).FieldCount - 1 do
begin
(vDataModulo.Components[vI] as TClientDataSet).Open;
(vDataModulo.Components[vI] as TClientDataSet).Fields.Fields[vJ].Tag := ListaDeTags.Items[vK];
Inc(vTag);
Inc(vK);
end;
for vI := 0 to JfPageControlOrdenRango.Tabs.Count - 1 do
if JfPageControlOrdenRango.Tabs[vI].Visible then
for vJ := 0 to JfPageControlOrdenRango.Tabs[vI].Page.ControlCount - 1 do
if JfPageControlOrdenRango.Tabs[vI].Page.Controls[vJ] is TJfEdit then
if (JfPageControlOrdenRango.Tabs[vI].Page.Controls[vJ] as TJfEdit).Visible then
for vK := 0 to vDataModulo.ComponentCount - 1 do
if (vDataModulo.Components[vK] is TField) and (vDataModulo.Components[vK].tag = JfPageControlOrdenRango.Tabs[vI].Page.Controls[vJ].Tag) then
begin
(JfPageControlOrdenRango.Tabs[vI].Page.Controls[vJ] as TJfEdit).Value := (vDataModulo.Components[vK] as TField).AsVariant;
Break;
end;
finally
ListaDeTags.Free;
end;
end;
Esta correcto utilizar Generics.Collections en una aplicación digamos de 'win' ya que esto tiene que se lo que me provoca el Acces Violation.
Gracias.