Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-07-2008
radge radge is offline
Miembro
 
Registrado: may 2008
Posts: 147
Poder: 19
radge Va por buen camino
Cita:
Empezado por coso Ver Mensaje
por ejemplo, aqui se crea, pero se libera correctamente? si no se hace, pasa lo mismo que antes...que se queda en memoria la anterior pues se usa la misma variable global para referenciarla.

Código Delphi [-]procedure TfrmSupVision.BtnImprimirClick(Sender: TObject); begin Application.CreateForm (TfrmPrintPedidosSupervisados, frmPrintPedidosSupervisados); frmPrintPedidosSupervisados.ShowModal; end

Esto es un boton que desde el form principal abre otro formulario , pero solo si lo llamo... que de momento esta deshabilitado asi k no creo que venga por aki , de todas formas el formulario lo tendria k destruir desde el mismo en el evento onclose no ?


Otra cosa... lo del famoso formulario

Código Delphi [-]
                   Application.CreateForm (TfrmUnidadesPedidoVenta, frmUnidadesPedidoVenta);
                   frmUnidadesPedidoVenta.enviarDadesSeguentForm(Cantidad,UnitatsServidesBD);
                   frmUnidadesPedidoVenta.ShowModal;
                   varDades := frmUnidadesPedidoVenta.rebreDades;
                   varUnitatsRestants := frmUnidadesPedidoVenta.rebreUnitatsRestants;
                   freeandnil(frmUnidadesPedidoVenta);


No creo que falle por aki , pk he borrado completamente estas lineas y sus referencias a el y sigue dando el mismo error.

Asi k seguimos buscando !

salu2 radge
Responder Con Cita
  #2  
Antiguo 25-07-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
si, pero como te decia...si estas creando TODAS LAS FORMS de tu proyecto usando un solo nombre de variable para cada clase, sin liberar las anteriores y reusando ese nombre de variable, se te queda la anterior creada desreferenciada en memoria.
Responder Con Cita
  #3  
Antiguo 25-07-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Código:
Application.CreateForm (TfrmPrintPedidosSupervisados, frmPrintPedidosSupervisados);   frmPrintPedidosSupervisados.ShowModal; end
Cita:
de todas formas el formulario lo tendria k destruir desde el mismo en el evento onclose no ?
no, porque le estas asignando de parent la aplicacion, no la form que lo contiene, por eso lo del f:= Tform.Create(self)
Responder Con Cita
  #4  
Antiguo 25-07-2008
radge radge is offline
Miembro
 
Registrado: may 2008
Posts: 147
Poder: 19
radge Va por buen camino
Lo siento llevo 2 semanas con delphi y no entiendo muy bien lo que dices.

Mira tengo la siguiente estructura

Formulario principal
frmMain
Formstyle : fsMDIForm


Desde el cual tengo un botton a frmsupvision con el siguiente codigo

Código Delphi [-]
procedure TfrmMain.BitBtn4Click(Sender: TObject); begin
    WebBrowser1.SendToBack;   
 if not Assigned (frmSupVision) then     
  Application.CreateForm (TfrmSupVision, frmSupVision); 
 end;



Entonces abro el formulario supvision que tiene estas caracteristicas:
frmsupvision
formstyle : fsMDiChild


Y desde este si es necesario llamo a
frmUnidadespedidoVenta
formstyle : fsNormal

Última edición por radge fecha: 25-07-2008 a las 17:02:59.
Responder Con Cita
  #5  
Antiguo 25-07-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
El evento onclose de un form no destruye el formulario, solo lo cierra. Si tu destruyes un form, este destruye todos los componentes que la tienen en su propiedad parent.

lo que estas haciendo ahora mismo es esto:

f : objeto

...

f := crear_objeto;
f.Trabajamos
f.Cerramos (PERO NO DESTRUIMOS!)
...

y, al cabo de un rato, usando la misma variable

f := crear_objeto (*1)
f.Trabajamos
f.Cerramos (sin destruir otra vez)

