infra:NET Expert
 
×
16.03 IMA-Erweiterungen
activate_control(object)
Aktiviert zum Beispiel eine Schaltfläche in einem Dialog. Das Kommando wirkt auf allen Controls, die beim Betätigen mit der Maus eine Aktion auslösen. Auf einer Liste mit selektierbaren Einträgen (zum Beispiel "MultiColumnScrolledList") wirkt dieses Kommando wie ein Doppelklick. Als object muss der Objektzeiger des zu betätigenden Controls mitgegeben werden.
Bei der IMA-Abarbeitung wird auf die Ausführung der entsprechenden Aktion gewartet. Es ist also kein Warte-Befehl danach erforderlich.
Beispiel
Die Schaltfläche [ Ok ] im Programm SYS920 "Dateien reorganisieren" soll betätigt werden:
GwCore dialog=child(this, "SYS920_MAIN");
GwCore knopf=child(dialog, "SYS920_MAIN_PB_OK");
activate_control (knopf);

atof(text)
Diese Funktion bietet die Möglichkeit, einen numerischen Wert aus einem infra-Datenpuffer so umzuwandeln, dass mit diesem innerhalb der IMA-Datei Berechnungen durchgeführt werden können. Die Umwandlung ist notwendig, da numerische Werte in der infra-Datenbank als Zeichenfolgen (Texte) gespeichert sind, die als Dezimaltrenner einen Punkt enthalten. Die Umwandlung liefert einen Wert vom Typ „float“. Das Ergebnis der Funktion atof kann also einer Variablen vom Typ „float“ zugewiesen werden.
Ohne Verwendung dieser Funktion können ggf. vorhandene Nachkommastellen bei der automatischen Umwandlung von Text in float verloren gehen.
Beispiel
Mit dem Verrechnungspreis (Feld 22 aus Datei 6) wird eine einfache Berechnung durchgeführt:
float fPreis = atof(do_infra_macros(this,“LBUF(6,DDp(6,22),DDl(6,22))“));
float fMenge = 200;
float fBetrag = fMenge*fPreis;

close_infra(object)
Versucht alle aktiven infra-Programme zu schließen und infra:NET zu beenden. Falls dies nicht gelingt, wird wie beim manuellen Beenden eine Meldung ausgegeben, die auf das zu schließende infra-Programm hinweist. Als object kann ein Objektzeiger eines geöffneten Dialogs mitgegeben werden, falls die Meldung als Kind des Dialogs angezeigt werden soll.
Ansonsten kann NULL angegeben werden.
Beispiel
close_infra(NULL);

control_clear_value(object)
Setzt ein Markierungsfeld oder einen Markierungsknopf auf den Wert "aus". Als object muss der Objektzeiger des zu verändernden Markierungsfelds/-knopfs mitgegeben werden.
Beispiel
Das Markierungsfeld «Probelauf» im Programm "463 Rechnungen drucken" soll nicht gesetzt werden:
GwCore feld=child(this, "AUF43A_1_F11");
control_clear_value(feld);

control_set_value(object)
Setzt ein Markierungsfeld oder einen Markierungsknopf auf den Wert "ein". Als object muss der Objektzeiger des zu verändernden Markierungsfelds/-knopfs mitgegeben werden.
Beispiel
Das Markierungsfeld «Probelauf» im Programm "463 Rechnungen drucken" soll gesetzt werden:
GwCore feld=child(this, "AUF43A_1_F11");
control_set_value(feld);

do_infra_macro(object, "makros")
Ausführen von beliebigen infra-Makros (siehe Kapitel 15.01 infra Makros) in der Ablaufsteuerdatei. Bei der Verwendung einiger Makros ist der Kontext wichtig, in dem die Makros ausgeführt werden. Zum Beispiel muss bei LBUF oder DBFIELD der angesprochene Puffer auch zum Zeitpunkt der Makroausführung versorgt sein. Als object muss der Objektzeiger des zugehörigen Dialogs oder eines Controls aus diesem Dialog mitgegeben werden.
Als Ergebnis wird der aus den abgearbeiteten infra-Makros resultierenden Text zurückgegeben.
Beispiel
Im Programm "463 Rechnungen drucken" soll das Feld «Projekt von/bis» mit einem Wert aus der INI-Datei versorgt werden:
GwCore feld=child (this,"AUF463_1_F26");
set_text(feld,do_infra_macro(feld,"INI(AUF463,MeinProjekt)"));
update_buffer(feld);
feld=child(this,"AUF463_1_F27");
set_text(feld,do_infra_macro(feld,"INI(AUF463,MeinProjekt)"));
update_buffer(feld);

