Ver Mensaje Individual
  #12  
Antiguo 02-02-2011
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Reputación: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Al, yo he hecho la prueba con delphi 2007.
Afectivamente, acabo de comprobar que esto también sucede en Delphi 2007y ocurre tanto con registros en edición (dsEdit) como en inserción (dsInsert).

Además, no sólo se trata de un efecto visual, sino que el campo que adquiere el foco recibe el mismo texto que se capturó en la otra celda. De tal suerte que si se captura "abc" en un campo alfanumérico y nos pasamos a un campo numérico para, acto seguido, dar el clic en la zona vacía, ocurre la excepción típica de que el dato no puede ser asignado.

Según he podido examinar con la pila de llamadas (Call Stack) del depurador de Delphi, existe una pequeña diferencia entre el código fuente del método TCustomDBGrid.MouseDown (unidad DBGrids.pas) de la versión 7 y el de la versión 2007, y dicha diferencia es la causa del problema.

Declaración del método:
Código Delphi [-]
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer); override;  // Afortunadamente es virtual 

Parte de su implementación en Delphi 7:
Código Delphi [-]
  Cell := MouseCoord(X, Y);
  if (Cell.X < 0) and (Cell.Y < 0) then
  begin
    inherited MouseDown(Button, Shift, X, Y);
    Exit;
  end;

La misma parte en Delphi 2007:
Código Delphi [-]
  Cell := MouseCoord(X, Y);
  if (Cell.X < 0) and (Cell.Y < 0) then
  begin
    if (FDataLink <> nil) and (FDataLink.Editing) then
      UpdateData;
    inherited MouseDown(Button, Shift, X, Y);
    Exit;
  end;

A simple vista no parece haber razón para que hayan agregado ese par de líneas, pero felizmente MouseDown es un método virtual que puede ser redefinido en una clase derivada de TDBGrid (ya sea registrada o simplemente interpuesta).

Cuando un método no se comporta como queremos y es virtual, existen muchas posibilidades de adaptar ese comportamiento a nuestras necesidades. Pero antes de hacer cualquier cosa sería bueno investigar qué razón tuvo CodeGear para agregar ese par de líneas.

Regresaré luego, apoyen este caso.

Al González.
Responder Con Cita