[Inhalt] [Zurück] [Weiter] [Thema] [Index]

NewDBGrid()


Syntax:

NewDBGrid(String name, Real xpos, Real ypos, Real breite, Real zeilen, Relation relation, String updatehandler, String updatefieldhandler, String selecthandler, String selectfieldhandler, Bool retflag, String dispfeld1, ... | Array A)
name: Name des Elmentes
xpos, ypos: Position der linken oberen Ecke in Pixeln
breite: Breite in Pixeln
zeilen: Höhe in Textzeilen
relation: MemRelation
updatehandler: ggf. besondere Behandlung, wenn ein Tupel abschließend geändert wurde
updatefieldhandler: Azurfunktion bei Update eines Feldes
selecthandler: Azurfunktion bei Select eines Tupels
selectfieldhandler: Azurfunktion bei Select eines Feldes
retflag: (veraltet, bitte auf False setzen)
dispfeld1 bis dispfeldn: darzustellende Felder
oder A: Array mit darzustellenden Feldern

Beispiel:

NewDBGrid("Auswahl", 20,270, 100, 10, wrel,"Aendern","", "Sel", "", False, "Nr","Name")

Beschreibung:

Erzeugt auf dem aktuellen AGWindow ein DBGrid mit Namen name an der Position xpos, ypos.

Ein DBGrid ermöglicht das Editieren einer Relation in Tabellenform. Es werden nur MemRelationen (siehe dazu OpenRel(), ADBOpenRel() und SearchAll()) unterstützt.

Die Tupel werden zeilenweise dargestellt. Jede Zeile wird entsprechend der Tupelstruktur in Felder unterteilt. Dadurch ergibt sich eine Tabellenform. Der Benutzer kann die Felder mit dem Cursor anwählen und direkt editieren.

Wenn mittels CreateIndex() eine Sortierreihenfolge auf der Relation festgelegt ist, werden die Tupel entsprechend sortiert angezeigt. Alle Tupel der Relation werden verarbeitet. Falls die Menge eingeschränkt werden soll, muss dies vorher geschehen (z.B. mit DBFilter()).

Parameter

  • Mit dispfelder kann eine Auswahl der darzustellenden Felder (also Spalten) ausgewählt werden. Die Felder können editierbar oder zum Editieren gesperrt werden. Das Format des dispfelder-Parameter ist unten beschrieben. Wird kein Array angegeben, so werden alle Felder dargestellt.

    Die Größe der Tabelle wird mit breite (Breite in Pixeln) und zeilen (Anzahl der gleichzeitig darzustellenden Tupel) festgelegt. Ist breite<0, dann wird das DBGrid automatisch an die Breite des AGWindows angepasst (und breite auf die Breite addiert, also diese vermindert). Ein vertikaler und/oder horizontaler Scroll-Balken wird automatisch erzeugt, wenn nicht alle Felder bzw. Tupel in die so festgelegte Tabelle passen.

    Ist retflag FALSE, wird bei Beenden einer Eingabe mit Return der updatefieldhandler aufgerufen und der Cursor nicht verändert. Der Parameter des Handlers Bool name_Ret gibt an, ob der Benutzer das Editieren des Feldes mit der Return-Taste abgeschlossen hat.

    Die Parameter dispfeld1 bis dispfeldn enthalten eine Liste von Display-Feldern, also Felder des Tupels, die im DBGrid angezeigt werden sollen. Alternativ kann diese Liste auch als Array übergeben werden.

    Das Displayfeld ist der Name eines Feldes der Relation (z.B. Ort). In der betreffenden Spalte werden dann pro Zeile die Inhalte dieses Feldes dargestellt.

