![]() |
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 |
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.
|
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:
Wenn du jetzt etwas in dem Grid änderst (bei Salary), wird automatisch sal2 verändert.
procedure TForm1.Table1CalcFields(DataSet: TDataSet);
begin Table1['sal2'] := Table1['Salary'] * 1.16; end; Genau so machst du es dann mit deiner Tabelle und deinen Feldern. Viel Spaß beim ausprobieren :hi: |
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 |
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; |
Re: Ereignisbehandlung im DBGrid
Das sieht gut aus - werde ich gleich morgen mal probieren
Heute geht nichts mehr. Danke schon mal. |
Re: Ereignisbehandlung im DBGrid
Schade, das geht leider nicht
Delphi-Quellcode:
da meckert mein Compiler Unbekannter Bezeichner 'OnChange'
var
Tmp: TNotifyEvent; //oder so begin Tmp := OnChange; OnChange := nil; if SelectedField = soundso then 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] |
Re: Ereignisbehandlung im DBGrid
So funktioniert die vorrübergehende Abschaltung! Allerdings musst du auch das Objekt für das OnChange angeben, also:
Delphi-Quellcode:
P.S.: Bitte benutz die Delphi-Tags!
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; |
Re: Ereignisbehandlung im DBGrid
Tut mir leid, aber das geht nicht.
Ich geb´s auf und mach das ganze anders. Trotzdem Danke |
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 07:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz