Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Proceso al cerrar una form (https://www.clubdelphi.com/foros/showthread.php?t=75203)

fwhite 04-08-2011 19:48:07

Proceso al cerrar una form
 
Hola amigos:
Quisiera que me dijerais porque no al cerrar una form no me hace lo que le digo. La procedure es la siguiente:
Código Delphi [-]
 
procedure TfmDeportes.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  With dmMain do
    begin
      tbDeportes.Active := False;
      tbContadores.Active := False;
    end;
    ShowMessage('Punto de Control');  (Hasta aqui bien, sale el mensaje)
  With dmMain.tbDeportes do  (Desde aqui no lo hace)
    begin
      if State in [dsInsert] then
        begin
          if MessageDlg('Los datos introducidos no han sido grabados' +
            #13 + #13 +
            '¿Deseas grabarlos ahora?', mtconfirmation, [mbNo, mbOk], 0) =
            mrOk then
            Post;
          With dmMain.tbContadores do
            begin
              Edit;
              FieldValues['Tutores'] := FieldValues['Tutores'] + 1;
              Post;
            end;
        end;
      if State in [dsEdit] then
        begin
          if MessageDlg('Los datos introducidos no han sido grabados' +
            #13 + #13 +
            '¿Deseas grabarlos ahora?', mtconfirmation, [mbNo, mbOk], 0) =
            mrOk then
            Post;
        end;
    end;
  Action := caFree;
end;
Graciñas.

ecfisa 04-08-2011 19:53:26

Hola fwhite.

Moví tu mensaje del foro Builder C++ a varios ya que tu código es Delphi.
Por favor usa las etiquetas para encerrar tu código.

Saludos y gracias por tu colaboración.

maeyanes 04-08-2011 19:57:59

Hola...

Te recomiendo que mejor uses el evento OnCloseQuery del formulario. Desde este evento puedes hasta indicar si deseas que el formulacio se cierre o cancelar la acción:

Código Delphi [-]
procedure TfmDeportes.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  // El proceso es correcto o se desea cerrar el formulario
  CanClose := True
  // El proceso tiene algún error o el usuario cancela la acción de cerrar el formulario
  CanClose := False
end;

Pasando a otro tema, cuando publiques código fuente en Delphi, usa las etiquetas [delphi]:

[delphi]
begin
ProcedimientoAEjecutar;
Variable := 'hola mundo';
// ejemplo
end;
[/delphi]

lo que se mostrará en los foros así:

Código Delphi [-]
begin
  ProcedimientoAEjecutar;
  Variable := 'hola mundo';
  // ejemplo
end;

Revisando tu código, veo que lo primero que haces es cerrar dos dataset y luego enseguida quieres hacer un Edit y un Post sobre ellos. Me imagino que también obtienes algún error del tipo "Esta acción no se puede realizar sobre un DataSet cerrado".


Saludos...

ecfisa 04-08-2011 19:59:46

Hola de nuevo fwhite.

Fijate que aqui:
Código Delphi [-]
  With dmMain do
    begin
      tbDeportes.Active := False;
      tbContadores.Active := False;
    end;
cerras los DataSet y luego intentas utilizarlos.

Saludos.

fwhite 05-08-2011 00:14:05

Codigo no funciona al cerrar un form
 
Hola amigos:
Haber si me podeis decir por que no funciona la siguiente procedure desde donde indico. Graciñas desde ya.

Código Delphi [-]
 
procedure TfmDeportes.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  With dmMain do
    begin
      tbDeportes.Active := False;
      tbContadores.Active := False;
    end;
    ShowMessage('Punto de Control');   // hasta aquí funciona
  With dmMain.tbDeportes do   // desde aquí no lo tiene en cuenta
    begin
      if State in [dsInsert] then
        begin
          if MessageDlg('Los datos introducidos no han sido grabados' +
            #13 + #13 +
            '¿Deseas grabarlos ahora?', mtconfirmation, [mbNo, mbOk], 0) =
            mrOk then
            Post;
          With dmMain.tbContadores do
            begin
              Edit;
              FieldValues['Deportes'] := FieldValues['Deportes'] + 1;
              Post;
            end;
        end;
      if State in [dsEdit] then
        begin
          if MessageDlg('Los datos introducidos no han sido grabados' +
            #13 + #13 +
            '¿Deseas grabarlos ahora?', mtconfirmation, [mbNo, mbOk], 0) =
            mrOk then
            Post;
        end;
    end;
  Action := caFree;
end;

oscarac 05-08-2011 00:17:41

tu codigo esta algo desordenado
creo que que colocas el active en false
eso es como cerrar la tabla

entonces.. si la tabla estar cerrada, no puede realizarse ninguna operacion con ella

Chris 05-08-2011 00:42:06

Antes que todo, ordena un poco tu código y utiliza correctamente las equitas Delphi. Fíjate la diferencia con respecto a tu código:
Código Delphi [-]
procedure TfmDeportes.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    With dmMain do
    begin
        tbDeportes.Active := False;
        tbContadores.Active := False;
    end;
    
    ShowMessage('Punto de Control'); // hasta aquí funciona
    
    With dmMain.tbDeportes do // desde aquí no lo tiene en cuenta
    begin
        if State in [dsInsert] then
        begin
            if MessageDlg('Los datos introducidos no han sido grabados' +
                           #13 + #13 + '¿Deseas grabarlos ahora?',
                           mtconfirmation, [mbNo, mbOk], 0) = mrOk then
                Post;
                
            With dmMain.tbContadores do
            begin
                Edit;
                FieldValues['Deportes'] := FieldValues['Deportes'] + 1;
                Post;
            end;
        end;
        
        if State in [dsEdit] then
        begin
            if MessageDlg('Los datos introducidos no han sido grabados' +
                          #13 + #13 + '¿Deseas grabarlos ahora?',
                          mtconfirmation, [mbNo, mbOk], 0) = mrOk then
                Post;
        end;
    end;
    Action := caFree;
end;

Ahora, sería mejor así:
Código Delphi [-]
procedure TfmDeportes.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    With dmMain do
    begin
        tbDeportes.Active := False;
        tbContadores.Active := False;
    end;
    
    ShowMessage('Punto de Control'); // hasta aquí funciona
    
    With dmMain.tbDeportes do // desde aquí no lo tiene en cuenta
    begin
        if (State in [dsInsert,  dsEdit]) then
        begin
            if MessageDlg('Los datos introducidos no han sido grabados' +
                           #13 + #13 + '¿Deseas grabarlos ahora?',
                           mtconfirmation, [mbNo, mbOk], 0) = mrOk then
                Post;
                
            With dmMain.tbContadores do
            begin
                Edit;
                FieldValues['Deportes'] := FieldValues['Deportes'] + 1;
                Post;
            end;
        end;
    end;
    Action := caFree;
end;

Pero lo que realmente quieres debe ser esto:
Código Delphi [-]
procedure TfmDeportes.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    With dmMain.tbDeportes do // desde aquí no lo tiene en cuenta
    begin
        if (State in [dsInsert,  dsEdit]) then
        begin
            if MessageDlg('Los datos introducidos no han sido grabados' +
                           #13 + #13 + '¿Deseas grabarlos ahora?',
                           mtconfirmation, [mbNo, mbOk], 0) = mrOk then
                Post;
                
            With dmMain.tbContadores do
            begin
                Edit;
                FieldValues['Deportes'] := FieldValues['Deportes'] + 1;
                Post;
            end;
        end;
    end;
   
    With dmMain do
    begin
        tbDeportes.Active := False;
        tbContadores.Active := False;
    end;
    
    Action := caFree;
end;
El problema era que estabas cerrando las tablas antes de hacer las comparaciones de si ésta estaba en modo de edición o inserción. Por consiguiente las condiciones siempre devolvían False y nunca se ejecutaba lo que pretendías.

Saludos,
Chris

maeyanes 05-08-2011 02:09:36

Hola...

¿Por que repites temas?

http://www.clubdelphi.com/foros/showthread.php?t=75203


Saludos...

ecfisa 05-08-2011 04:08:39

Hola.

Gracias por el aviso maeyanes ;), ya los combiné.

fwhite, como ya te han dicho: Por favor no dupliques los temas.

Saludos y gracias por tu colaboración.

fwhite 05-08-2011 10:20:16

Hola amigos:
En primer lugar, pido disculpas a todos por mi mal uso del foro. Procuraré en adelante seguir estrictamente las normas.
En segundo lugar, efectivamente, el cierre de las Bases estaba mal colocado, con lo que el problema está resuelto.
Graciñas a todos.


La franja horaria es GMT +2. Ahora son las 03:07:21.

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