AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Ereignisbehandlung im DBGrid
Thema durchsuchen
Ansicht
Themen-Optionen

Ereignisbehandlung im DBGrid

Ein Thema von WFahrner · begonnen am 19. Jul 2004 · letzter Beitrag vom 23. Jul 2004
Antwort Antwort
Seite 1 von 2  1 2      
WFahrner

Registriert seit: 19. Jul 2004
Ort: Bremen
7 Beiträge
 
Delphi 5 Professional
 
#1

Ereignisbehandlung im DBGrid

  Alt 19. Jul 2004, 16:40
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
  Mit Zitat antworten Zitat
djmasi

Registriert seit: 9. Jun 2004
Ort: Leipzig
105 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Ereignisbehandlung im DBGrid

  Alt 19. Jul 2004, 18:34
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.
Thomas Maßmann
  Mit Zitat antworten Zitat
djmasi

Registriert seit: 9. Jun 2004
Ort: Leipzig
105 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Ereignisbehandlung im DBGrid

  Alt 19. Jul 2004, 18:59
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
Thomas Maßmann
  Mit Zitat antworten Zitat
WFahrner

Registriert seit: 19. Jul 2004
Ort: Bremen
7 Beiträge
 
Delphi 5 Professional
 
#4

Re: Ereignisbehandlung im DBGrid

  Alt 20. Jul 2004, 11:53
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
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

Re: Ereignisbehandlung im DBGrid

  Alt 20. Jul 2004, 12:03
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;
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
WFahrner

Registriert seit: 19. Jul 2004
Ort: Bremen
7 Beiträge
 
Delphi 5 Professional
 
#6

Re: Ereignisbehandlung im DBGrid

  Alt 20. Jul 2004, 14:43
Das sieht gut aus - werde ich gleich morgen mal probieren
Heute geht nichts mehr.

Danke schon mal.
  Mit Zitat antworten Zitat
WFahrner

Registriert seit: 19. Jul 2004
Ort: Bremen
7 Beiträge
 
Delphi 5 Professional
 
#7

Re: Ereignisbehandlung im DBGrid

  Alt 21. Jul 2004, 12:36
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]
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

Re: Ereignisbehandlung im DBGrid

  Alt 22. Jul 2004, 07:58
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!
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
WFahrner

Registriert seit: 19. Jul 2004
Ort: Bremen
7 Beiträge
 
Delphi 5 Professional
 
#9

Re: Ereignisbehandlung im DBGrid

  Alt 22. Jul 2004, 14:13
Tut mir leid, aber das geht nicht.
Ich geb´s auf und mach das ganze anders.
Trotzdem Danke
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#10

Re: Ereignisbehandlung im DBGrid

  Alt 22. Jul 2004, 14:15
Ach, was, das ist nicht schwer! Poste mal deinen Quelltext und die Fehlermeldung!
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:47 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