4D v16

Ereignisse

Home

 
4D v16
Ereignisse

Ereignisse    


 

Hier erfahren Sie, wie Ereignisse arbeiten und sich programmieren lassen.

Wir müssen unterscheiden zwischen:

  • "Formular" Ereignissen, gelistet in den Formularereignissen
  • Und "Datenbank" Ereignissen, definiert in den Eigenschaften einer Tabelle, da sie mit Triggern verbunden sind; d.h. Code, der ausgeführt wird, wenn ein spezifisches Ereignis eintritt.

Formularereignisse treten nur auf, wenn ein Formular benutzt wird (auf dem Bildschirm oder beim Drucken), d.h. ein Benutzer verwendet die Oberfläche, z.B. bei einem Mausklick, Drag-and-Drop, u.ä.

Datenbankereignisse betreffen nur 3 Aktionen:

  • Daten erstellen
  • Ändern
  • Löschen

Diese 3 Ereignisse verwaltet die Datenbank-Engine. Das ist ein wichtiger Punkt, denn im Client/Server Modus läuft die Engine auf dem Server. Folglich wird ein Datenbankereignis nie auf Ihrem Client-Rechner ausgeführt. Sie können es auf einem Client auch nicht nachvollziehen. Mehr dazu später.

Zuerst wollen wir ein bißchen Spaß haben und eine etwas "spezielle" Schaltfläche erstellen:

  • Gehen Sie auf Seite 4 des Formulars Navigator, die Seite Preferences
  • Zeichnen Sie eine Standard Schaltfläche
  • Ändern Sie die Eigenschaften wie folgt:
    -  Name: bSpecial
    -  Nur das Ereignis “On Mouse Enter” bleibt markiert
  • Erstellen Sie seine Methode (ALT-Klick auf die Schaltfläche)