Codes

  • Manchmal sind die Inhalte eines Feldes Codes, die nicht direkt dargestellt werden, sondern mittels einer Code-Relation umgewandelt werden sollen. Dies hat den Vorteil, dass der Benutzer statt der internen Codes Klartexte sieht. Er kann die Inhalte dann nicht direkt editieren, sondern wählt sie aus einer aufklappbaren Liste aus. Die Liste wird aus einer Code-Relation erzeugt. Das Displayfeld hat dann die Form:

    feldname|coderel|codefield+dispfeld1+...+dispfeldn.

    feldname ist der Name des Code-Felds (z.B. gemeinde), codrel ist eine dbf-Relation (z.B. gemeinde) oder eine MemRelation (z.B. Str(memgemeinde)), codefield ist der Name des Feldes in coderel, das den Code enthält (z.B. gebcode). Hinter dem codefield folgt ein +, darauf ein oder mehrere Feldnamen für die Klartexte der Codes (z.B. LANGTEXT).

Combobox

  • Eine Combobox bietet die Vorteile einer Liste mit festen Vorschlägen, ohne aber auf diese eingeschränkt zu sein, da man im Eingabefeld auch jeden beliebigen Text eingeben kann.
    Felder, die mittels einer Combobox editiert werden, können entweder per Texteingabe (mit optionaler automatischer Vervollständigung für vorhandene Listeneinträge), mit Pfeiltasten oder mit Mausklick auf den ensprechenden Listeneintrag gesetzt werden.
    Mit den Pfeiltasten kann man zwischen den einzelnen Listeneinträgen wechseln, bei aufgeklappter Liste ist es möglich, einen Listeneintrag per Maus anzuklicken. Per Tastatur können auch neue beliebige Texte eingegeben werden, die nicht Teil der Liste sind. Der neue Text wird für das aktuelle Feld übernommen, jedoch wird dieser nicht in der Auswahlliste gespeichert. Die Auswahlliste kann vom Benutzer nicht verändert werden.

    feldname|COMBO=eintrag1+eintrag2+...+eintragn.

Spaltenformatierung

  • Folgt dem Displayfeld direkt ein &-Zeichen, so wird der darauf folgende String als Spaltenüberschrift verwendet, ansonsten der Feldname. Die Breite einer Spalte ergibt sich aus dem Maximum der Feldlänge und der Länge der Überschrift. Durch Anhängen eines weiteren & kann die Breite in Pixeln jedoch explizit gesetzt werden.

    Die Breite der Tabelle ergibt sich aus der Summe aller Spaltenbreiten. Ein vorangestelltes - vor den Displayfeldern bewirkt, dass diese nicht editiert werden können. Beispiel:

    NAME&Stationsname&50.

Bedienung

  • Durch Mausklick oder durch die Cursortasten Pfeilhoch bzw. Pfeilrunter kann der Benutzer ein anderes Tupel anwählen. Das Quadrat in der ersten Spalte des aktuellen Tupels wird rot eingefärbt. Die Azurfunktion selecthandler wird aufgerufen. Für das angewählte Feld, auch wenn sich die Spalte nicht geändert hat, wird die Azurfunktion selectfieldhandler aufgerufen. Das Feld wird grau bzw. dunkelgrün dargestellt (Cursor).
    Wird ein Feld im selben Tupel angewählt, wird nur der selectfieldhandler aufgerufen.

    Hat der Benutzer das Editieren eines Feldes abgeschlossen, so wird in der Regel der updatefieldhandler aufgerufen. Wenn der Benutzer dadurch das Editieren des Tupels abschließt (durch Wahl eines anderen oder durch Drücken der Returntaste oder von Esc), wird stattdessen der updatehandler aufgerufen, sofern dieser gesetzt ist. Der Handler-Parameter name_Ret zeigt an, ob der Benutzer die Eingabe mit der Returntaste abgeschlossen hat.

    Falls ein Feld zum Editieren gesperrt ist (also grün ist), wird der updatefieldhandler aufgerufen, wenn der Benutzer auf dem Feld einen Doppelklick ausgelöst hat.

    Den Handler-Funktionen können die Relation, das aktuelle Tupel und die aktuelle Spalte als Parameter übergeben. Wenn das DBGrid name heißt, dann hat die Relation den Namen name_Rel, das Tupel heißt name_Tup und die Spalte name_Feld. Diese Variablen sind keine Kopien, sondern verweisen direkt auf den entsprechenden Speicherbereich. name_Feld ist leer, wenn keine Spalte angewählt wurde. Der Parameter Bool name_Ret wird übergeben und gibt an, ob das Editieren mit der Eingabe-Taste beendet wurde.

    Wenn das Editieren mit der Anwahl eines anderen Tupels beendet wurde (durch Pfeiltaste oder Mausklick), wird zuerst der Update-Handler mit dem editierten Tupel aufgerufen. Danach werden die Select-Handler aufgerufen mit dem vom Benutzer gewählten Tupel und Feld. Eventuelle Anwahlen von Tupeln/Feldern der Handler werden in diesem Fall verworfen. Wenn der Benutzer die Eingabe ohne Anwahl eines anderen Tupels oder Felds beendet hat, wird die Anwahl eines Tupels/Feldes des Handlers berücksichtigt.

