Pregunta

Me gustaría cambiar el comportamiento del botón de inserción en la barra de DBNavigator estándar, a partir de un conjunto de datos de inserción para anexar.

Me podría atrapar el clic de botón en caso BeforeAction, haga lo append, etc; y luego en el evento OnClick abortar la colocación de originales, pero esto parece un poco de un truco. Cualquier ideas mejores? Estoy usando D6 (500.000 kms en el reloj, y todavía va fuerte ...).

Gracias por cualquier consejo

Saludos,

philw.

¿Fue útil?

Solución

Se podría derivar su propia clase de TDBNavigator y reemplazar el método BtnClick. O, para una solución rápida y sucia, se puede cambiar del botón de insertar controlador de clic en tiempo de ejecución, por ejemplo:.

type
  THackDBNavigator = class(TDBNavigator);

procedure TForm1.DBNavigatorInsertClick(Sender: TObject);
var
  DBNavigator: TDBNavigator;
begin
  DBNavigator := ((Sender as TControl).Parent as TDBNavigator);
  if Assigned(DBNavigator.DataSource) and (DBNavigator.DataSource.State <> dsInactive) then
  begin
    if Assigned(DBNavigator.BeforeAction) then
      DBNavigator.BeforeAction(DBNavigator, nbInsert);

    DBNavigator.DataSource.DataSet.Append;

    if Assigned(DBNavigator.OnClick) then
      DBNavigator.OnClick(DBNavigator, nbInsert);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  THackDBNavigator(DBNavigator1).Buttons[nbInsert].OnClick := DBNavigatorInsertClick;
end;

Otros consejos

No hay ninguna diferencia en la mayoría de las bases de datos entre el inserto y anexar. Haciendo una inserción física real significaría mover realmente todos los datos, empezando por el lugar se inserta la nueva fila, hasta el tamaño de una fila, y luego escribir esa fila nueva en el lugar recién abierto. Esto sería muy lento debido a toda la actividad del disco.

Bases de datos en lugar de hacer un append, que escribe los datos al final del archivo físico y el orden del índice controla la forma en la fila parece estar posicionado en el lugar correcto en el archivo.

Así que para la mayoría de los efectos, es probable que ya conseguir un append en lugar de una inserción, sin importar el método que use o lo que el botón de la DBNavigator dice. Es el índice que hace que parezca lo contrario.

Puede comprobar que para la validez mediante la creación de una base de datos sin un índice, y tratar de hacer tanto una inserción y un append un par de veces, el examen de los datos cuidadosamente después de cada operación.

@TOndrej: Great! No había apreciado esta técnica. Gracias!

@Ken blanco: entiendo su punto, pero visualmente a mis usuarios se hace una diferencia - la DBNavigator controla un DBGrid, donde, en la mayoría de los casos, hay un montón de filas no utilizadas en la red. Parece ser más consistente para tener nuevos registros aparecen en la parte inferior de la parrilla en lugar de justo por encima de donde quiera que el registro actual es en ese momento. Pero gracias por su respuesta.

Saludos, Philw.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top