Programmierung

Editieren eines Feldes in einem RecView-Objekt

Bereits in dem Artikel Editierenv eines Feldes in einer RecList habe ich mich mit dem Editiervorgang innerhalb eines Objektes beschäftigt, welches die Daten in Listenform darstellt.
Im folgenden Artikel möchte ich mich mit dem RecView-Objekt befassen und den Ablauf eines Editiervorgangs innerhalb dieses Objektes näher beleuchten.

Ereignis: EvtLstEditStartGroup

Um einen Spalteneintrag in einem RecView-Objekt editieren zu können, muss zuerst eine Reihe von Ereignissen durchlaufen werden. Das Ereignis EvtLstEditStartGroup wird ausgelöst, wenn ein Eintrag in einem RecView editiert werden soll. Der Editiervorgang wird durch die in wpEditKeyStart und wpEditMouseStart definierten Tastatur- und Mausaktionen, bzw. durch den Befehl WinRvwEdit() ausgelöst. In diesem Ereignis können Vorbereitungen zum Editieren des Datensatzes getroffen werden.

sub EvtLstEditStartGroup
(
  aEvt                 : event;    // Ereignis
  aGroup               : handle;   // Gruppe
  aRecBuf              : handle;   // Datensatzpuffer
  aResult              : int;      // Eingabe-Resultat
)
: logic;
{

  // Datensatz sperren
  aRecBuf->RecRead(0,_RecID | _RecLock | _RecNoLoad,
                   aRecBuf->RecInfo(_RecID));
}

Ereignis: EvtLstEditStartItem

Dieses Ereignis wird ausgelöst, wenn bei EvtlstEditStartGroup im Parameter aResult _WinRvwGroupEditContinue zurückgegeben wurde. Dieser ist im Ereignis EvtLstEditStartGroup standardmäßig vorbelegt.
Das Ereignis leitet den Editiervorgang für das in aGroup übergebene Item oder SubItem ein. Hier kann beispielsweise das Editieren für bestimmte Items der Gruppe unterbunden werden.

sub EvtLstEditStartItem
(
  aEvt                 : event;    // Ereignis
  aGroup               : handle;   // Gruppe
  aRecBuf              : handle;   // Datensatzpuffer
  aResult              : int;      // Eingabe-Resultat
)
: logic;
{
  // ID und Typ darf nicht verändert werden
  if (aGroup->wpSelectorItem = 1 OR aGroup->wpSelectorItem = 7)
  {
    aResult # _WinRvwGroupEditAbort;
  }
}

Ereignis: EvtLstEditActivate

Standardmäßig wird im Ereignis EvtLstEditStartItem im Parameter aResult _WinRvwGroupEditContinue zurückgegeben. Dies bewirkt, dass das Ereignis EvtLstEditActivate ausgelöst wird. Hier können das Edit-Objekt angepasst werden oder in Abhängigkeit vom Inhalt der Spalte, Felder sichtbar gesetzt werden.

sub EvtLstEditActivate
(
  aEvt                 : event;    // Ereignis
  aGroup               : handle;   // Gruppe
  aRecBuf              : handle;   // Datensatzpuffer
  aEdit                : handle;   // Eingabe-Objekt
)
: logic;
{

  if(aGroup->wpSelectorItem = 2)
  {
    // Passendes Bild zum Artikel anzeigen
    gPicture->wpCaption # '>0\Pictures\'+ aGroup->wpCaption + '.jpg';
  }
}

Ereignis: EvtLstEditEndItem

Dieses Ereignis wird aufgerufen, wenn der Editiervorgang für das aktuelle Item oder SubItem beendet oder abgebrochen wurde. In diesem Ereignis kann man den geänderten Wert in den Datensatzpuffer übertragen.

sub EvtLstEditEndItem
(
  aEvt                 : event;    // Ereignis
  aGroup               : handle;   // Gruppe
  aRecBuf              : handle;   // Datensatzpuffer
  aEdit                : handle;   // Eingabe-Objekt
  aAbort               : logic;    // Abbruch-Anforderung
  aResult              : int;      // Eingabe-Resultat
)
: logic;
{
  if(!aAbort AND aGroup->wpSelectorItem = 2)
  {
    //Wert in Datensatzpuffer übertragen
    aRecBuf->Art.Name # aEdit->wpCaption;
  }
}

Ereignis: EvtLstEditEndGroup

Das Ereignis wird nach dem Ereignis EvtLstEditEndItem ausgelöst. Weiterhin wird es auch aufgerufen, wenn im Ereignis EvtLstEditStartGroup der Parameter aResult auf _WinRvwGroupEditAbort gesetzt wurde. Hier kann der Datensatz gespeichert oder entsperrt werden.

sub EvtLstEditEndGroup
(
  aEvt                 : event;    // Ereignis
  aGroup               : handle;   // Gruppe
  aRecBuf              : handle;   // Datensatzpuffer
  aAbort               : logic;    // Abbruch-Anforderung
  aResult              : int;      // Eingabe-Resultat
)
: logic;
{
  if(aAbort)
  {
    // Datensatz entsperren
    aRecBuf->RecRead(0,_RecID | _RecUnlock, aRecBuf->RecInfo(_RecID));
  }
  else
  {
    // Datensatz in der Datenbank ändern und RecView aktualisieren
    aRecBuf->RecReplace(_RecUnlock);
    aEvt:Obj->WinRvwUpdate(_WinRvwUpdateFromTop |
                           _WinRvwUpdateDoKeepSelect);
  }
}

Ablaufplan Editieren innerhalb eines RecViews

2 Kommentare

2 Kommentare “Editieren eines Feldes in einem RecView-Objekt”

  1. Bei den Ereignisfunktionen ist die Angabe von VAR zur Zeit nicht möglich. Es ergibt sich im Moment nur über die Dokumentation, ob ein Argument einen Rückgabewert verlangt. Insofern ist dies nicht identisch mit den durch sub deklarierten Funktionen.

  2. danke für die ausführliche Beschreibung des Ablaufs.

    Es gibt eine Frage wegen des Parameters aResult. Es scheint so zu sein, dass dieser Parameter als Referenz deklariert werden sollte. Im Regel soll solcher Parameter mit einem Schlüsselwort VAR gekennzeichnet werden. Auf dem Workshop, bei dem das RecView-Objekt vorgestellt wurde, wurde etwas über diesen Parameter besprochen. Könnten Sie bitte uns daran erinnern und diese Ausnahme erklären?

Kommentar abgeben