Funktion von Bool-Feldern:

  • Ein Bool-Feld kann drei Zustände annehmen: Ja, Nein und Ungesetzt. Falls dem Bool-Feld nicht explizit ein Wert zugewiesen wurde, steht es auf Ungesetzt (leer). Durch Betätigen der Leertaste, der Enter-Taste oder Mausklick in einem Bool-Feld wird es umgeschaltet von Ungesetzt nach Ja nach Nein nach Ungesetzt.

    Möchte man die Reihenfolge auf Ungesetzt , Nein, Ja, Ungesetzt ändern, so fügt man vor dem Displayfeld ein ! ein. Setzt man ein ? vor das Displayfeld, bedeutet das, dass der Zustand Ungesetzt entfällt, man also nur zwischen Ja und Nein wechseln kann.

Felder zum Editieren sperren:

  • Es können ganze Zeilen oder ganze Spalten zum Editieren gesperrt werden.

    Spalten sperrt man, indem man bei der Angabe der Displayfelder dem Feldnamen des Feldes ein Minus voranstellt. Beispiel: -Ort. Diese Sperre ist nicht aufhebbar.

    Zeilen, also Tupel, sperrt man, indem die Tupel um ein Bool-Feld READONLY erweitert werden. Ist der Inhalt dieses Feldes eines Tupels auf True gesetzt, dann wird es grün hinterlegt und ist zum Editieren gesperrt. Wird READONLY auf False gesetzt, wird das Tupel wieder zum Editieren freigegeben.

Felder ungewissen Inhalts:

  • Felder, die einen ungewissen Inhalt haben (siehe SetUntrusted()), werden mit roter Schrift dargestellt. Sie können editiert werden, falls ein Feld nicht zuätzlich grün ist.

Tupel selektieren:

  • Wenn der Benutzer mit der rechten Maustaste in das Quadrat links neben ein Tupel klickt, wird das Tupel selektiert. Dies wird angezeigt, indem ein blaues Quadrat dargestellt wird. Durch abermaliges Klicken wird das Tupel wieder deselektiert und die blaue Selektierung wieder entfernt.
    Wurde ein Tupel blau selektiert und danach mit gedrückter Shift-Taste ein anderes Tupel selektiert, werden auch alle Tupel zwischen den beiden Tupeln blau selektiert. Wird in die erste Spalte der Überschrift ein Rechtsklick ausgeführt, werden alle Tupel selektiert (wenn vorher keins selektiert war) oder deselektiert (wenn vorher mindestens eins selektiert war).

    Die selektierten Tupel können mit den Funktionen CollectAll() und TupIsSelected() abgefragt werden.

    Beim Aufbau des Grids und beim "@update" werden die selektierten Tupel der Relation in ihren Zeilen blau selektiert.

Spalten markieren:

  • Wenn der Benutzer mit der rechten Maustaste auf eine Spaltenüberschrift klickt, wird diese markiert (siehe MarkierteFelder()) und in Fettschrift dargestellt. Ein erneuter Klick wechselt wieder zurück. Um darüber informiert zu werden, ob eine Spalte de/markiert wurde, kann ein Handler durch SetHandle (Name,"HeaderMarked=Methode") angemeldet werden. Durch den Bool Name_Marked kann in der Handlerfunktion abgefragt werden, ob die Spalte markiert oder demarkiert wurde.