und geben folgenden Code ein:

  //Mausposition, wenn die Methode startet
 GET MOUSE($Mouse_H;$Mouse_V;$MouseButton//Wo ist das Objekt im Fenster?
 OBJECT GET COORDINATES(bSpecial;$Obj_L;$Obj_T;$Obj_R;$Obj_B)
 
  //Zentrum des Objekts berechnen
 $Center_H:=$Obj_L+(($Obj_R-$Obj_L)/2)
 $Center_V:=$Obj_T+(($Obj_B-$Obj_T)/2)
 
 $Shift:=10 //Verschieben um X Pixel einplanen</p><p>If ($Mouse_H<$Center_H) //Ist die Maus links vom Zentrum
 $T:=$Mouse_H-$Obj_L+$Shift  //Bewege das Objekt nach rechts
Else //Ist die Maus rechts vom Zentrum
 $T:=-($Obj_R-$Mouse_H+$Shift//Bewege das Objekt nach links
End if
If($Mouse_V<$Center_V//Ist die Maus über dem Zentrum
 $B:=$Mouse_V-$Obj_T+$Shift  //Bewege nach unten
Else //Ist die Maus unter dem Zentrum
 $B:=-($Obj_B-$Mouse_V+$Shift//Bewege nach oben
End if
 
  //Bewege die Schaltfläche je nach der oben definierten Information
OBJECT MOVE(bSpecial;$T;$B)

Das bedeutet:

  • Position der Maus berechnen
  • Und Position des Objekts, um sein Zentrum festzulegen
  • Objekt eine bestimmte Anzahl Pixel bewegen
  • Position der Maus vom Zentrum aus berechnen
  • Dann Position der Schaltfläche verändern

Wir testen:

  • Zeigen Sie das Formular an (über die Methode Navigator)
  • Gehen zur Seite Preferences
  • Und versuchen, auf die Schaltfläche zu klicken

Immer wenn Sie in die Nähe der Schaltfläche kommen, bewegt sie sich in die Gegenrichtung (links, rechts, oben oder unten). Fällt die Schaltfläche aus dem Bildschirm heraus, schließen Sie das Formular und starten erneut; die Schaltfläche erscheint wieder an der Ausgangsposition.

Dies war ein kleines Beispiel zum Verwenden von Ereignissen.

Sehen wir uns ein anderes an:
Wenn wir einen Einsatz eingeben, wollen wir seine Dauer anhand der Anfangs- und Endzeit berechnen.

Wir müssen folgendes ausführen:

  • Zuerst fügen wir in der Tabelle ein Feld für Endzeit hinzu
    Um Zeit zu sparen, kopieren Sie das Feld Hour_Interventions und setzen es in die gleiche Tabelle. Ändern Sie dann den Namen zu Hour_Interventions_End.
  • Als nächstes fügen wir es im Eingabeformular hinzu: Kopieren Sie das Feld Hour_Interventions und passen es entsprechend ein. Nennen Sie es End.
  • Wir müssen auch die Dauer hinzufügen, um zu prüfen, ob unsere Programmierung korrekt läuft.
  • Dann müssen wir angeben, dass die Dauer erneut berechnet wird, wenn sich ein Zeitfeld ändert.
  • Wir markieren also das Datenbankereignis "On Data Change" bei den beiden Feldern Hour_Interventions und Hour_Interventions_End und geben die folgende, auszuführende Berechnung an.
    Hinweis: ALT-Klick auf 2 Objekte, die keine Methode haben, erstellt nur die Methode für das angeklickte Objekt.

Die Dauer wird aus der Differenz zwischen Anfangs- und Endzeit berechnet, vorausgesetzt die Endzeit ist ausgefüllt, d.h. nicht Null. Wir verwenden folgenden Code für Hour_Interventions:

 If([Interventions]Hour_Interventions_End#?00:00:00?)
    [Interventions]Duration:=[Interventions]Hour_Interventions_End-[Interventions]Hour_Interventions
 End if

Wir können den Code kopieren. ihn in die Methode für die Endzeit einfügen und das Hour_Interventions_End in der If-Abfrage zu Hour_Interventions ändern.

Beim Ändern der Einsatzzeit müssen jetzt Anfang und Ende ausgefüllt sein, dann wird automatisch die Dauer berechnet.
Wir prüfen natürlich auch, dass die Zeiten eingebbar sind. Dann testen wir mit einem Einsatz:

  • Wir öffnen die Liste der Einsätze 
  • Und nehmen den ersten

Wir geben eine beliebige Dauer in das Endzeit-Feld ein und sehen, dass Duration automatisch berechnet wird. Der Code wird ausgeführt, wenn wir das Feld verlassen; d.h. im Kontext des Ereignisses "On Data Change".

Hier sollten Sie folgendes beachten:

Nicht alle Objekte haben dieselben Ereignisse. So können Sie für eine Schaltfläche nicht das Ereignis "On Data Change" markieren, da Sie keinen Inhalt "eingeben" können.

Hier ein paar Beispiele:

  • On Mouse Enter
    Wenn die Maus in den "Luftraum" der Schaltfläche eindringt.
  • On Data Change
    Beim Verlassen eines Feldes oder einer Variablen, wenn sich der Inhalt geändert hat.
    Dient hauptsächlich zum Prüfen bei Eingabe, Formatierung (Groß- und Kleinschreibung), Suchen, erneuten Berechnungen.
  • On Clicked
    Wenn auf ein Objekt geklickt wird, in der Regel Schaltflächen, PopUps, Menüs, etc.
    Lässt sich auch auf eingebbare Objekte anwenden.
  • On Getting Focus
    Wenn das Objekt gerade Fokus erhalten hat (von On Clicked, über Tabulator oder per Programmierung).
  • On Load
    Unmittelbar bevor ein Formular auf dem Bildschirm angezeigt oder gedruckt wird.
    Während diesem Ereignis wird in der Regel eine Initialisierung ausgeführt.
  • On Printing Detail
    Während Drucken von Datensätzen.
    Ermöglicht z.B. einen Wert für die Variablen Gesamtsumme, Verkettung.

Diese Liste zeigt nur eine Auswahl. Die komplette Beschreibung der Ereignisse finden Sie im Handbuch 4D Programmiersprache im Kapitel Formularereignisse.

Es gibt ein wichtiges Detail, wonach neue Benutzer immer fragen: Muss ich Formularereignisse oder Objektereignisse markieren? Die Antwort ist einfach: Das hängt davon ab, wie Sie Ihre Methoden erstellen.
Die Formularmethode sollte theoretisch nur enthalten, was zum Bearbeiten des gesamten Formulars relevant ist:

  • Größe verändern
  • Aufruf nach Außen
  • Objekte anzeigen/ausblenden
  • etc.

Demgegenüber sollten Objektmethoden nur das enthalten, was für das Objekt selbst spezifisch ist (Schaltfläche, Feld, etc.). Das ist die allgemeine Regel und Sie sollten mehrere gute Gründe haben, bevor Sie sie brechen.

Hier die wichtigsten Unterschiede:

  • Formularmethode: Zentralisiert, globale Bearbeitung, leicht zu pflegen.
    Risiko, dass sie öfters als benötigt ausgeführt wird.
  • Objektmethode: Spezifisch, angepasst, wird nur bei Bedarf ausgeführt.
    Ermöglicht leicht, ein Objekt per Copy-Paste zu übertragen, insbesondere bei Zeigern.
    Die Methode, die die Methode aufruft, muss in jedem Objekt dupliziert werden.

Es gibt auch Fälle, wo wir bestimmte Prozesse in die Formularmethode legen.

Sie müssen z.B. einen Wert neu berechnen, der von 10 eingebbaren Parametern abhängt. Für jeden geänderten Parameter müssen Sie die Berechnung erneut ausführen. Anstatt die Formel oder den Methodenaufruf in jedes der 10 Felder mit Parameter zu setzen, können Sie diese Berechnung in eine Formularmethode setzen.

Das vereinfacht und zentralisiert den Vorgang; die Berechnung wird aber höchstwahrscheinlich öfters als notwendig ausgeführt - insbesondere beim Ändern eines Bereichs, der nicht in der Endberechnung vorkommt.
Tipp: 4D lässt Sie wissen, welches Objekt geändert wurde, so dass wir die Berechnung entsprechend anpassen können.

Auch die Reihenfolge, in der die Ereignisse ausgeführt werden, ist wichtig. Für eine Schaltfläche gilt z.B. folgendes:

  • On Mouse Enter
  • On Mouse Move
  • On Getting Focus
  • On Clicked (falls vorhanden)
  • On Mouse Leave
  • On Losing Focus

Bei einem angeklickten Feld bzw. einer Variablen:

  • On Mouse Enter
  • On Mouse Move
  • On Getting Focus
  • On Data Change (falls vorhanden)
  • On Losing Focus
  • On Mouse Leave

Um Zeit beim Schreiben Ihres Code zu sparen und ihn zuverlässiger zu machen, können Sie Makros setzen (Datei “macros.xml”).

Sie können z.B. ein Makro anlegen, das folgenden Code schreibt, immer wenn Sie “#$evt” in Ihrer Methode tippen:

 $evt:=Form event
 Case of
    :($evt=On Clicked)
 
    :($evt=On Load)
 
 End case

Weiter vertiefen:
Studieren Sie genau, wie Ereignisse arbeiten, denn das hilft zu verstehen, wann Sie Ihre Programmierung ausführen sollen. Sie bekommen auch ein Gefühl für leistungsstarke Schritte durch Ereignisse wie:

  • On Drag Over
  • On Drop
  • On Selection Change
  • plus die drei Mausereignisse (Move, Leave, Enter)

sowie gängige Standardereignisse:

  • On Clicked
  • On Double Clicked
  • On Long Click
  • etc.

 
 

 
EIGENSCHAFTEN 

Produkt: 4D
Thema: Ereignisse

 
GESCHICHTE 

 
ARTIKELVERWENDUNG

Self-Training ( 4D v16)