Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Ereignisbehandlung im DBGrid (https://www.delphipraxis.net/26168-ereignisbehandlung-im-dbgrid.html)

WFahrner 19. Jul 2004 16:40


Ereignisbehandlung im DBGrid
 
Hallo miteinander,
vielleicht kann mir jemand helfen?
Folgends Proble:
ich möchte in einem DBGrid den Wert eines Feldes ändern, falls der Anwender ein anderes Feld geändert hat.
z.B. Artikel.DB
Anzahl | Bezeichnung | Nettopreis | Bruttopreis
wird Nettopreis geändert möchte ich den Bruttopreis ausrechnen und eintragen.
wird Bruttopreis geändert - dann Nettopreis ausrechnen und eintragen.

Wie stelle ich fest in welchem Feld der Anwender ist?
OnChange geht nicht - die rufen sich gegenseitig auf, OnValidate genauso.

Ich muss noch erwähnen das ich Delphi Anfänger bin - bislang habe ich Datenbanken mit Paradox ObjektPal realisiert - da gibt es ein DepartField Ereignis mit dem ist das kein Problem. Bei Delphi finde ich eine Entsprechung nur bei DBEdit aber nicht bei DBGrid - übersehe ich da was?

Vielen Dank schon mal für jeden Tipp und
freundliche Grüße aus Bremen

Werner Fahrner

djmasi 19. Jul 2004 18:34

Re: Ereignisbehandlung im DBGrid
 
Wahrscheinlich wirst du mit den Komponenten TTable oder TQuery arbeiten. Schau da mal in den Ereignissen (z.B. OnBeforePost, OnAfterPost,...). Das Grid ist ja "nur" eine Visualisierung deiner Daten. Berechnungen werden aber in den Verbindungskomponenten, z.B. TTable, durchgeführt.

djmasi 19. Jul 2004 18:59

Re: Ereignisbehandlung im DBGrid
 
So hab dir mal was zusammengestellt zum testen:

Also du setzt ein DBGrid, einen DBNavigator, eine DataSource und eine Table auf dein Formular. Verbinde die Komponenten wie gewohnt miteinander. Ich habe dann in der Table1 folgendes eingestellt:
DatabaseName: DBDEMOS
Table: employee.db

Du aktivierst die Table und fügst im Feldeditor der Table1 (einmal rechtsclick) erst alle Felder hinzu (um zu sehen was du hast) und danach ein neues Feld. Habe dies sal2 genannt und dem Typ Currency zugeordnet. In dem OnCalcFields-Ereignis der Table habe ich folgenden Code eingefügt:
Delphi-Quellcode:
procedure TForm1.Table1CalcFields(DataSet: TDataSet);
begin
  Table1['sal2'] := Table1['Salary'] * 1.16;
end;
Wenn du jetzt etwas in dem Grid änderst (bei Salary), wird automatisch sal2 verändert.

Genau so machst du es dann mit deiner Tabelle und deinen Feldern.

Viel Spaß beim ausprobieren :hi:

WFahrner 20. Jul 2004 11:53

Re: Ereignisbehandlung im DBGrid
 
Danke für die schnelle Antwort,
das geht wunderbar, aber das ist leider nicht das Problem.

Der Anwender kann einen Bruttobetrag ODER einen Nettobetrag eingeben. Ich muss also feststellen ob wie im Beispiel Table1['sal1'] ODER Table1['sal2'] geändert wurde damit ich z.B. schreiben könnte

if (Bruttofeld geändert) then
table1['sal1'] := table1['salary'] * 1.16
else
table1['sal2'] := table1['salary'] / 1.16

oder so ähnlich - ich Seh einfach keine Möglichkeit festzustellen welches Feld geändert wurde.

OnChange geht nicht weil ich müsste ja bei table1['sal1'] und table1['sal2'] prüfen - und sobald ich dem jeweils anderen Feld einen Wert zuweise wird OnChange für dieses Feld aufgerufen - das geht dann solange bis der Speicher platzt.
Ausserdem ist OnCalcFields nicht so toll, das wird nämlich eigentlich bei fast jeder Anwenderaktion ausgelöst. Wenn im Grid viel geändert wird bremst das ganz schön.

irgend eine andere Idee?

schöne Grüße aus Bremen

Werner Fahrner

Stevie 20. Jul 2004 12:03

Re: Ereignisbehandlung im DBGrid
 
Delphi-Quellcode:
var
  Tmp: TNotifyEvent; //oder so
begin
  Tmp := OnChange;
  OnChange := nil;
  if SelectedField = soundso then
    table1['sal1'] := table1['salary'] * 1.16 
  else
   table1['sal2'] := table1['salary'] / 1.16;
  OnChange := Tmp;
end;

WFahrner 20. Jul 2004 14:43

Re: Ereignisbehandlung im DBGrid
 
Das sieht gut aus - werde ich gleich morgen mal probieren
Heute geht nichts mehr.

Danke schon mal.

WFahrner 21. Jul 2004 12:36

Re: Ereignisbehandlung im DBGrid
 
Schade, das geht leider nicht
Delphi-Quellcode:
var
  Tmp: TNotifyEvent; //oder so
begin
  Tmp := OnChange;
  OnChange := nil;
  if SelectedField = soundso then
da meckert mein Compiler Unbekannter Bezeichner 'OnChange'

es müsste eine Möglichkeit geben ein Ereignis vorübergehend auszuschalten, dann wäre das ganz einfach. Vermutlich geht das auch, aber in der Delphi Hilfe komme ich einfach nicht weiter.

Noch irgend eine Idee?

Schöne Grüße aus Bremen

WF

[edit=Sharky]Delphi-Tags gesetzt. Mfg, Sharky[/edit]

Stevie 22. Jul 2004 07:58

Re: Ereignisbehandlung im DBGrid
 
So funktioniert die vorrübergehende Abschaltung! Allerdings musst du auch das Objekt für das OnChange angeben, also:
Delphi-Quellcode:
procedure TForm1.Table1CalcFields(DataSet: TDataSet);
var
  Tmp: TNotifyEvent;
begin
  if Table1.SelectedField = soundso then
    with Table1.FieldByName('sal1') do
    begin
      Tmp := OnChange;
      OnChange := nil;
      Value := Table1.FieldValues['salary'] * 1.16;
      OnChange := Tmp;
    end
  else
    with Table1.FieldByName('sal2') do
    begin
      Tmp := OnChange;
      OnChange := nil;
      Value := Table1.FieldValues['salary'] / 1.16;
      OnChange := Tmp;
    end;
end;
P.S.: Bitte benutz die Delphi-Tags!

WFahrner 22. Jul 2004 14:13

Re: Ereignisbehandlung im DBGrid
 
Tut mir leid, aber das geht nicht.
Ich geb´s auf und mach das ganze anders.
Trotzdem Danke

Stevie 22. Jul 2004 14:15

Re: Ereignisbehandlung im DBGrid
 
Ach, was, das ist nicht schwer! Poste mal deinen Quelltext und die Fehlermeldung!


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:43 Uhr.
Seite 1 von 2  1 2      

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