Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Grid.OnDrawColumnCell reagiert manchmal mit Verzögerung (https://www.delphipraxis.net/85890-grid-ondrawcolumncell-reagiert-manchmal-mit-verzoegerung.html)

PASST 6. Feb 2007 15:36

Datenbank: dbase • Version: 3 • Zugriff über: Apollo VCL

Grid.OnDrawColumnCell reagiert manchmal mit Verzögerung
 
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

shmia 6. Feb 2007 15:52

Re: Grid.OnDrawColumnCell reagiert manchmal mit Verzögerung
 
Du manipulierst den DBNavigator an der falschen Stelle.
Das Event OnDrawColumnCell ist dazu völlig ungeeignet.
Du musst das Event [Tdataset].AfterScroll verwenden.

PASST 7. Feb 2007 08:17

Re: Grid.OnDrawColumnCell reagiert manchmal mit Verzögerung
 
danke, das wars.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz