Delphi-PRAXiS
Seite 1 von 3  1 23   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   DBGrid Zeilen Wechsel (https://www.delphipraxis.net/177928-dbgrid-zeilen-wechsel.html)

Andidreas 6. Dez 2013 12:56

Datenbank: SQLite • Version: ... • Zugriff über: UniDac

DBGrid Zeilen Wechsel
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

in meinem DBGrid bekomm ich ja über die Ereignisse OnCellClick, OnKeyUp, OnMouseWheel mit ob sich die Zeile gewechselt hat...

Wenn jetzt aber ein User auf die ganz Linke Spalte klickt (wo keine Daten drin stehn [siehe Bild]) bekomm ich es nicht mit das sich die Zeile geändert hat...
Kann man das irgendwie abfangen, geht das über das TDBGrid oder muss ich von dem hinterlegtn Datasource oder Query ein Ereignis nehmen?

bcvs 6. Dez 2013 13:04

AW: DBGrid Zeilen Wechsel
 
Zitat:

Zitat von Andidreas (Beitrag 1238765)
oder muss ich von dem hinterlegtn Datasource oder Query ein Ereignis nehmen?

Ja, das wäre besser. Dafür nimmt man das OnAfterScroll des Query bzw. Table.

Dann ist es auch egal, wie der Benutzer die Zeile wechselt (Mausklick, Mauswheel, Tastatur).

Andidreas 6. Dez 2013 13:09

AW: DBGrid Zeilen Wechsel
 
Ok, den Klick auf den linken Rand des DBGrids bekomm ich dann auch mit?

Perlsau 6. Dez 2013 13:33

AW: DBGrid Zeilen Wechsel
 
Zitat:

Zitat von Andidreas (Beitrag 1238767)
Ok, den Klick auf den linken Rand des DBGrids bekomm ich dann auch mit?

AfterScroll bedeutet "nach dem Scrollen", Scroll bedeutet Bildlauf und rührt vom früher gebräuchlichen Drehen der Buchrolle bei antiken Büchern, die aufgerollt waren, her. Das Wechseln des Datensatzes (Scrolling, auch bekannt als Ändern des Datensatz-Zeigers) löst das Ereignis AfterScroll aus. Dabei ist es völlig egal, wie der Scrollvorgang ausgelöst wurde. Wenn der genannte Klick also zu einem Scrolling führt, dann wird AfterScroll ausgelöst.

PMM 6. Dez 2013 14:14

AW: DBGrid Zeilen Wechsel
 
Aber Vorsicht, bei OnScroll ist es, wie Perlsau sagte "völlig egal, wie der Scrollvorgang ausgelöst wurde". Die müssen somit gar nicht vom DBGrid kommen und das war eigentlich das was Andidreas wollte....

Perlsau 6. Dez 2013 16:05

AW: DBGrid Zeilen Wechsel
 
1. Da beim Klick auf die linke äußere Spalte, die gewöhnlich als Indikator für den Datensatzzeiger dient, offenbar kein OnClick-Ereignis auslöst, muß man zwangsläufig mit der Datenquelle arbeiten. @Andidreas: Überprüfe doch mal, ob nicht vielleicht ein OnChange oder was Ähnliches ausgelöst wird. Wäre meiner Ansicht aber dennoch der falsche Weg.

2. Wenn irgend eine andere Komponente einen Wechsel des Datensatz-Zeigers auslöst, wird das auch im DBGrid zu sehen sein, denn das reagiert ja darauf. Es ist Sache des Entwicklers, zu verhindern, daß andere Komponenten einen Datensatzwechsel durchführen, wenn das nicht gewünscht ist.

3. Will man dafür sorgen, daß bestimmte Befehle nur dann abgearbeitet werden, wenn der Datensatzwechsel vom DBGrid ausgelöst wurde, prüft man in der Ereignisbehandlung – was ich für richtiger halte – einfach auf DBGrid.Focused.

Andidreas 9. Dez 2013 10:47

AW: DBGrid Zeilen Wechsel
 
Das Problem habe ich gerade in einer DLL...
Die Query Komponente habe ich hier nicht auf der Form liegen, sondern die Komponente wird beim Start der DLL erstellt...

Code:
Delphi-Quellcode:
    If SQLiteFileConnection.Connected Then
    Begin
      SQLiteFile_Query1 := TUniQuery.Create(nil);
      SQLiteFile_Query1.Connection := SQLiteFileConnection;
      SQLiteFile_DisplayCommissions := TUniQuery.Create(nil);
      SQLiteFile_DisplayCommissions.Connection := SQLiteFileConnection;
    End;
Wie kann ich hier auf dieses Ereignis Abfragen?

sx2008 9. Dez 2013 11:19

AW: DBGrid Zeilen Wechsel
 
Zitat:

Zitat von Andidreas (Beitrag 1239070)
Das Problem habe ich gerade in einer DLL...
Die Query Komponente habe ich hier nicht auf der Form liegen, sondern die Komponente wird beim Start der DLL erstellt...

Du weisst aber dass eine normale DLL keine objektorientierte Schnittstelle hat?!
Deshalb kann man Delphi-Events nicht über eine DLL-Grenze transportieren.
(Man kan evtl. schon, aber mit so hohem Aufwand und hässlichem Rumgemache dass es keinen Sinn ergibt)

Eine Anwendung besteht aus Code der sich häufig ändert (die Businesslogik) und Code der sich fast nie ändert (z.B. irgendwelche Bibliotheken).
Einer der größten Fehler den man in Delphi machen kann ist die Businesslogik aufzutrennen und in Exe und DLLs zu splitten.
In C# sieht das ganz anderst aus, aber in Delphi wird man damit nicht glücklich.

Ich versuch das mal mit einer Analogie zu verdeutlichen:
Stell dir vor du hast eine Elektronikplatine mit vielen Bauteilen und sägst sie mitten auseinander.
Die beiden Teilplatinen werden nun durch einzelne dünne Kabel mit 1 Meter Länge verbunden.
Ok, die Gesamtelektronik funktioniert noch ist aber viel teurer geworden.
Jetzt soll die elektronische Schaltung erweitert werden und so werden die vielen Leitungsverbindungen zur echten Falle.

Und jetzt vergleiche das mal mit einem PC-Motherboard und ihren PCI-Steckplätzen.
Die PCI-Schnittstelle ist genormt und nur deshalb funktioniert das Stecksystem.

Und daher: niemals die Businesslogik auseinandereisen wenn es nicht von der Programmiersprache perfekt unterstützt wird oder grundsätzlich eine Multi-Tier-Anwendung entstehen soll.

Andidreas 9. Dez 2013 11:30

AW: DBGrid Zeilen Wechsel
 
Ich weiß nicht ob ich das richtig rübergebracht habe...

Ich möchte nicht das Event von einer Exe in eine DLL transportieren!
Ich habe eine DLL die eine komplette eigenständige Funktion abdeckt... nehmen wir als Beispiel eine User Verwaltung für eine Software...
D.h. Ich hole mir in der DLL die Daten, zeige sie an und möchte sie dort auch verändern können...

Damit ich jetzt genau weiß auf welchem User ich sitze möchte ich das AfterScroll Ereigniss verwenden...

Die Query Komponente erstelle ich deshalb dynamisch, da die diversen DB Verbindungen von der Exe an die DLL mit übergeben werden!

baumina 9. Dez 2013 11:34

AW: DBGrid Zeilen Wechsel
 
Du musst das Event einfach nur zuweisen ADataset.AfterScroll := xxprocedure und die Procedure dann schreiben xxprocedure(Sender : TDataset)


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:45 Uhr.
Seite 1 von 3  1 23   

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