Kommunikation mit azur

  • Änderungen, die der Benutzer in dem DBGrid vornimmt, werden sofort in die Relation übernommen. Änderungen an der Relation, die von Azur aus erfolgen, müssen dem DBGrid jedoch mitgeteilt werden. Dazu wird die Funktion ExportVar() benutzt (das DBGrid heißt in den Beispielen immer Auswahl):

    Wenn die azurseitige Änderung eines Tupels sich sofort auf der Oberfläche niederschlagen soll, muss ein ExportVar("Auswahl", "@updatetupel "+Str(tup)) erfolgen.

    Um neue Tupel im DBGrid aufzunehmen, werden sie mit AppTupel() in die Relation aufgenommen. Danach wird mit ExportVar("Auswahl", "@update") das DBGrid an die Relation angeglichen, die neuen Tupel also ins DBGrid übernommen.

    Soll das aktuelle Tupel gelöscht werden, so geschieht dies in zwei Schritten: das Tupel wird durch Azur aus der Relation gelöscht (DelTupel()). Darauf wird dem DBGrid ein @update geschickt. Die Zeile ist nun gelöscht.

    Mit "@select "+Str(tup) kann ein Tupel direkt angewählt werden. Das Feld der ersten Spalte wird rot dargestellt. Mit "@selectfield "+feldname kann ein Feld des aktuell angewählten Tupels selektiert werden, d.h. den Cursor auf dieses Feld setzen. Es wird grau bzw. dunkelgrün dargestellt.

    Mit "@select BETRID=2009" wird das Tupel aus dem Grid angewählt, dessen Schlüsselfeld BETRID auf dem Wert 2009 steht. Der Cursor bleibt in der gleichen Spalte, wird aber in das angewählte Tupel gesetzt. Der Schlüssel kann auch aus mehreren Feldern bestehen, die mit + verknüpft werden: "@select ORT+DATVON=2081173+20100908".

    Mit "@replace "+Str(rel) kann eine neue Relation an das DBGrid übergeben werden. Diese muss jedoch eine identische Struktur haben.

    Die Position des Cursors kann auch relativ verändert werden mit...

    • @left Bewegt den Cursor ein Feld nach links
      @right Bewegt den Cursor ein Feld nach rechts
      @up Bewegt den Cursor eine Zeile nach oben
      @down Bewegt den Cursor eine Zeile nach unten
      @relpos x y Bewegt den Cursor x Felder nach rechts und y Zeilen nach unten
      (bei negativen Werten entsprechend in die andere Richtung)
      @home Bewegt den Cursor in die erste Zeile
      @end Bewegt den Cursor in die letzte Zeile

    "@startedit" öffnet ein Feld zum Editieren. Der Inhalt der Komponente des Tupels wird vorher in das Feld übernommen. Beendet der Benutzer das Editieren mit der ESC-Taste, bleibt der Inhalt der Komponente erhalten.

    "@finishedit" schließt das Editieren eines Feldes. Der Inhalt des Feldes wird in die Komponente des Tupels übernommen.

    "@reject" (wiederer-)öffnet ein Feld zum Editieren. Der Inhalt des Feldes wird nicht verändert. Wenn der Benutzer eine Eingabe abschließt, der Updatefield-Handler diese als unpassend bewertet und ein "@reject" schickt, hat der Benutzer den Eindruck, seine Eingabe werde zurückgewiesen. Beendet der Benutzer dieses Editieren mit der ESC-Taste, wird der Inhalt des Feldes (und der Komponente des Tupels) restauriert, der vor dem Editiervorgang, der vor dem "@reject" lag, gültig war.

    Das DBGrid prüft selbstständig, ob Schlüssel-Felder ausgefüllt sind und der Schlüssel eines Tupels eindeutig ist. Ist dies nicht der Fall, wird das Beenden der Eingabe nicht erlaubt und der Benutzer über den Grund in der Statuszeile informiert.



toposoft 28.03.2024