execute_callback(objekt,"Prozedur","Parameter")
Diese Anweisung erlaubt die Ausführung von infra-Prozeduren/CallBacks (siehe Kapitel 15.02 infra-Prozeduren (CallBacks)). Als object wird der Objektzeiger angegeben, in dem die gewünschte Prozedur ausgeführt werden soll. Die Prozedur entspricht dem Namen der auszuführenden Prozedur/CallBack.
Der letzte Parameter wird an die auszuführende Prozedur übergeben und hat je nach Prozedur unterschiedliche Bedeutung.
Beispiel
Aus einem aktiven Programm soll das Programm "444 Auftragsbestätigungen drucken" über die Prozedur CBsCallModProc aufgerufen werden:
execute_callback(dialog,"CBsCallModProc","444");

grit_version()
Gibt die Version des eingesetzten GRIT-Runtime-Systems als Dezimalwert zurück. Dadurch lassen sich zum Beispiel versionsabhängige Unterschiede in einer IMA-Datei oder im GRIT-Interpretercode eines CGWs programmieren.
Beispiel
Abhängig von der GRIT-Version soll ein Text in ein Feld geschrieben werden:
if ( grit_version() < 5.0)
   infra_set_text(feld, "altes GRIT");
else
   infra_set_text(feld, "neues GRIT");

infra_find_child(objekt,"CGW","GritID")
Diese Funktion ersetzt die GRIT-4GL-Funktion "child(objekt,"GritID") und muss unbedingt um die Stabilität der Anwendung zu gewährleisten, statt dieser eingesetzt werden, wenn nach Dialogobjekten gesucht werden soll. Die Funktion sucht in allen grafischen Kindern des angegebenen Objekts nach dem grafischen Objekt mit der angegebenen GritID, das aus der angegebenen Ressourcendatei (CGW) geladen wurde und gibt als Ergebnis einen Zeiger auf dieses Objekt zurück.
Bei der Suche nach Dialogen werden eventuelle Einträge in der Sektion [ReplaceCGW] der Datei SIBPPS.INI berücksichtigt.
Beispiel
Über eine IMA-Datei soll ausgehend von einem Dialogobjekt ein anderes Dialogobjekt gesucht werden:
dialog727 = infra_find_child(dialog111,"EKA727","EKA727_1");

infra_find_frame("CGW","GritID")
Diese Funktion ersetzt die GRIT-4GL-Funktion "find_frame("GritID") und muss unbedingt statt dieser eingesetzt werden, um die Stabilität der Anwendung zu gewährleisten. Die Funktion sucht in allen geladenen Dialogen nach dem Dialog mit der angegebenen GritID, der aus der angegebenen Ressourcendatei (CGW) geladen wurde und gibt als Ergebnis einen Zeiger auf diesen Dialog zurück.
Bei der Suche nach dem Dialog werden eventuelle Einträge in der Sektion [ReplaceCGW] der Datei SIBPPS.INI berücksichtigt.
Beispiel
In einer IMA-Datei für das Programm "371 Bedarfsermittlung" soll festgelegt werden, welcher Dialog beim Programmstart angezeigt wird. Da es sich entweder um den Dialog MBP371_1 oder den Dialog MBP371_100 handeln kann, muss in einer Schleife auf beide gewartet werden:
//entweder Dialog 100 oder Dialog 1; einer muss kommen
GwCore dialog1 = NULL;
GwCore dialog100 = NULL;
while( !dialog1 && !dialog100 )
   {
   dialog100 = infra_find_frame("MBP371","MBP371_100");
   dialog1 = infra_find_frame("MBP371","MBP371_1");
   wait(0.1);
   }

