Show TOC

Übung 3: Control Methoden in UnterprogrammenLocate this document in the navigation structure

Verwendung

Die Methoden eines Control lassen sich auch in einem Unterprogramm beziehungsweise in einer Methode aufrufen. So kann man eine Funktion isolieren und Programme übersichtlicher machen.

In dieser Übung fassen Sie die Methodenaufrufe, die den Zustand des Control abfragen, in einem Unterprogramm zusammen.

Vorgehensweise
  1. Rufen Sie im PAI das Unterprogramm get_lines im CASE-Zweig auf, in dem Sie den Funktionscode PROTECT abfragen. Übergeben Sie dabei die Parameter from_idx, to_idx und index per Referenz:

    WHEN 'PROTECT'.
       DATA: FROM_IDX TYPE I,
             TO_IDX TYPE I,
             INDEX TYPE I.
       PERFORM GET_LINES CHANGING FROM_IDX TO_IDX INDEX.
    
    
                   
  2. Legen Sie das Unterprogramm an und verschieben Sie die beiden Methodenaufrufe GET_SELECTION_POS und GET_FIRST_VISIBLE_LINE dorthin.

    Achtung

    Achten Sie darauf, dass die formalen Parameter von get_lines mit den Aktualparametern der hineinkopierten Methoden übereinstimmen.

Überprüfen Sie Ihre Arbeit

Das Verhalten des Programms ändert sich nicht. Dafür ist Ihr Coding etwas übersichtlicher geworden.

Diskussion

Die Methoden GET_SELECTION_POS und GET_FIRST_VISIBLE_LINE importieren Werte in die Aktualparameter from_idx, to_idx und index. Das Control Framework speichert also beim Puffern der Methoden in der Automation Queue Referenzen auf diese Parameter ab.

Referenzparameter des Unterprogramms

Die Zuordnung der Werte zu den Aktualparametern erfolgt zum Flush-Zeitpunkt, also in unserem Beispiel außerhalb des Unterprogramms. Etwas verwunderlich, denn die Aktualparameter der Methoden müssen ja zum Flushzeitpunkt gültig sein. Die Referenz eines Parameters des Unterprogramms ist aber nach Beendigung des Programms nicht mehr gültig; trotzdem gibt es keinen Laufzeitfehler.

Der Grund ist, dass die Referenzparameter von Unterprogrammen (bei Verwendung von USING und CHANGING) nach Außen an die Automation Queue durchgereicht werden. Die Referenzen sind also noch beim Flush der Automation Queue bekannt.

Hinweis

Die Verwendung von globalen Variablen als Aktualparameter der Control-Methoden ist auch eine lauffähige Lösung. Das sollten Sie jedoch möglichst vermeiden, da Programme mit globalen Variablen unübersichtlicher sind.

Werteparameter von Unterprogrammen

Die Aktualparameter from_idx, to_idx und index werden nach dem Unterprogramm im PAI weiter verwendet. Deshalb ist es in unserem Beispiel nicht denkbar, die Parameter des Unterprogramms per call-by-value zu übergeben - die Rückgabewerte der Methoden GET_SELECTION_POS und GET_FIRST_VISIBLE_LINE gingen verloren.

Trotzdem wollen wir testweise einen der Parameter als Wert übergeben. Ändern Sie dazu die Definition der Form folgendermaßen:

FORM GET_LINES CHANGING VALUE(FROM_IDX) TO_IDX INDEX.

Starten Sie das Programm und versuchen Sie eine Zeile zu schützen. Das System bricht das Programm mit einem Laufzeitfehler ab. Das liegt daran, dass die Methode GET_SELECTION_POS die lokale Variable FROM_IDX in der Form verwendet, die beim Flush - also außerhalb der Form - nicht mehr gültig ist.

Achtung

Dieses Problem tritt nur dann auf, wenn die Aktualparameter der Control-Methoden in der Automation Queue als Referenz gespeichert werden.

Die Konsequenz: Verwenden Sie in einem Unterprogramm lokale Variablen, die in der Automation Queue als Referenz gehalten werden, so muss innerhalb des Unterprogramms ein Flush-Aufruf stehen.