si te fijas, en (*1) hemos perdido el valor anterior de f, el cual es un puntero a un objeto, y por lo tanto, tanto el puntero como el objeto quedan aun cargados y bloqueados en memoria, pero ya no se pueden localizar, por lo que tras sucesivas llamadas la memoria se te va a ir llenando hasta ya no poder cargar nada mas. Imagina que en la primera asignacion f fuese 0x00100 ocupando 200; en la segunda vuelta ponemos a f := 0x00300 ocupando 200 mas: la direccion de 0x00100 a 0x00300 se nos queda bloqueada y peor aun, sin poder acceder a ella. Vamos, que nos quedamos sin memoria. Por eso te salta a las 30 o 40 veces. Mira, cuando te salte el error, el administrador de tareas cuanta memoria estas consumiendo, o bien un administrador de memoria (por internet los hay de buenos). La gracia de las variables locales es precisamente que tienes controlado cuando las llamas y cuando las destruyes: solo usaras ese nombre mientras este usandose la form, y nadie mas en el programa la usaria. Si son forms de las que solo necesitas una instancia a la vez, lo mejor es usar el autocreate y llamarlas directamente con el showmodal, olvidandote de crear de nuevas en todo el proyecto: creas todas las del proyecto que seguro necesites y las llamas. Las que no, las creas LOCALMENTE, usas, y destruyes tambien localmente. Lo de TForm1.Create(parent) es para q cuando se destruya el parent, tambien se destruya el objeto creado.

otro ejemplo : en un proyecto tengo dos classes, TForm1, TForm2 con dos instancias con el autocreate : Form1, Form2. Imagina que en el form1 hay 2 botones.

Código Delphi [-]

procedure TForm1.ButtonClick(sender : TObject);
var
    f1 : TForm1;
    f2 : TForm2;
begin
     f1 := TForm1.Create(self);
     f1.ShowModal;
     f1.Free;
     f2 := TForm2.Create(self);
     f2.ShowModal;
     f2.Free;
end;     

procedure TForm1.Button2Click(sender : TObject);
begin
             Form1 := TForm1.Create(self);
             Form1.ShowModal;

             Form2 := TForm2.Create(self);
             Form2.ShowModal;
end;

pruebalo, veras que los 2 parece que funcionan igual, pero no. Puesto que tal como te habia dicho, en el segundo estamos sobreescribiendo las variables globales Form1 y Form2 con nuevos objetos tipo TForm1,TForm2, perdiendo los anteriores por memoria, mientras que en el primero estamos creando nuevas instancias sin perder sus referencias. En el caso de poner Form1.Free, Form2.Free despues del showmodal, tendras el inconveniente de eliminar todas las instancias (aunque no se liberarian las forms anteriores, pues se quedaron desreferenciadas) que hay en el proyecto. En tu caso, seria lo correcto, siempre que no se llamen ni a ninguna propiedad ni funcion sin crearlas anteriormente, vamos, siempre que no estes usando la variable global sin crearla anteriormente.

Última edición por coso fecha: 25-07-2008 a las 17:51:30.
Responder Con Cita
  #6  
Antiguo 28-07-2008
radge radge is offline
Miembro
 
Registrado: may 2008
Posts: 147
Poder: 19
radge Va por buen camino
He probado lo siguiente ya os comentaré si falla o no.

Código Delphi [-]
procedure TfrmSupVision.wwDBGrid1FieldChanged(Sender: TObject;   Field: TField);
 Var    formulari : TfrmUnidadesPedidoVenta;
 begin
 formulari := TfrmUnidadesPedidoVenta.Create(self);           
 formulari.CarregaDades(Cantidad,UnitatsServidesBD);                    
formulari.ShowModal;                    
varDades := formulari.rebreDades; 
varUnitatsRestants := formulari.rebreUnitatsRestants;
formulari.Free;



Lo que si que me salen son muchos errores de escritura.


Responder Con Cita
  #7  
Antiguo 26-08-2008
radge radge is offline
Miembro
 
