[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Apr 2012
    Beiträge
    360

    Dialogprogramm zum Anzeigen von Nachrichten

    Hallo,
    ich habe vor das ich ein Dialogprogramm(Prototyp) schreibe,
    wo Nachrichten dem User aller Art in einem Window (Sfl-Format) angezeigt werden soll.

    Als Aufruf hätte ich mir wie folgt vorgestellt
    TextBox(anzuzeigendenText:Titel vom Window)

    Auf was sollte ich achten/berücksichtigen?
    Gib es ein Beispiel im Internet?

    Dank im Voraus

    TARKI

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Ruf' einfach das API QUILNGTX (Display Long Text) auf und übergib den Nachrichten-Text.
    Alles andere wie Seitenwechsel und Zeilenumbruch wird automatisch gesteuert.

    QUILNGTX (Display Long Text)

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  3. #3
    Registriert seit
    Apr 2012
    Beiträge
    360
    Auf das API bin ich vorher schon im Internet aufmerksam geworden.
    Ich möchte ja nur einen Text ausgeben, aber das API benötigt ja paar Parameter mehr die ich nicht anzeigen möchte:
    DMsgBox pr extpgm('QUILNGTX')
    D LngTxt 65535A
    D TextLen 10i 0 const
    D TxtTitle 7a
    D TxtMsgF 20a
    D ErrCode 16a


    Mein Programm das ich mal ausprobiert habe:
    Code:
    Hdftactgrp(*no) actgrp('QILE')                                
    Hoption(*srcstmt:*nodebugio)                                  
    D*                                                            
    DDSPTXTMSG       PR                                           
    D  InString                  65535A                            
    D  InTitle                      27    options(*nopass)         
    
    DDSPTXTMSG       PI                                           
    D  InString                  65535A                            
    D  InTitle                      27    options(*nopass)         
    
    DMsgBox           pr                  extpgm('QUILNGTX')       
    D LngTxt                     65535A                            
    D TextLen                       10i 0 const                    
    D TxtTitle                       7a                            
    D TxtMsgF                       20a                            
    D ErrCode                       16a                            
    
    d Text            s          65535A   inz(*blank)              
    d String          s          65535A   inz(*blank)              
    d Title           s              7a   inz(*blank)              
    d MessageF        s             20a   inz(*blank) 
    d Error           s             16a                              
    dTitleString     s             27    varying inz(*blank)        
    d tx              s              2 0                            
    dBlankString     s             27    inz(*blank)                
    D JobType         S              1                               
    
    DRtvJobA          pr                  extpgm('QUSRJOBI')         
    D rtv_Data                     100a                              
    Drtv_Length                    10i 0const                      
    Drtv_Format                     8a                              
    D rtv_Job                       26a                              
    Drtv_IntJob                    16a                              
    
    D p_Rcvr          S            100                               
    D p_Format        S              8    INZ('JOBI0100')            
    Dp_ThisJob       S             26    INZ('*')                   
    D p_IntJob        S             16                               
    
     /FREE                                                          
          title = *blanks;                                           
          messagef = *blanks;                                        
    
          IF %parms = 1;                                             
            String = inString;                                       
          ENDIF;                                                        
    
          IF %parms = 2;                                                
            String = inString;                                           
            TitleString = %trim(inTitle);                                
          ENDIF;                                                        
    
          IF TitleString <> *blank;                                      
            IF %len(titlestring)< 27;                                    
              tx = ((27-%len(titlestring))/2);                           
              titlestring =%subst(blankstring:1:tx) + titlestring;     
              titlestring = titlestring                                  
                          +%subst(blankstring:1:%len(titlestring));    
              IF%subst(titlestring:1:1)=*blank;                         
                 %subst(titlestring:1:1)='[';                            
              endif;                                                    
              IF%subst(titlestring:27:1)=*blank;                        
                %subst(titlestring:27:1)=']';                            
              ENDIF;                                                    
              title=%subst(titlestring:1:7);                             
             messageF=%subst(titlestring:8:20);                         
            ENDIF;                                                      
          ENDIF;                                                        
    
         Text=%trim(String);                                                      
         Error='';                                                                
         RtvJoba( p_Rcvr: %len(p_Rcvr): p_Format:p_ThisJob: p_IntJob);            
    
         JobType = %SUBST(P_Rcvr : 61 :1);                                         
         //* B/atch I/nteractive P/restart?                                        
         IF JobType = 'I';                                                        
           Text=%trim(String);                                                    
           Error='';                                                              
           MsgBox(Text: %len(Text): Title:MessageF:  Error);                      
         ENDIF;                                                                   
         RETURN;                                                                  
    
    /END-FREE
    Ist es möglich den Aufruf wie folgt zu gestalten?
    MsgBox(Text:Title);

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Was hindert dich daran?
    Du solltest die Parameter als VARYING definieren, so dass du hier die Länge abfragen kannst.

    D MyMsgBox PR
    D Text 32765 varying const
    D Title 132 varying const

    Mehr als 32K Text liest sowieso niemand.

    Was den Titel angeht, so kannst du dir in der QTEMP dynamisch eine MSGF anlegen und per
    ADD/CHGMSGD (oder dem API dazu) einer festen Nachricht immer den Titel zuordnen.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  5. #5
    Registriert seit
    Apr 2012
    Beiträge
    360
    Ich hätte das schon versucht,
    Code:
    D DSPTXTMSG       PR                                        
    D  InString                  65535A                         
    D  InTitle                      27    options(*nopass)      
    D*                                                          
    D DSPTXTMSG       PI                                        
    D  InString                  65535A                         
    D  InTitle                      27    options(*nopass)      
    D*                                                          
    D MyMsgBox        PR                  extpgm('QUILNGTX')    
    D Text                       32765    varying const         
    D Title                        132    varying const         
    DMsgBox           pr                  extpgm('QUILNGTX')        
    D LngTxt                     65535A                             
    D TextLen                       10i 0 const                     
    D TxtTitle                       7a                             
    D TxtMsgF                       20a                             
    D ErrCode                       16a                             
    
    MsgBox(Text: %len(Text): Title: MessageF:  Error);       
    MyMsgBox(Text:Title);
    aber bekomme die Fehlermeldung:
    Code:
    Nachrichten-ID . . . . :   RNQ0202       Bewertung  . . . . . . :   99         
    Nachrichtenart . . . . :   Anfrage                                             
    Sendedatum . . . . . . :   14.06.12      Sendezeit  . . . . . . :   12:04:48   
                                                                                   
    Nachricht . . . :   Der Aufruf an *LIBL/QUILNGTX wurde fehlerhaft beendet (C G 
      D F).                                                                        
    Ursache  . . . . : RPG-Prozedur DSPTXTMSG in Programm H_TESTOBJ/DSPTXTMSG hat  
      bei Anweisung 007601 Programm oder Prozedur *LIBL/QUILNGTX aufgerufen; der   
      Aufruf wurde fehlerhaft beendet. Ist der Name *N, handelte es sich bei dem   
      Aufruf um einen Bindeaufruf nach Prozedurzeiger.                             
    Fehlerbeseitigung: Das Jobprotokoll auf weitere Informationen zur              
      Fehlerursache prüfen und den für die Programmpflege verantwortlichen         
      Benutzer benachrichtigen.                                                    
    Auswahlmöglichkeiten  . . . . . . . . . . . . . . . . . . . . . . . . . :      
      D -- Einen RPG-formatierten Speicherauszug erstellen.                        
      S -- Einen Systemspeicherauszug erstellen.
    Was mache ich beim Aufruf Falsch?
    Ist das API nur für MSGF oder ist es anderes auch nutzbar?

    Dank im Voraus

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    ErrCode ist eine Struktur, die korrekt initialisiert werden muss:

    d ErrCode ds qualified inz
    d BytesAvalable 10I 0
    d BytesReturn 10I 0
    d MsgId 7
    d Reserve 1
    d MsgDta 512 <= kann beliebig sein

    Für die Prozedurdefinition:

    D pErrCode likeds(errCode)

    c/free
    ErrCode.BytesAvail = %size(ErrCode);
    errCode.BytesReturn = *Zero;

    callpr ... (...:ErrCode);

    if (errCode.bytesReturn > *Zero);
    // Fehler in ErrCode.MsgId
    endif;
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  7. #7
    Registriert seit
    Apr 2012
    Beiträge
    360
    Ich hätte das so umgesetzt wie oben beschrieben, aber es funktioniert leider nicht.
    Was mache ich falsch?
    Code:
     /TITLE                                                          
    H dftactgrp(*no) actgrp('QILE')                                  
    H option(*srcstmt:*nodebugio)                                    
    H DECEDIT('0,')  DATEDIT(*YMD)                                   
    H datfmt(*iso)                                                   
    D* externe prozedur einer Messagebox                             
    D DSPTXTMSG       PR                                             
    D  InString                  65535A                              
    D  InTitle                     132    options(*nopass)           
    D*                                                               
    D DSPTXTMSG       PI                                             
    D  InString                  65535A                              
    D  InTitle                     132    options(*nopass)           
    D*                                                               
    D MSGBOX          PR                  EXTPGM('QUILNGTX')         
    D  ParmTEXT                  65535    varying const              
    D  ParmTitle                   132    varying const              
    D pErrCode                            LIKEDS(ErrCode)            
    D                                                                
    D ErrCode         DS                  QUALIFIED                  
    D  BytesAvalable                10I 0 INZ(*ZEROS)                
    D  BytesReturn                  10I 0 INZ(*ZEROS)                
    D  MSGID                         7    INZ(*BLANKS)               
    D  RESERVE                       1    INZ(X'00')                     
    D  EXCEPTDATA                65500    INZ(*BLANKS)                   
    D                                                                    
    D MSGTEXT         S          65535    VARYING                        
    D MSGTITLE        s            132    varying inz(*blank)            
     /FREE                                                               
                                                                         
          ErrCode.BytesAvalable = %size(ErrCode);                        
          ErrCode.BytesReturn   = *ZEROS;                                
                                                                         
          IF %parms = 1;                                                 
            MSGTEXT = inString;                                          
          ENDIF;                                                         
                                                                         
          IF %parms = 2;                                                 
            MSGTEXT  = inString;                                         
            MSGTITLE = %trimr(inTitle);                                  
          ENDIF;                                                         
                                                                         
          MSGTEXT = '+                                                   
          D -- Einen RPG-formatierten Speicherauszug erstellen. +        
          S -- Einen Systemspeicherauszug erstellen.';                   
                                                                         
          callp MSGBOX(MSGTEXT: MSGTITLE: ErrCode);                      
    
          Return;                
     /END-FREE

  8. #8
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Du musst das API schon mit ALLEN REQUIRED! Parametern aufrufen und kannst nicht einfach irgendwo was weglassen!

    Das war/ist meine Prozedur, die bereits seit ein paar Jahrhunderten problemlos läuft:
    1. Parameter und Referenz-Datenstrukturen:
    Code:
         D DspWdwTxt       PR                  ExtPgm('QUILNGTX')
         D  ParmText                  65535    const options(*VarSize)
         D  ParmLenText                  10I 0 const
         D  ParmMsgId                     7A   const
         D  ParmQualMsgFile...
         D                               20A   const
         D  ParmError1                         likeDS(DS_Error1)
    
          * Error Datenstruktur
         D DS_Error1       DS                  Qualified
         D   ByteProv                    10I 0 inz(%Size(DS_Error1))
         D   ByteAvail                   10I 0 inz(*Zeros)
         D   MsgId                        7    inz(*Blanks)
         D   Reserved                     1    inz(x'00')
         D   ExceptData                 256    inz(*Blanks)
    2. Aufruf aus RPG
    Code:
         H DEBUG
          *-----------------------------------------------------------------*
         D/COPY QPROLESRC,DSPWDWTXT
         D BspText         S          65535    varying
          *-----------------------------------------------------------------*
          /Free
            BspText = 'Dies soll nur ein kurzer Text sein, um das +
                       API QUILNGTX auszuprobieren! +
                       Das UIM API QUILNGTX (Display Long Text) stellt eine +
                       einfache Möglichkeit dar, einen beliebigen Text +
                       in einem Fenster anzuzeigen. +
                       Das Erstellen einer Display-File +
                       ist dazu nicht erforderlich.';
    
             DspWdwTxt(BspText: %Len(BspText): *Blanks: *Blanks: DS_Error1);
    
            *InLR = *On;
    
          /End-Free
    3. Wrapper Procedure:
    3.1. Prototyp
    Code:
       D DspWDW          PR                  ExtProc('DSPWDW')
         D  ParmText                  65535    const varying
    3.2. Wrapper Prozedur
    Code:
         H DEBUG NoMain
          *-----------------------------------------------------------------*
         D/COPY QPROLESRC,DSPWDWTXT
         *------------------------------------------------------------------*
         P DspWDW          B                   Export
    
         D DspWdW          PI
         D  ParmText                  65535    const varying
    
          /Free
           DspWdWTxt(ParmText: %Len(ParmText): *Blanks: *Blanks: DS_Error1);
           Return;
          /End-Free
    3.3. Aufruf Wrapper Prozedur
    Code:
        H DEBUG
          *------------------------------------------------------------------*
         D/COPY QPROLESRC,DSPWDWTXT
    
         D  BspText        S         65535    const varying
         *-------------------------------------------------------------------*
          /Free
            BspText = 'Dies soll nur ein kurzer Text sein, um das +
                       API QUILNGTX auszuprobieren!';
    
            DspWDW(BspText);
    
            DspWDW('Der Text kann auch direkt übergeben werden.');
    
            *INLR = *ON;
          /End-Free
    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  9. #9
    Registriert seit
    Apr 2012
    Beiträge
    360
    Danke für die ausführliche Infos.
    Eine allerletzte Frage:
    Kann ich auch einen Zeilenumbruch einarbeiten?
    Mit
    D CrLf C const(x'0D25')
    hat es leider nicht funktioniert.

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Versuche es mal mit "/N".
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Similar Threads

  1. SDA: Std Drucker im Menü anzeigen lassen?
    By Koelch400 in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 15-08-02, 09:53
  2. Fußzeile in Windowsubfile anzeigen
    By hpw in forum NEWSboard Windows
    Antworten: 6
    Letzter Beitrag: 12-02-02, 15:27
  3. Ftp-Verbindungen anzeigen
    By sirdidi in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 11-01-02, 12:12
  4. Mit C++ AS400 Prozesse anzeigen??
    By Arbi in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 16-10-01, 19:06
  5. Zeichensatz anzeigen
    By Burgy Zapp in forum NEWSboard Server Software
    Antworten: 0
    Letzter Beitrag: 03-04-01, 19:07

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •