2009-02-11 25 views
6

Me gustaría cambiar el comportamiento del botón de inserción en la barra de DBNavigator estándar, desde un conjunto de datos para agregar.¿Cómo cambiar el comportamiento del componente TDBNavigator?

Podría atrapar el botón hacer clic en el evento BeforeAction, hacer el apéndice, etc; y luego, en el evento OnClick, cancela la inserción original, pero parece un truco. Alguna mejor idea? Estoy usando D6 (500,000 kms en el reloj, y todavía estoy fuerte ...).

Gracias por cualquier consejo

Saludos,

philw.

Respuesta

10

Puede obtener su propia clase de TDBNavigator y anular el método BtnClick. O, para una solución rápida y sucia, puede cambiar el botón de inserción 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; 
+0

En Lazarus, utilizando en FormCreate THackDBNavigator (myDBNavigator) .Buttons [nbInsert] .OnClick: = DBNavigatorInsertClick; Tengo un mensaje de error: Error: Número incorrecto de parámetros especificados para llamar a "DBNavigatorInsertClick". ¿Algún consejo? – jcfaria

+0

Con Lazarus, use '{$ mode delphi}' o el operador '@': 'THackDBNavigator (DBNavigator1) .Buttons [nbInsert] .OnClick: = @DBNavigatorInsertClick;' –

+0

¡Funciona! Gracias. – jcfaria

1

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

Las bases de datos en su lugar hacen un apéndice, que escribe los datos al final del archivo físico, y el orden de índice controla la forma en que la fila parece posicionarse en el lugar correcto en el archivo.

Por lo tanto, para la mayoría de los propósitos, probablemente ya esté recibiendo un apéndice en lugar de un inserto, independientemente del método que utilice o de lo que diga el botón del DBNavigator. Es el índice que lo hace aparecer de otra manera.

Puede verificar esa validez creando una base de datos sin índice, e intente hacer una inserción y un apéndice varias veces, examinando los datos cuidadosamente después de cada operación.

+0

Si utiliza un componente de cuadrícula para insertar/anexar sus datos, definitivamente hay una diferencia entre los dos, al menos desde el punto de vista de la interfaz de usuario. – onnodb

+0

Pero eso se debe a que en realidad no se está insertando en la base de datos, sino en la cuadrícula. Todavía es solo un anexo al DB físicamente. –

0

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

@Ken White: entiendo su punto, pero visualmente para mis usuarios hace una diferencia: el DBNavigator controla un DBGrid donde, en la mayoría de los casos, hay muchas filas sin usar en la cuadrícula. Parece ser más consistente que aparezcan nuevos registros en la parte inferior de la cuadrícula en lugar de justo arriba, dondequiera que esté el registro actual en ese momento. Pero gracias por tu respuesta.

Saludos, PhilW.

+0

Phil, no mencionó nada acerca de un DBGrid en su pregunta. En ese caso, la respuesta * de TOndrej es * mejor debido al problema de apariencia. –

Cuestiones relacionadas