2009-02-11 10 views
6

Chciałbym zmienić zachowanie przycisku wstawiania na standardowym pasku DBNavigator, z wstawki zestawu danych do dołączenia.Jak zmienić zachowanie komponentu TDBNavigator?

Mogę przechwycić kliknięcie przycisku w zdarzeniu BeforeAction, zrobić załącznik, itp .; a następnie w zdarzeniu OnClick przerwać oryginalną wstawkę, ale wydaje się to trochę hack. Jakieś lepsze pomysły? Używam D6 (500 000 km na zegarze, i wciąż mam siłę ...).

Dzięki za wszelkie rady

Pozdrawiam,

PhilW.

Odpowiedz

10

Można wyprowadzić własną klasę z TDBNavigator i zastąpić metodę BtnClick. Albo, dla szybkiego i brudne fix, można zmienić kliknij przycisk Wstaw obsługi w czasie wykonywania, np .:

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

W Lazarus, używając FormCreate THackDBNavigator (myDBNavigator) .Buttons [nbInsert] .OnClick: = DBNavigatorInsertClick; Mam komunikat o błędzie: Błąd: wprowadzono niepoprawną liczbę parametrów dla wywołania do "DBNavigatorInsertClick". Dowolna wskazówka? – jcfaria

+0

Używając Lazarus, użyj polecenia '{$ mode delphi}' lub operatora '@': THackDBNavigator (DBNavigator1) .Buttons [nbInsert] .OnClick: = @DBNavigatorInsertClick; ' –

+0

Działa! Dzięki. – jcfaria

1

Nie ma różnicy w większości baz danych pomiędzy wkładką i dołączyć. Wykonanie rzeczywistej wkładki fizycznej oznaczałoby rzeczywiste przeniesienie wszystkich danych, zaczynając od miejsca, w którym nowy wiersz zostanie wstawiony, w dół o rozmiar jednego rzędu, a następnie zapisując ten nowy wiersz w nowo otwartym miejscu. Byłoby to bardzo powolne ze względu na całą aktywność dysku.

Bazy danych zamiast tego zawierają załącznik, który zapisuje dane na końcu pliku fizycznego, a kolejność indeksu kontroluje sposób wyświetlania wiersza w odpowiednim miejscu w pliku.

Tak więc dla większości celów i celów, prawdopodobnie już dostajesz załącznik zamiast wstawki, niezależnie od tego, z której metody korzystasz lub jaki przycisk w DBNavigator mówi. To indeks sprawia, że ​​wygląda inaczej.

Można sprawdzić, czy dla ważności, tworząc bazę danych bez indeksu, i spróbować kilka razy wstawić i dopisać, dokładnie sprawdzając dane po każdej operacji.

+0

Jeśli używasz komponentu siatki do wstawiania/dołączania danych, z pewnością istnieje różnica między nimi, przynajmniej z punktu widzenia interfejsu użytkownika. – onnodb

+0

Ale to dlatego, że nie jest to faktycznie wstawianie do bazy danych, ale zamiast tego siatka. Wciąż jest to tylko dodatek do DB fizycznie. –

0

@TOndrej: Świetnie! Nie doceniałem tej techniki. Dzięki!

@Ken White: Rozumiem twój punkt, ale wizualnie dla moich użytkowników to robi różnicę - DBNavigator kontroluje DBGrid, gdzie w większości przypadków jest mnóstwo nieużywanych wierszy w siatce. Wydaje się, że bardziej spójne jest, aby nowe zapisy pojawiły się na dole siatki, a następnie tuż nad miejscem, w którym obecnie znajduje się aktualny rekord. Ale dziękuję za odpowiedź.

Pozdrawiam, PhilW.

+0

Phil, nie wspomniałeś nic o DBGrid w twoim pytaniu. W takim przypadku odpowiedź TOndreja * jest * lepsza z powodu problemu z wyglądem. –