Hi NG.
Delphi 4 (update 3), Apollo
VCL 5.1
Ich lasse mir in einem Grid gefilterte Records einer dbase Tabelle anzeigen - genauer gesagt: gefiltert mittels Scope. Ich habe einige DBEdits und einen DBNavigator mit der Tabelle verknüpft, um die Records bearbeiten zu können. Der User wählt sich aus dem Grid den Record aus, den er bearbeiten möchte. Per Klick auf nbEdit des DBNavigators werden die DBEdits enabled, so dass der User dort auch etwas ändern kann und anschließend mit nbPost oder nbCancel des DBNavigators dies abschließt.
Soweit nichts besonderes.
Ich möchte allerdings, dass der User nur bestimmte Records ändern kann. Dazu soll bei einem bestimmten Wert im Record der DBNavigator einfach disabled werden. Dazu verwende ich das OnDrawColumnCell-Ereignis des (BFC_)DBGrids.
Delphi-Quellcode:
procedure TFBestellungen.BFC_DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
begin
with (Sender as TBFC_DBGrid) do
begin
if FData.tWAZU.fieldbyname('status').asboolean
then DBNavigator1.enabled := false
else DBNavigator1.enabled := true;
DefaultDrawColumnCell(rect, DataCol, Column, State);
end;
end;
Leider funktioniert das nicht ganz so wie gewünscht. Bewege ich mich kreuz und quer per Maus oder beliebig hoch und runter per Pfeiltasten durch das Grid, so passiert es, dass das Enablen bzw. Disablen erst nach dem zweiten Tastendruck geschaltet wird. Damit meine ich: Liegen zwei unterschiedliche Datensätze (fürs enablen bzw. disablen) neben einander und wechsle ich per Tastendruck (Mausklick) von dem 'Enable'-Satz in den benachbarten 'Disable'-Satz, so bleibt der DBNavigator noch enabled. Erst wenn ich mit einem zweiten Tastendruck mich nach rechts oder links in der gleichen 'Disable'-Zeile bewege (oder in eine nächste 'Disable'-Zeile wechsle), wird der DBNavigator disabled.
Was mache ich falsch?
Wahrscheinlich geht es mit einem anderen Ansatz einfacher. Und zwar, indem ich nicht das OnDrawColumnCell-Ereignis des Grids verwende, sondern mit den DBNavigator-Ereignissen BeforeAction und OnClick arbeiten. Nur leider habe ich dazu, noch keine Lösung gefunden. Meine Idee ist, dass ich im BeforeAction-Ereignis, die geklickten Knopf ändere. Leider funktioniert das aber nicht und das OnClick-Ereignis wird trotzdem abgearbeitet.
Delphi-Quellcode:
procedure TFBestellungen.DBNavigator1BeforeAction(Sender: TObject;
Button: TNavigateBtn);
begin
if (Button = nbEdit) then Button := nbCancel;
end;
Was mache ich hier falsch?
Gruß,
Peter