infra_select_line(objekt,zeile,doppelklick)
Mit dieser Funktion kann in einer Liste (zum Beispiel Positionsbereich eines Kundenauftrags) eine bestimmte Zeile ausgewählt werden. Als Objekt muss ein Objektzeiger auf eine Liste angegeben werden. Der Parameter zeile entspricht dem Zeilenindex der zu selektierenden Listenzeile gezählt ab 0 (Null), das heißt die erste Zeile entspricht dem Index 0, die zweite dem Index 1 usw..
Über den Parameter doppelklick kann bestimmt werden, ob die entsprechende Zeile nur ausgewählt werden soll (doppelklick=0) oder zusätzlich ein Doppelklick auf dieser Zeile simuliert werden soll (doppelklick=1).
Beispiel
Im Positionsbereich eines Kundenauftrags (AUF435) soll die letzte Zeile selektiert und das zugehörige Positionsfenster geöffnet werden:
infra_select_line(obj,item_count(obj)-1,0);
Anmerkung:
Die GRIT-4GL-Funktion item_count(objekt) liefert die Anzahl der Zeilen in einer Liste. Da bei der Selektion der Zeilenindex ab 0 gezählt wird, muss beim Selektieren der letzten vorhandenen Zeile von der Anzahl der vorhandenen Zeilen eine abgezogen werden.

infra_select_text(objekt,"text")
Mit dieser Funktion kann in einer Auswahlliste (Combo Box) ein bestimmter Eintrag ausgewählt werden. Als Objekt muss ein Objektzeiger auf eine Auswahlliste angegeben werden. Der auszuwählende Text entspricht dem Anzeigetext des gewünschten Eintrags.
Beispiel
In der Zeilentyp-Auswahlliste einer Auftragszeile (AUF435) soll auf den Typ "Fracht" gewechselt und die "Eingabe" bestätigt werden:
obj=infra_wait_child(dialog435,"AUF435","AUF435_30_F1",5,1);
infra_select_text(obj,"Fracht");
activate_control(obj);

infra_set_focus(objekt)
Diese Funktion ersetzt die GRIT-4GL-Funktion set_focus(objekt) und sollte statt dieser eingesetzt werden, um die Stabilität der Anwendung zu gewährleisten. Die Funktion prüft im Gegensatz zur GRIT-4GL-Funktion die Gültigkeit des übergebenen Objektzeigers und ignoriert ungültige Zeiger.
Wird die Funktion auf ein gültiges Objekt angewandt, setzt sie den Eingabefokus auf das angegebene Objekt.
Beispiel
In einer IMA-Datei für das Programm AUF435 soll der Eingabefokus im Frachtzeilendialog auf das Feld «Positionsnummer» gesetzt und dieses Feld bestätigt werden:
GwCore obj=NULL;
...
//Positionsnummer ...
obj=infra_wait_child(dialog435_90,"AUF435","AUF435_90_F11",5,1);
//.. fokussieren und ....
infra_set_focus(obj);
//... auslösen
update_buffer(obj);

infra_set_focus_ex(objekt,Check)
Wie die Funktion infra_set_focus(...) dient die Funktion infra_set_focus_ex(...) dazu, den Eingabefokus gezielt auf ein bestimmtes Objekt zu setzen. Zusätzlich kann aber angegeben werden, ob beim Verlassen des aktuellen Eingabefeldes (das derzeit den Eingabefokus besitzt) eine Feldprüfung ausgelöst werden soll (Check=1) oder nicht (Check=0).

infra_set_text(objekt,text)
Diese Funktion ersetzt die GRIT-4GL-Funktion set_text(objekt,text) und sollte statt dieser eingesetzt werden, um die Stabilität der Anwendung zu gewährleisten. Die Funktion prüft im Gegensatz zur GRIT-4GL-Funktion die Gültigkeit des übergebenen Objektzeigers und ignoriert ungültige Zeiger. Wird die Funktion auf ein gültiges Objekt - zum Beispiel ein Eingabefeld - angewandt, setzt sie den Text bzw. Inhalt des Objekts auf den übergebenen Text.
Die Eingabe wird automatisch bestätigt, so dass im Anschluss kein update_buffer (...) notwendig ist.
Beispiel
In einer IMA-Datei für das Programm AUF435 soll das Preisfeld im Frachtzeilendialog aus der Zwischenablage gefüllt und bestätigt werden:
GwCore obj=NULL;
...
// Preis ...
obj=child(dialog435_90,"AUF435_90_F25");
//... aus Zwischenablage und Feld aktualisieren
infra_set_text(obj,do_infra_macro(obj,"GetClipboard()"));

