Hola a todos...
Les comento un problema que me trae un par de días dando vueltas y vueltas y no puedo solucionarlo.
Tengo un sistema grande, con cerca de 270 formularios y un modulo de datos con 130 querys aprox.
Utilizo para conectarme a Firebird 2.1, los tibobjects. (TIBOQuerys)
Utilizo delphi 2010.
Cuando creo un formulario, en el create del form instancio el modulo de datos (para cada formulario) y abro el query., Este Tiboquery, esta enlazado a los componetes por medio de un tdatasource.
En el evento StateChange del datasource llamo a una procedimiento que me pinta los componentes de color según el estado del dataset.
Código Delphi
[-]
ComponentsColorDataSetStatus(DataSource1.DataSet.State,Form1);
El procedimiento es este:
Código Delphi
[-]
Procedure ComponentsColorDataSetStatus(myState:TDataSetState; MyForm: TControl);
Var i:Integer;
myColor, myColorReadOnly:TColor;
procedure ChangeColorComponent(myComponent:TComponent);
begin
if myComponent is TcxDBSpinEdit then
begin
if Not TcxDBSpinEdit(myComponent).Properties.ReadOnly then
TcxDBSpinEdit(myComponent).Style.Color := myColor
else TcxDBSpinEdit(myComponent).Style.Color := myColorReadOnly;
end
else
if myComponent is TcxDBTextEdit then
begin
if Not TcxDBTextEdit(myComponent).Properties.ReadOnly then
TcxDBTextEdit(myComponent).Style.Color := myColor
else TcxDBTextEdit(myComponent).Style.Color := myColorReadOnly;
end
else
if myComponent is TcxDBLookupComboBox then
begin
if Not TcxDBLookupComboBox(myComponent).Properties.ReadOnly then
TcxDBLookupComboBox(myComponent).Style.Color := myColor
else TcxDBLookupComboBox(myComponent).Style.Color := myColorReadOnly;
end
else
if myComponent is TcxDBMemo then
begin
if Not TcxDBMemo(myComponent).Properties.ReadOnly then
TcxDBMemo(myComponent).Style.Color := myColor
else TcxDBMemo(myComponent).Style.Color := myColorReadOnly;
end
else
if myComponent is TcxDBDateEdit then
begin
if Not TcxDBDateEdit(myComponent).Properties.ReadOnly then
TcxDBDateEdit(myComponent).Style.Color := myColor
else TcxDBDateEdit(myComponent).Style.Color := myColorReadOnly;
end
else
if myComponent is TcxDBCurrencyEdit then
begin
if Not TcxDBCurrencyEdit(myComponent).Properties.ReadOnly then
TcxDBCurrencyEdit(myComponent).Style.Color := myColor
else TcxDBCurrencyEdit(myComponent).Style.Color := myColorReadOnly;
end
else
if myComponent is TcxDBButtonEdit then
if Not TcxDBButtonEdit(myComponent).Properties.ReadOnly then
TcxDBButtonEdit(myComponent).Style.Color := myColor
else TcxDBButtonEdit(myComponent).Style.Color := myColorReadOnly;
end;
begin
if (MyForm = nil) then Exit;
Case myState of
dsInactive: myColor := clGray;
dsBrowse : myColor := clWindow;
dsEdit : myColor := $00BFDFFF; dsInsert : myColor := $00F0DBCE; end;
myColorReadOnly := clSilver;
if ((myState = dsInactive) or
(myState = dsBrowse) or
(myState = dsEdit) or
(myState = dsInsert)) then
begin
if myForm is TForm then begin
for I := 0 to TForm(myForm).ComponentCount - 1 do
begin
ChangeColorComponent(TForm(myForm).Components[i]);
end;
end
else
if myForm is TFrame then
begin
for I := 0 to TFrame(myForm).ComponentCount - 1 do
begin
ChangeColorComponent(TFrame(myForm).Components[i]);
end;
end;
end;
Repacemos el circuito:
Creo el Form1.
En el Create Hago el OPen del query que esta en el modulo de datos.
Al hacer el open se ejecuta el evento de StateChange del datasource.
Y en el evento llamo al procedimiento ComponentsColorDataSetStatus(DataSource1.DataSet.State,Form1);
Hasta aca todo espectacular anda en todos los formularios de mi proyecto sin ningun problema.
Resulta que agregue un nuevo form (Vamos a llamarlo Form1) al proyecto y lo configure como comento arriba.
Pero resulta que detecte que si abro el Form1, luego lo cierro, abro el FormularioX, cierro el FormularioX y vuelvo a Abrir el Form1 se produce un error en
la linea
del procedimiento que cambia los colores.
Aclaro que el FormularioX es siempre el mismo formulario, por lo que en principio creí que podría haber alguna relación entre ambos.
Ustedes dirán que puede ser algo que quede mal en el FormularioX, lo cambie, desde cero, es mas, no puse ningún control, solo la apertura del query de FormularioX. Lo mismo con el Form1, desde cero, sin ningún componente, solo la apertura del query.
Llegue a pensar que podía ser un problema de la base de datos, primero cambie el query a otra tabla, cambie la base de datos.
Y el problema esta en el FormularioX con el Form1, en ningún otro lado tengo este problema siendo que trabajo de la misma forma para todos los formularios.
Lo único que me queda pensar es alguna restricción en la memoria, en la cantidad de objectos en el modulo de datos, en la cantidad de formularios en un proyecto.
La verdad no se donde esta el problema.
Necesito ideas para seguir buscando. Espero se les ocurra algo...
Saludos.