Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   Cancelar DBGrid (https://www.clubdelphi.com/foros/showthread.php?t=78218)

barakuda 30-03-2012 00:51:57

Cancelar DBGrid
 
Hola, tengo un problemilla que no consigo saber solucionar veran,
tengo una DBGrid con varios botones Aceptar, Cancelar, Aplicar, Editar. Si entro en modo edición y modifico la linea en la que me situó y antes de aplicar cancelo, me elimina cualquier modificación echa, asta aquí todo OK, en cambio si antes de aplicar o cancelar hago clic en otra linea me guarda las modificaciones echas lo cual no me interesa ya que puede prestar a confusiones y falsos datos. Para ello se me ocurrió conocer en que linea estoy cuando inicio la edición, y en el evento oncellclick compararla con el actual

Código Delphi [-]
procedure TAnadir.DBGrid10CellClick(Column: TColumn);

begin
ojo_fila:=Form1.DataSource2.DataSet.RecNo; // Lee la posicion de linia en la tabla

if fila<>ojo_fila then // compara linia actual (ojo_fila) con inicio edicion (fila) deser diferentes cancela todo

begin
form1.Anadir1.DBGrid10.Options:=form1.anadir1.DBGrid10.Options +[dgCancelOnExit] -[dgEditing];
form1.ADOTable2.Cancel;

form1.Anadir1.DBLookupComboBox4.Enabled:=False; // {OFICINA}
form1.Anadir1.DBLookupComboBox5.Enabled:=False; // {RED}
form1.Anadir1.DBCheckBox12.Enabled:=False; // {OCUPADA}

end;

... pues bien aun así solo consigo cancelar el proceso clickeando en el botón cancelar.
El código que detecta la diferencia de linea en la cual estoy funciona pero no me cancela la edición y no se que mas puedo hacer.

les agradecería algún comentario o aclaración, muchas gracias de adelantado.

ecfisa 30-03-2012 01:43:38

Hola barakuda.

Una opción sería utilizar la propiedad Tag del TButton con que aceptas, como flag para evaluarlo en el evento BeforePost del TDataSet:
Código Delphi [-]
...
procedure TForm1.FormCreate(Sender: TObject);
begin
  btnAceptar.Tag:= 0;
end;

procedure TForm1.DataSetBeforePost(DataSet: TDataSet);
begin
  if btnAceptar.Tag = 0 then  // ¿ Post desactivado ?
    DataSet.Cancel;  // si, cancelar               
end;

procedure TForm1.btnAceptarClick(Sender: TObject);
begin
  with DBGrid1.DataSource.DataSet do
  begin
    btnAceptar.Tag:= 1; // Post habilitado
    Edit;
    Post;
    btnAceptar.Tag:= 0; // Post desactivado
  end;
end;
...
Si se me una mejor opción te comento.

Saludos. :)

barakuda 30-03-2012 01:56:23

Gracias por tu rapida respuesta mira de paso me dao cuenta que si mientras estoy editando una celda juego con la ruleta del raton el foco me baja o sube sobre la columna donde estoy editando permitiendome tambien editar esa otra celda, para correguir eso lo que hago es insertar la esencia del codigo en el evente ONMouseWheel

Código Delphi [-]
procedure TAnadir.DBGrid10MouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin

        Form1.Anadir1.DBGrid10.Options := Form1.Anadir1.DBGrid10.Options +
          [dgCancelOnExit] - [dgEditing];
        Form1.ADOTable2.Cancel;
        Form1.Anadir1.DBLookupComboBox4.Enabled := False; // {OFICINA}
        Form1.Anadir1.DBLookupComboBox5.Enabled := False; // {TIPO DE RED}
        Form1.Anadir1.DBCheckBox12.Enabled := False; // {OCUPADA}
        Form1.Anadir1.DBCheckBox13.Enabled := False; // {ACTIVADA}
        Form1.Anadir1.DBCheckBox14.Enabled := False; // {ESTADO}
        Form1.Anadir1.BitBtn8.Enabled := False; // [APLICAR]
        Form1.Anadir1.BitBtn9.Enabled := False; // [CANCELAR]
        Form1.Anadir1.BitBtn1.Enabled := True; // [NUEVO]
        Form1.Anadir1.BitBtn10.Enabled := True; // [EDITAR]
        // ********** FIN del Bloque **********