infra_text(objekt)
Diese Funktion ersetzt die GRIT-4GL-Funktion text(objekt) und sollte statt dieser eingesetzt werden, um die Stabilität der Anwendung zu gewährleisten. Die Funktion prüft im Gegensatz zur GRIT-4GL-Funktion die Gültigkeit des übergebenen Objektzeigers und ignoriert ungültige Zeiger. Wird die Funktion auf ein gültiges Objekt - zum Beispiel ein Eingabefeld - angewandt, liefert sie als Ergebnis den Inhalt des Objekts als Text und zwar genauso wie der Inhalt angezeigt wird - also Zahlen mit führenden Leerzeichen und Komma, Datum mit Datumstrennern usw.
Beispiel
In einer IMA-Datei für das Programm PDV141 soll der Inhalt des Felds «Teilenummer» in eine String-Variable gespeichert werden, um die Teilenummer später weiterzuverwenden:
string teil;
...
//Teilenummer in String 'teil' schreiben
feld141=infra_wait_child(dialog141_R1,"PDV141","PDV141_R1_D6F3",5,1);
teil = infra_text(feld141);

infra_wait_child(objekt,"CGW","GritID",Sekunden,Fehlermeldung)
Diese Funktion arbeitet wie die Funktion infra_find_child(...), ersetzt aber zusätzlich eine eventuell notwendige Warteschleife, die einerseits auf die Erzeugung des gewünschten Objekts (zum Beispiel Dialogobjekt) und andererseits gegebenenfalls auf die Eingabebereitschaft des Objekts (zum Beispiel Eingabefeld oder Schaltfläche) wartet (while-Schleife mit is_sensitive- und wait-Anweisung). Die Funktion sucht in allen grafischen Kindern des angegebenen Objekts nach dem grafischen Objekt mit der angegebenen GritID, das aus der angegebenen Ressourcendatei (CGW) geladen wurde und gibt als Ergebnis einen Zeiger auf das Objekt zurück. Bei der Suche nach Dialogen werden eventuelle Einträge in der Sektion [ReplaceCGW] der Datei SIBPPS.INI berücksichtigt. Wird das gesuchte Objekt nicht auf Anhieb gefunden oder ist dies noch nicht zur Eingabe bereit, versucht die Funktion maximal Sekunden wiederholt das gewünschte Objekt zu ermitteln bzw. auf dessen Eingabefähigkeit zu warten. Ist die angegebene Zeitspanne ohne Erfolg verstrichen, kann über den Parameter Fehlermeldung bestimmt werden, ob automatisch eine entsprechende Fehlermeldung erzeugt werden soll (1) oder nicht (0).
Falls keine automatische Fehlermeldung gewünscht wird, kann durch Abfrage des Funktionsergebnisses selbst auf diese Situation reagiert werden.
Beispiel
Über eine IMA-Datei soll in einem Dialog ein Markierungsfeld gesucht werden. Dabei soll maximal 5 Sekunden gewartet werden, bis das Markierungsfeld eine Eingabe entgegen nehmen kann. Im Fehlerfall soll eine Fehlermeldung erzeugt werden:
obj = infra_wait_child(dialog1,"MBP371","MBP371_2_F14",5,1);
control_set_value(obj);

