2009-02-11 16 views
6

Vorrei modificare il comportamento del pulsante di inserimento sulla barra standard di DBNavigator, da inserire in un set di dati.Come modificare il comportamento del componente TDBNavigator?

Potrei intrappolare il clic del pulsante nell'evento BeforeAction, fare l'append, ecc; e poi nell'evento OnClick interrompere l'inserimento originale, ma questo sembra un po 'un trucco. Qualche idea migliore? Sto usando D6 (500.000 km sull'orologio, e continuo ad andare forte ...).

Grazie per qualsiasi consiglio

saluti,

PhilW.

risposta

10

È possibile derivare la propria classe da TDBNavigator e sovrascrivere il metodo BtnClick. Oppure, per una soluzione rapida e sporca, si potrebbe cambiare gestore click del pulsante di inserimento in fase di esecuzione, ad es .:

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

In Lazarus, utilizzando FormCreate THackDBNavigator (myDBNavigator). Pulsanti [nbInsert] .OnClick: = DBNavigatorInsertClick; Ho un messaggio di errore: Errore: numero errato di parametri specificati per la chiamata a "DBNavigatorInsertClick". Qualche consiglio? – jcfaria

+0

Con Lazarus, si usi '{$ mode delphi}' o l'operatore '@': 'THackDBNavigator (DBNavigator1) .Button [nbInsert] .OnClick: = @DBNavigatorInsertClick;' –

+0

Funziona! Grazie. – jcfaria

1

Non v'è alcuna differenza nella maggior parte dei database tra l'inserto e aggiungere. Fare un inserto fisico effettivo significherebbe in realtà spostare tutti i dati, iniziando dal punto in cui la nuova riga verrebbe inserita, ridimensionando le dimensioni di una riga e quindi scrivendo quella nuova riga nel punto appena aperto. Questo sarebbe molto lento a causa di tutta l'attività del disco.

I database invece fanno un'append, che scrive i dati alla fine del file fisico e l'ordine dell'indice controlla il modo in cui la riga sembra essere posizionata nella posizione corretta nel file.

Quindi, per la maggior parte degli scopi, probabilmente stai già ricevendo un'appendice invece di un inserto, indipendentemente dal metodo utilizzato o dal pulsante di DBNavigator. È l'indice che lo fa apparire diversamente.

È possibile verificarlo per validità creando un database senza un indice e provare a eseguire un inserimento e un'aggiunta un paio di volte, esaminando attentamente i dati dopo ogni operazione.

+0

Se si utilizza un componente di griglia per inserire/aggiungere i dati, c'è sicuramente una differenza tra i due, almeno dal punto di vista dell'interfaccia utente. – onnodb

+0

Ma è perché non si sta effettivamente inserendo nel database, ma nella griglia. È ancora solo un'appendice al DB fisicamente. –

0

@TOndrej: Ottimo! Non avevo apprezzato questa tecnica. Grazie!

@Ken White: Capisco il tuo punto, ma visivamente ai miei utenti fa la differenza: il DBNavigator controlla un DBGrid dove, nella maggior parte dei casi, ci sono molte righe inutilizzate nella griglia. Sembra essere più coerente avere nuovi record nella parte inferiore della griglia piuttosto che appena sopra il punto in cui il record attuale si trova in quel momento. Ma grazie per la tua risposta.

Cordiali saluti, PhilW.

+0

Phil, non hai menzionato nulla su un DBGrid nella tua domanda. In tal caso, la risposta di TOndrej * è * migliore a causa del problema dell'aspetto. –

Problemi correlati