Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Event bei Zeilenwechsel einer DataSource (https://www.delphipraxis.net/178803-event-bei-zeilenwechsel-einer-datasource.html)

LoewenZahn 28. Jan 2014 16:02

Event bei Zeilenwechsel einer DataSource
 
Hallo,

ich bin mir so sicher, dass dieses Thema bereits bearbeitet wurde. Trotzdem finde ich selbst leider keine Lösung und hoffe daher hier ein paar Tipps zu finden.

IST:
Ich habe eine Query mit mehreren Datensätzen. Die Ergebnismenge wird mit einem Grid dargestellt. Die Datensätze werden im Programm abgerufen, geändert, gelöscht oder um weitere Daten und Datensätze ergänzt. Die Datenmengen werden normal mit Tastatur und Maus gesteuert.

SOLL:
Nur wenn ich einen Datensatz wechsle, soll ein Event gestartet werden.

Dieses Event ist etwas größer, daher kann ich es nicht bei jeder kleinen Änderung, also OnDataChange, aufrufen. Daher habe ich gedacht, dass ich mit dem DataSource.State in [dsBrowse] richtig wäre, leider scheint dies nicht der Fall zu sein. Ich glaube es ist die richtige Richtung, leider habe ich mich bereits im tiefen Jungle von Delphi verirrt.

Warum gibt es nicht einfach ein Event wie OnRowChange im TDataSource?


Dankbar über jede Anmerkung
L.

Sir Rufo 28. Jan 2014 16:04

AW: Event bei Zeilenwechsel einer DataSource
 
Eventuell sowas?
Delphi-Referenz durchsuchenTDataset.BeforeScroll
Delphi-Referenz durchsuchenTDataSet.AfterScroll

Ja, so eine Doku kann schon schön sein ...

himitsu 28. Jan 2014 17:04

AW: Event bei Zeilenwechsel einer DataSource
 
Und natürlich hat auch die DataSource ein passendes Event. (OnStateChange und/oder OnUpdateData reagieren auch auf sowas)

Oder man hängt einen DataLink an die DataSource und verwendet dann dessen Events.

Bei Grids kann man sich oftmals an den DataController hängen, welche derartige Events bietet.

LoewenZahn 29. Jan 2014 07:23

AW: Event bei Zeilenwechsel einer DataSource
 
Hallo und danke für die bisherigen Antworten!

Die Kombination aus Anfänger und Delphi 2007 zeigt leider, dass ich kein TDataset habe. Mein Fehler, die Version oder meinen Intelligenzgrad nicht anzugeben.

Den Lösungshinweis das ganze über OnStateChange zu realisieren habe ich schon im Internet gelesen. Allerdings nur den Hinweis. Was passiert aber wenn ich nur durch die Zeilen wechsle? Bleibt die Datasource nicht im State dsBrowse (folglich kein OnChangeEvent)?

Werde mich weiterhin damit beschäftigen und meine Fühler noch tiefer in das www graben.


Gruß

Angel4585 29. Jan 2014 07:32

AW: Event bei Zeilenwechsel einer DataSource
 
Mit der TDataSource allein kannst du ja nicht auf eine Datenbank zugreifen.
Das macht afaik immer ein TDataSet. Die TDataSource bereitet die Daten eines TDataSet dann nur so auf, dass sie in der GUI dargestellt werden können.
D.h. man muss zwingend eine Form von TDataSet haben.
Ob das jetzt ein TTable, ein TQuery, ein TZQuery, ein TClientDataSet oder sonst was ist, spielt dabei keine Rolle, da diese alle in irgend einer Weise von TDataSet erben.

Ich würde dann das von Sir Rufo erwähnte AfterScroll bzw. BeforeScroll verwenden.

Sir Rufo 29. Jan 2014 07:33

AW: Event bei Zeilenwechsel einer DataSource
 
Wenn du eine DataSource hast, dann hast du auch ein DataSet, denn die DataSource ist die Brücke zwischen den DBControls (DBGrid, DBEdit, etc.) und einem DataSet.

Die Eigenschaft bei der DataSource heißt zufällig auch DataSet und erwartet etwas vom Typ TDataSet ;)

LoewenZahn 29. Jan 2014 08:33

AW: Event bei Zeilenwechsel einer DataSource
 
Hallo,

danke jetzt habe ich es verstanden :thumb:

Ich hatte es gerade selbst mit einer anderen Methode gelöst, werde aber wohl auf die Scoll-Events umsatteln.

Selbst hatte ich im OnDataChange der TDataSource, eine Abfrage des .State genutzt. Hinzukommend musste ich um einen Datensatzwechsel zu bemerken, stets die zuletzt angewählte ZeilenNr merken.
Code:
procedure Tfbestelldetails.ds_archivDataChange(Sender: TObject; Field: TField);
begin
  if (ds_archiv.State in [dsBrowse]) and (selected_row <> query_archiv.RecNo) then
  begin
    selected_row := query_archiv.RecNo;
    ...
  end;
end;
Da man jedoch, wie ich es bereits ein paar mal in diesem Forum gelesen habe, globale Variablen vermeiden sollte, wäre die .AfterScroll Variante eine bessere.

Ich bedanke mich für jegliche Hilfe und hoffe das auch dem einem oder anderem ebenfalls geholfen sein wird.

Gruß

Jumpy 29. Jan 2014 09:12

AW: Event bei Zeilenwechsel einer DataSource
 
Da das abarbeiten deines Events nach deiner Aussage etwas länger dauert:

Ich hab das auch mal gebraucht und hatte dann immer Probleme, wenn der Nutzer mit den Pfeiltasten ganz schnell durch meine Daten gelaufen ist. Da hab ich dann in dem Event immer einen Timer gestartet für ein paar Millisekunden und dieser hat dann erst die eigentliche Funktion gestartet.
Wurde zwischenzeitlich zu einem weitereren Datensatz gewechselt wurde der Timer neu gestartet.

Ich hab übrigens genau wie du DataChange usw. benutzt. Kann es sein das es AfterScroll usw. in D6 noch nicht gab und ich mir das daher so angewöhnt habe?

LoewenZahn 30. Jan 2014 08:12

AW: Event bei Zeilenwechsel einer DataSource
 
Hallo Jumpy,

danke für deinen Hinweis, die Idee mit dem Timer werde ich vll auch einsetzen. Das würde mir einige unnütze SQL-Abfragen ersparen.

Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:31 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