infra_wait_frame("CGW","GritID",Sekunden,Fehlermeldung)
Diese Funktion arbeitet wie die Funktion infra_find_frame(...), ersetzt aber zusätzlich eine notwendige Warteschleife, um zum Beispiel auf das Anzeigen eines Dialogs zu warten (while-Schleife mit wait-Anweisung). Zusätzlich kann eine Fehlermeldung erzeugt werden (zum Beispiel zu Diagnosezwecken), falls der gesuchte Dialog in der angegebenen Zeit nicht gefunden wird. Die Funktion sucht in allen geladenen Dialogen nach dem Dialog mit der angegebenen GritID, der aus der angegebenen Ressourcendatei (CGW) geladen wurde und gibt als Ergebnis einen Zeiger auf diesen Dialog zurück. Bei der Suche nach dem Dialog werden eventuelle Einträge in der Sektion [ReplaceCGW] der Datei SIBPPS.INI berücksichtigt. Wird der gesuchte Dialog nicht auf Anhieb gefunden (zum Beispiel weil das System ausgelastet oder die notwendigen Vorbereitungen im Programm noch nicht beendet wurden), versucht die Funktion maximal Sekunden wiederholt den gewünschten Dialog zu finden. Ist der Dialog nach der angegebenen Zeitspanne noch immer nicht vorhanden, kann über den Parameter Fehlermeldung bestimmt werden, ob automatisch eine entsprechende Fehlermeldung erzeugt werden soll (1) oder nicht (0).
Falls keine automatische Fehlermeldung gewünscht wird, kann durch Abfrage des Funktionsergebnisses selbst auf den fehlenden Dialog reagiert werden.
Beispiel
Über eine IMA-Datei wird das Programm "121 Stücklisten bearbeiten" gestartet und anschließend ein Zeiger auf den Selektionsdialog dieses Programms ermittelt. Dabei soll maximal 5 Sekunden auf die Anzeige des Dialogs gewartet und im Fehlerfall eine Meldung ausgegeben werden:
//Programm PDV121 als Unterprogramm des aktuellen Programms starten
execute_callback(this,"CBsCallModProc","121");
//auf den Selektionsdialog mit der GritID "PDV121_1" waren
dialog = infra_wait_frame("PDV121",PDV121_1",5,1);
if ( !dialog )
   return 0;

is_valid_child(objekt)
Diese Funktion prüft die Gültigkeit des übergebenen Objektzeigers und liefert TRUE (wahr), wenn das zugehörige Objekt noch existiert. Ansonsten wird FALSE (falsch) zurückgegeben. Die Funktion kann dazu eingesetzt werden, beim Ablauf einer IMA-Datei an geeigneten Punkten zu prüfen, ob zum Beispiel ein Dialog vorzeitig vom Anwender geschlossen wurde, bevor die IMA-Datei beendet wurde.
Beispiel
In einer IMA-Datei soll geprüft werden, ob ein Dialog noch existiert (gültig ist) und bei Ungültigkeit (!is_valid_child(...)) gegebenenfalls die IMA-Datei beendet werden:
GwCore dialog141_r1 = infra_wait_frame("PDV141","PDV141_R1",10,1);
..
//Dialog noch gültig? Sonst Ende ...
if ( !is_valid_child(dialog141_R1) ) return 0;
//!is_valid_child = NOT ist valid child

ScreenFormat("jjmmdd",D)
ScreenFormat ist im Gegensatz zu den hier beschriebenen Anweisungen ein infra-Makro. Es wird an dieser Stelle erwähnt, da der Einsatz in Kombination mit der IMA-Anweisung "do_infra_macro" zur formatgerechten Versorgung von zum Beispiel Datumsfeldern notwendig ist.
Mit diesem Makro können Felder formatgerecht (wie bei einer Eingabe per Tastatur) versorgt werden (zum Beispiel Datumsfelder). Als Text wird der zu formatierende Ausdruck angegeben. Dies kann ein fester Text oder zum Beispiel der Inhalt einer Globalvariablen oder das Ergebnis anderer beliebiger infra-Makros (siehe Kapitel 15.01 infra Makros) sein.
Das zu verwendende Format bestimmt die Formatierung des Feldinhalts.
Beispiel
Das Feld «Starttermin» im Dialog der Total-Replikation soll mit dem aktuellen Datum + 1 gefüllt werden:
GwCore dialog=child(this,"DBM_AP");
GwCore feld=child(dialog,"DBM_EXPTIME");
set_text(feld,do_infra_macro(feld,"ScreenFormat(RelativeDate("+1+"),D)"));
update_buffer(feld);
Beispiel für die Wirkung des Makros ScreenFormat:
ScreenFormat("010223",D) liefert "23.02.01" als Ergebnis

update_buffer(object)
Aktualisiert die internen Programmpuffer, wenn zum Beispiel in ein Eingabefeld ein Wert geschrieben wurde. Das ist notwendig, damit das verarbeitende Programm von dem geänderten Eingabefeld informiert wird.
Als object muss der Objektzeiger des veränderten Felds mitgegeben werden.
Beispiel
Siehe Beispiel zu "do_infra_macro(object, "makros")

wait(Sekunden)
Dieses Kommando wartet die angegebene Anzahl von Sekunden, bevor das nächste Kommando ausgeführt wird. Die IMA-Anweisungen "update_buffer(...)", "control_set/clear_value(...)", "activate_control(...)" prüfen selbst, ob die Anweisung bereits ausgeführt wurde und die IMA-Datei weiter abgearbeitet werden kann oder nicht. In der Regel kann dann ohne "Wait(...)" in der IMA-Datei weitergearbeitet werden. Das gilt nicht, wenn durch eine IMA-Anweisung Dialoge geöffnet oder irgendwelche Aktionen gestartet werden.
In solch einer Situation kann zum Beispiel mit "wait(...)" gewartet werden - sinnvoller und eleganter ist aber der Einsatz einer Schleife (siehe "While(...)"), um zu prüfen, ob der gewünschte Dialog bereits existiert.
Beispiel
wait(15);             15 Sekunden warten
wait(0.5);            ½ Sekunde warten

while(Parameter)
Diese Anweisung führt eine Schleife aus, bis eine angegebene Situation eintrifft. Das ist zum Beispiel dann notwendig, wenn auf das Öffnen eines Dialogs gewartet werden muss oder geprüft werden soll, ob ein Dialog, ein Feld oder eine Schaltfläche eine Eingabe entgegennehmen kann. Es gilt zu bedenken, dass die IMA-Dateien parallel zu infra:NET - das heißt in der Regel ohne Rücksichtig auf die Reaktionsgeschwindigkeit von infra:NET ausgeführt werden (wie zum Beispiel ein schneller Anwender, der nicht auf den Bildschirm schaut).
Wichtig
Beachten Sie, dass normalerweise eine IMA-Anweisung durch ein Semikolon am Ende einer Zeile abgeschlossen wird. Die while-Anweisung darf NICHT mit einem Semikolon abgeschlossen werden, wenn die zu wiederholenden Anweisungen in den Zeilen nach der while-Anweisung aufgeführt werden. Weiterhin ist zu beachten, dass eine Gruppe von Anweisungen, die durch eine while-Anweisung wiederholt ausgeführt werden soll (Schleife), in geschweifte Klammern gesetzt werden muss (siehe Beispiel).
Handelt es sich nur um eine einzige Anweisung, die wiederholt werden soll, können die geschweiften Klammern weggelassen werden.
Beispiel
Durch eine vorherige Anweisung wird ein Meldungsfenster geöffnet, das durch eine IMA-Anweisung bestätigt werden soll:
GwCore msgbox = child(dialog,"INFRA_MESSAGEBOX");
while(!msgbox)        // Solange die Messagebox noch nicht existiert,
    {    // wiederhole folgenden Anweisungsblock...
    msgbox = child(dialog,"INFRA_MESSAGEBOX");
    wait(1);     // eine kurze Wartepause erlaubt infra:NET
          // schneller zu reagieren
    }    // ...Ende des Anweisungsblocks.
GwCore knopf = child(msgbox,"MSGBTN_1");
while(!is_sensitive(knopf))  // Solange die Schaltfläche noch nicht betätigt wurde
          // werden kann, wiederhole ...
    wait(1);     // eine kurze Wartepause erlaubt infra
          // schneller zu reagieren
activate_control(knopf); // jetzt kann die Schaltfläche betätigt werden
Hinweis
Beachten Sie, dass Pausen innerhalb der Schleifen die Arbeitsgeschwindigkeit von infra:NET merklich erhöhen, da sonst zu viel Prozessorzeit durch das Abarbeiten der Schleifen verbraucht wird.