Registrado: may 2008
Posts: 147
Poder: 19
radge Va por buen camino
Os vuelvo a dejar el codigo con los cambios descritos arriba por el compañero , sigue fallando ;(

de todas formas gracias

Código Delphi [-]

procedure TfrmSupVision.wwDBGrid1FieldChanged(Sender: TObject;
  Field: TField);
Var
  Qry: TQuery;
   cadenaSQL,FilaCheck,Lin_Codi,Alb_Codi,Per_Codi,accountnum,dataareaid ,
   varDades , varUnitatsRestants : string;
   Cantidad , UnitatsServidesBD , botoseleccionat  : Integer ;
   Marca : TBookMarkStr;
   formulari : TfrmUnidadesPedidoVenta;
begin
     try
         Lin_Codi := query_supvision.FieldbyName('LIN_Codi').AsString;
         ...
     ...
      except
         showmessage('No se han podido cargar los datos del albarán');
         query_supvision.close;
         query_supvision.open;
      end;
         if not assigned (Qry) then begin
             Qry := TQuery.Create (nil);
             Qry.DatabaseName := Modulo_Datos.NOG_Comer.DatabaseName;
         end;
         Qry.Close;
         Qry.SQL.Clear;

     if ((Lin_Codi <> '') and (Dataareaid <> '') and (Alb_Codi <> '') and (Per_Codi <> '') and (Accountnum <> '')) then begin
           if (cmbSupervisado.text = 'TODOS') then begin
              try
                 Marca := query_supvision.Bookmark;
              except
                 query_supvision.close;
                 query_supvision.open;
              end;
           end;
        try
        FilaCheck := wwDBGrid1.GetFieldValue(7); // Si cambiem l'ordre del grid cambiar el GetFieldValue
        except
        showmessage('Hubo un error cargando los datos del formulario');
        query_supvision.close;
        query_supvision.open;
        end;

        if (FilaCheck = 'S') then  begin
             // 1 unitat , fiquem la data i l'introduim  a la BD
             if (Cantidad = 1) then begin
                 Qry.SQL.Clear;
                 cadenaSQL := 'update tabla .................';
                 Qry.SQL.Add(cadenaSQL);
                 Qry.ExecSQL;

                 Qry.SQL.Clear;
                 cadenaSQL := 'Insert into tabla ............';
                 Qry.SQL.Add(cadenaSQL);
                 Qry.ExecSQL;

                 query_supvision.close;
                 query_supvision.Open;
             end
             else begin 
                   formulari := TfrmUnidadesPedidoVenta.Create(self);
                   formulari.CarregaDades(Cantidad,UnitatsServidesBD);
                   formulari.ShowModal;
                   varDades := formulari.rebreDades;
                   varUnitatsRestants := formulari.rebreUnitatsRestants;
                   if assigned(formulari) then
                  freeandnil(formulari);

                   Qry.SQL.Clear;
                   cadenaSQL := 'update tabla .........';
                   Qry.SQL.Add(cadenaSQL);
                   Qry.ExecSQL;

                   Qry.SQL.Clear;
                   cadenaSQL := 'Insert into .................';
                   Qry.SQL.Add(cadenaSQL);
                   Qry.ExecSQL;

                   query_supvision.Close;
                   query_supvision.Open;
                end;
        end
        else if (FilaCheck = 'N') then
             if (Cantidad = UnitatsServidesBD) then begin
                 // procedim a desmarcar
                   botoseleccionat := MessageDlg('Estas seguro que quieres borrar las unidades servidas ?',mtCustom,[mbYes,mbNo], 0);
                 if botoseleccionat = mrYes then begin
                     Qry.SQL.Clear;
                     cadenaSQL := 'update tabla .............. ';
                     Qry.SQL.Add(cadenaSQL);
                     Qry.ExecSQL;

                     Qry.SQL.Clear;
                     cadenaSQL := 'update table .............. ';
                     Qry.SQL.Add(cadenaSQL);
                     Qry.ExecSQL;

                     query_supvision.Close;
                     query_supvision.Open;
                 end
                else begin
                     query_supvision.cancel;
                end;
             end;
        end
    else begin
       showmessage('Este cliente no tiene más albaranes por editar');
       try
          query_supvision.Close;
          query_supvision.open;
       except
          ;
       end;
    end;
      if (cmbSupervisado.text = 'TODOS') then begin
          try
           query_supvision.Bookmark := Marca;
          except
          query_supvision.close;
          query_supvision.open;
          end;
     end;
  end;
end.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Error Raro sobre archivo "ntdll.dll" que no consigo encontrar el motivo AGAG4 Impresión 1 23-11-2007 07:11:17
localizar un registro vroa74 Conexión con bases de datos 3 17-08-2007 14:11:23
Localizar un registro alcides Varios 4 13-04-2007 20:17:27
Localizar datos con Firebird joanajj Firebird e Interbase 5 06-06-2006 00:11:42
RaveReport AccessViolation raugadel Impresión 0 03-11-2005 15:32:56


La franja horaria es GMT +2. Ahora son las 14:48:28.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi