[GELÖST] Ereignis Datensatzwechsel

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
sierdolg
Beiträge: 66
Registriert: Mi 24. Okt 2012, 15:50

[GELÖST] Ereignis Datensatzwechsel

Beitrag von sierdolg »

Hallo beisammen,

hier steht mal wieder einer auf dem berühmten Schlauch:

Eine kleine Anwendung dient zur Verwaltung/Protokollierung von Softwareinstallationen auf diversen Windows-Rechnern. Auf dem ersten von zwei Tabsheets zeigt sie eine tabellarische Übersicht der installierten Anwendungen und ihrer Versionen in einem DBGrid. Auf dem zweiten Sheet findet sich zum Hinzufügen weiterer Versionen die Versionshistorie der auf dem ersten Tab gerade aktivierten Software. Die Daten stecken bzw. landen via UNC-Pfad in einer sqlite3-Datenbank auf dem Fileserver, wo auch die diversen Installationspakete vorgehalten werden. Angebunden ist es über die ZEOS-Komponenten, laufen tut's auf Windows 8.1 64bit.

So weit, so gut. Ich wollte nun noch die Caption von TabSheet2 bei jedem Datensatzwechsel der Softwaretabelle entsprechend ändern, um dort etwas wie 'Versionen von '+DBEditSoftwareName.Text anzeigen zu lassen. Auf der Suche nach dem passenden Ereignistyp glaubte ich bei .DataSource.Dataset.AfterScroll richtig zu liegen, doch - o Wunder - wird das augenscheinlich NIE ausgelöst, und wenn man im DBGrid noch so munter scrollt.

Als nächstes habe ich .BeforeScroll versucht (auch wenn das vermutlich keinen Sinn macht): trage ich hier ein ShowMessage('blablubb'); ein, kompiliert es zwar und läßt sich auch starten, aber das Programmfenster wird gar nicht mehr angezeigt!

Das .AfterScroll der Datasource im DataModule als Stelle, wo ich zuallerst die Ereignisprozedur eintragen wollte, dürfte ja nicht nutzbar sein, weil ein "uses Form1" in dieser Unit eine zirkuläre Referenz erzeugen würde und man anderenfalls wohl auf die visuellen Komponenten von Form1 nicht zugreifen kann.

Füge ich in den Uses-Abschnitt des Datenmoduls "Dialogs" ein, so hindert ein

Code: Alles auswählen

procedure Tdm1.zqUebersichtAfterScroll(DataSet: TDataSet);
begin
  ShowMessage('zqUebersichtAfterScroll');
end;
das Programm auch dauerhaft am Zeichnen des Fensters.

Der Laie staunt, der Fachmann kommt ins Grübeln?

Hat jemand eine Idee, wie man die "Ereignisbehanlung Datensatzwechsel" anders besser lösen kann oder wie man das AfterScroll-Ereignis doch ausgelöst bekommt?
Zuletzt geändert von Lori am Do 20. Feb 2014, 16:19, insgesamt 2-mal geändert.
Grund: Highlighter

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Ereignis Datensatzwechsel

Beitrag von hde »

Hast du denn TDatasorce.OnDataChange mal probiertß
hde

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Ereignis Datensatzwechsel

Beitrag von Christian »

OnDataChange wird nur aufgerufen wenn sich Daten in einem Field ändern (wie der Name schon vermuten lässt)
AfterScroll ist schon richtig und wird bei zeos definitiv aufgerufen. Ich vermute mal du hast DisableControls vorher benutzt.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Ereignis Datensatzwechsel

Beitrag von hde »

@Christian,
OnDataChange wird zwar aufgerufen wenn sich Datenfelder ändern, aber die ändern sich auch wenn der aktuelle Datensatz wechselt, also auch beim Scrollen.
hde

sierdolg
Beiträge: 66
Registriert: Mi 24. Okt 2012, 15:50

Re: Ereignis Datensatzwechsel

Beitrag von sierdolg »

Vielen Dank Euch beiden für die interessanten Hinweise!

DisableControls: Ich ahnte schon, daß es sowas geben könnte (analog zum TForm.KeyPreview). Jetzt nachdem ich weiß, wie es heißt, finde ich es trotzdem nicht, insbesondere nicht als Eigenschaft des Datasets, was mir die Suche nahelegt (http://www.lazarusforum.de/viewtopic.ph ... 4&start=15).

OnDataChange: Habe ich eben ausprobiert.

Code: Alles auswählen

procedure TFormLabSoft.dsUebersichtDataChange(Sender: TObject; Field: TField);
begin
  MemoLog.Append('Event dsUebersichtDataChange!');
end;
 

allein eingesetzt führte auch dazu, daß das Programmfenster trotz laufendem Prozeß gar nicht mehr erschien.

Dann fiel mir noch ein, daß das erste FormActivate ja noch diverse Dinge mit der Datenbankverbindung erledigt, indem es sie u.a. erst nochmals neu öffnet. Offenbar hängt eine bestehende BeforeScroll- oder OnDataChange-Prozedur hier alles auf.
Wenn man jedoch die Ereignisprozedur erst danach "zuschaltet", klappt es zumindest mit OnDataChange schon mal!

Code: Alles auswählen

procedure TFormLabSoft.FormActivate(Sender: TObject);
var
  ...
begin
   if flgFirstFormActivate then
   dm1.ZCon1.Connected := False;
        try
             try
                dm1.ZCon1.Database:=DATABASE_UNC_PATH;
                dm1.ZCon1.LibraryLocation:=DATABASE_LIB_PATH;
                ...
              except
                MemoLog.Append('Fehler beim Verbinden der Datenquelle!'+NL)
              end;
           finally
              ...
           end;          
   begin
     ...
     //Workarounds:
     DBMemoSoftwareNotizen.ShowHint:=True; // ist leider nicht published
   end; //Ende der einmaligen Vorbereitungen
   DBGridUebersicht.DataSource.OnDataChange:=@dsUebersichtDataChange; // !!!!!!!!! That's it.
end;  
Zuletzt geändert von sierdolg am Do 20. Feb 2014, 11:50, insgesamt 1-mal geändert.

sierdolg
Beiträge: 66
Registriert: Mi 24. Okt 2012, 15:50

Re: Ereignis Datensatzwechsel

Beitrag von sierdolg »

So, und unter den zuvor gezeigten Umständen (nachträgliches Aktivieren der Ereignisprozedur) klappt es nun auch mit AfterScroll! Erstaunlich die unterschiedlichen Effekte - AfterScroll wird nur scheinbar nicht mehr ausgeführt, andere blockieren gleich den Start der Anwendung.

Antworten