end;

y ahora con solo usarla ya sea para subir o bajar automáticamente me cancela cualquier modificación que yo aya echo, eso es lo que me interesaria que hiciese al cambiar de fila pero no hay manera ...

ecfisa 30-03-2012 02:18:17

Hola.

¿ Y no te serviría desactivar el evento MouseWheel ?
Código Delphi [-]
...
  private
    procedure MouseEvent(var Msg: TMsg; var Handled: Boolean);
  end;
...

implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage:= MouseEvent;
end;

procedure TForm1.MouseEvent(var Msg: TMsg; var Handled: Boolean);
begin
  if Msg.Message =  WM_MOUSEWHEEL then
   Handled:= True;
end;
...

Saludos.

barakuda 30-03-2012 08:16:43

Cita:

Empezado por ecfisa (Mensaje 428847)
Hola barakuda.

Una opción sería utilizar la propiedad Tag del TButton con que aceptas, como flag para evaluarlo en el evento BeforePost del TDataSet:
Código Delphi [-]... procedure TForm1.FormCreate(Sender: TObject); begin btnAceptar.Tag:= 0; end; procedure TForm1.DataSetBeforePost(DataSet: TDataSet); begin if btnAceptar.Tag = 0 then // ¿ Post desactivado ? DataSet.Cancel; // si, cancelar end; procedure TForm1.btnAceptarClick(Sender: TObject); begin with DBGrid1.DataSource.DataSet do begin btnAceptar.Tag:= 1; // Post habilitado Edit; Post; btnAceptar.Tag:= 0; // Post desactivado end; end; ...

Si se me una mejor opción te comento.

Saludos. :)

gracias por el consejo pero el problema lo tengo creo yo en el evento OnCellClick del DBGrid. Desde un boton no tengo problema, el problema lo tengo cuando edito cualquier linea y clikeo en otra lo que yo pretendo es que cuando suceda eso, cancele cualquier modificación que se haya echo sin que se clike el botón cancelar.

ecfisa 30-03-2012 14:55:32

Hola.

Creo que no expresé bién la idea del código.

En el evento BeforePost se verifica el valor de la propiedad Tag del TButton y solamente guarda el registro si esta tiene el valor 1.
La propiedad Tag del TButton sólo puede tomar el valor 1 si se ejecuta el evento OnClick (btnGuardarClick) del TButton. En este procedimiento (btnGuardarClick) se pone btnGuardar.Tag a 1, se guarda el registro y se vuelve a poner en cero.
Dado que antes de guardar si o si se ejecuta el evento BeforePost y en este se impide almacenar si el valor de la propiedad Tag del boton es igual a cero, no se puede realizar esa acción por otro medio que no sea btnGuardarClick.

En resumidas cuentas, sólo se puede guardar mediante el btnGuardar.

Lo que sí noté ahora es que, habiendo empezado a editar un nuevo registro(línea) y hacer click sobre una celda anterior, copia el último en la cancelada, esto se soluciona agregando una línea:
Código Delphi [-]
procedure TForm1.DataSetBeforePost(DataSet: TDataSet);
begin
  if btnAceptar.Tag = 0 then  // ¿ Post desactivado ?
  begin
    DataSet.Cancel;  // si, cancelar
    Abort;  // <--- Esta línea.
  end;
end;

Saludos.

barakuda 31-03-2012 15:05:15

ecfisa te doy mil gracias en primer lugar por tu tiempo dedicado y en segundo lugar por que con esta solución e conocido el evento BeforePost y depaso a sacar utilidad a los Tag.

un saludo y gracias!!


La franja horaria es GMT +2. Ahora son las 07:33:00.

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