[NEWSboard IBMi Forum]
Seite 2 von 2 Erste 1 2
  1. #13
    Registriert seit
    Jan 2003
    Beiträge
    759
    Code:
    D $Von            S             10I 0                                    
    D $Bis            S             10I 0                                    
    D $String         S            250A                                      
    D $I              S             10I 0                                    
    D  $Fld           S             50A   DIM(5) INZ                         
     /Free                                                                   
             $String =                                                       
            'Lorem ipsum dolor sit amet, consectetuer adipiscing elit, +     
             sed diam nonummy nibh euismod tincidunt ut laoreet dolore +     
             magna aliquam erat volutpat. Ut wisi enim ad minim veniam, +    
             quis nostrud exerci tation ullamcorper suscipit ex.';           
              $I   = 0;                                                    
              DoW $String <> *Blanks;                                      
              $Von = 1;                                                    
              $Bis = 51;                                                   
                  DoW %Subst($String:$Bis:1) <> *Blank;                    
                      $Bis -= 1;                                           
                  EndDo;                                                   
                  $I += 1;                                                 
                  $Fld($I)  = %Subst($String:$Von:$Bis-$Von);              
                  $String = %Trim(%Subst($String:$Bis));                   
              EndDo;                                                       
              *InLr = *On;                                                 
      /End-Free
    ...fehlt nur noch ein Monitor drumrum, falls mal keine Blanks zu finden sind

  2. #14
    Registriert seit
    Jan 2007
    Beiträge
    1.002
    Kann aber schon sein, dass Du mit deiner Methode u.U. sechs Felder benötigst oder?

    Nämlich in dem Fall, wenn Du ein "abgehacktes" Wort auf eine neue Zeile übertragen musst.
    kf

  3. #15
    Registriert seit
    Aug 2006
    Beiträge
    2.114
    Zitat Zitat von RobertMack Beitrag anzeigen
    [CODE]

    /Free
    $String =
    'Lorem ipsum dolor sit amet, consectetuer adipiscing elit, +
    sed diam nonummy nibh euismod tincidunt ut laoreet dolore +
    magna aliquam erat volutpat. Ut wisi enim ad minim veniam, +
    quis nostrud exerci tation ullamcorper suscipit ex.';
    Der Römer als solches würde jetzt nur Bahnhof verstehen.

    Interessant was es alles so gibt.

    GG

  4. #16
    Registriert seit
    Jan 2003
    Beiträge
    759
    Zitat Zitat von camouflage Beitrag anzeigen
    Kann aber schon sein, dass Du mit deiner Methode u.U. sechs Felder benötigst oder?

    Nämlich in dem Fall, wenn Du ein "abgehacktes" Wort auf eine neue Zeile übertragen musst.
    Ja.

    P.S. Es ging um den Ansatz (der Monitor hätte übrigens neben 51stelligen Worthülsen auch $I>5 zum Bahnhof geschickt)

  5. #17
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Warum wollt Ihr denn partout die Räder neu erfinden!

    Kopiert doch einfach den folgenden Source Code, der eine Kopie der Funktionen WRAPTEXT und REPLACE (wird aus WRAPTEXT aufgerufen) von Michael Sansosterra enthält in eine Quelle, wandelt das Ding mit 14 in ein Programm um und führt es aus!

    Code:
    D WrapText        PR         12288                                   
    D  UnfText                    8192    Varying Const Options(*VarSize)
    D  LineLen                       5  0 Const                          
    D  LineBreak                    10    Varying Const Options(*NoPass) 
                                                                         
    DReplace          PR          8192    Varying                        
    D parmSearchStr               8192    Varying Const Options(*VarSize)
    D FindStr                     8192    Varying Const Options(*VarSize)
    D ReplaceStr                  8192    Varying Const Options(*VarSize)
     //******************************************************************
    D OrigText        S            250A   Varying                        
                                                                         
    D DSText          DS                  Qualified                      
    D   Text1                       52A                                  
    D   Text2                       52A                                  
    D   Text3                       52A                                  
    D   Text4                       52A                                  
    D   Text5                       52A                                  
    D   Text6                       52A                                  
    D   FGText                      52A   Dim(6) Overlay(DSText)         
    
                                                                             
    D Index           S              3U 0                                    
     //**********************************************************************
     /Free                                                                   
        OrigText = 'Wieso sollte die Funktion WRAPTEXT von Michael +         
                    Sansosterra den Erfordernissen nicht entsprechen? +      
                    M.E. ist dies genau was gefordert wurde. +               
                    Man muss dieses Programm, das eine Kopie der +           
                    Funktion enthält umwandeln, ausführen +                  
                    und das Ergebnis anschauen!';                            
                                                                             
        DSText = WrapText(OrigText: %Len(DSText.Text1));                     
        For Index = 1 to %Elem(DSText.FGText);                               
            Dsply DSText.FGText(Index);                                      
        EndFor;                                                              
                                                                             
      *InLR       = *On;                                                     
     /END-FREE                                                               
     //**********************************************************************
    P WrapText        B                                                      
                                                                              
    D WrapText        PI         12288                                        
    D  UnfText                    8192    Varying Const Options(*VarSize)     
    D  LineLen                       5  0 Const                               
    D  LineBreak                    10    Varying Const Options(*NoPass)      
     // Work Fields                                                           
    D WrkText         s            + 1    Like(UnfText)                       
    D LineText        s          12288                                        
    D WordText        s                   Like(UnfText)                       
    D FmtText         s          12288                                        
    D WordLen         s              5  0                                     
     // Word/Line counters                                                    
    D Line            s              5  0                                     
    D Word            s              5  0                                     
     //-----------------------------------------------------------------------
     /Free                                                                    
        WrkText=%TrimL(UnfText)+' ';                                          
        If %Parms>=3;                                                         
            If %Len(LineBreak)>0;                                             
                WrkText=Replace(WrkText:LineBreak:' '+LineBreak+' ');         
            EndIf;                                                     
        EndIf;                                                         
                                                                       
        If LineLen<=*Zero Or LineLen>%Size(UnfText);                   
            Return 'INVALID LEN*';                                     
        EndIf;                                                         
                                                                       
        If UnfText=*Blank;                                             
            Return '';                                                 
        EndIf;                                                         
                                                                       
        Dow %Len(WrkText)>*Zero;                                       
                                                                       
            // Find Boundary of word                                   
            WordLen=%Scan(' ':WrkText)-1;                              
                                                                       
            If WordLen>*Zero;                                          
                                                                       
                // Test if Word length is greater than the wrap length 
                If WordLen>LineLen ;                                   
                    WordText=%Subst(WrkText:1:LineLen);                       
                    WrkText=%Subst(WrkText:LineLen+1);                        
                Else;                                                         
                    WordText=%Subst(WrkText:1:WordLen);                       
                    WrkText=%TrimL(%Subst(WrkText:WordLen+1));                
                EndIf;                                                        
                                                                              
                // Test if break was requested                                
                If %Parms=3;                                                  
                    If WordText=LineBreak;                                    
                        WordText=' ';                                         
                        ExSr BuildLine;                                       
                    EndIf;                                                    
                EndIf;                                                        
                                                                              
                // If Length of Current Line + Length of the current word     
                // > than formatted line length, make a new line              
                If     %Len(%TrimR(LineText)) + %Len(WordText)+1>LineLen      
                   And %Len(%TrimR(LineText))>0;                              
                   ExSr BuildLine;                                            
                EndIf;                                                  
                                                                        
                //  Append Word to current Line                         
                //  NOTE: Word will be blank if a line break specified  
                If WordText<>*Blanks;                                   
                    Word=Word+1;                                        
                    If Word=1;                                          
                        LineText=WordText;                              
                    Else;                                               
                        LineText=%TrimR(LineText)+' '+WordText;         
                    EndIf;                                              
                EndIf;                                                  
                                                                        
            EndIf;                                                      
        EndDo;                                                          
                                                                        
        // Build Remaining Line                                         
        If LineText<>*blanks;                                           
            ExSr BuildLine;                                             
        EndIf;                                                          
                                                                              
       Return FmtText;                                                        
                                                                              
       // Build Single Line according to the requested format width           
       BegSr BuildLine;                                                       
           Word=*Zero;                                                        
           If Line=*Zero;                                                     
               FmtText=%Subst(LineText:1:LineLen);                            
           Else;                                                              
               If LineLen*Line>%Size(FmtText);                                
                   LeaveSr;                                                   
               Else;                                                          
                   FmtText=%Subst(FmtText:1:LineLen*Line) +                   
                           %Subst(LineText:1:LineLen);                        
               EndIf;                                                         
           EndIf;                                                             
           Line=Line+1;                                                       
                                                                              
           LineText=*Blank;                                                   
       EndSr;                                                                 
                                                                              
     /End-Free                                                            
    P WrapText        E                                                   
     //*******************************************************************
     // Find and Replace a string                                         
     //*******************************************************************
    PReplace          B                                                   
    DReplace          PI          8192    Varying                         
    D parmSearchStr               8192    Varying Const Options(*VarSize) 
    D FindStr                     8192    Varying Const Options(*VarSize) 
    D ReplaceStr                  8192    Varying Const Options(*VarSize) 
                                                                          
    D SearchStr       S           8192    Varying Static                  
                                                                          
    D Pos             S              5i 0                                 
    D SL              S              5i 0                                 
    D FL              S              5i 0                                 
                                                                          
     /Free                                                                
        SearchStr=parmSearchStr;                                          
                                                                          
        FL=%Len(FindStr);                                            
        Pos=*zero;                                                   
                                                                     
        Dow pos + fl<=%Len(SearchStr);                               
            SL=pos+1;                                                
            Pos=%Scan(FindStr:SearchStr:sl);                         
                                                                     
            // Leave if search string isn't found                    
            If Pos=*Zero;                                            
                Leave;                                               
            EndIf;                                                   
                                                                     
            // Build new string with replaced text in the middle     
            If Pos + fl > %Len(SearchStr);                           
                SearchStr=%Subst(SearchStr:1:Pos-1) + ReplaceStr;    
            Else;                                                    
                 SearchStr=%Subst(SearchStr:1:Pos-1) + ReplaceStr +  
                           %Subst(SearchStr:Pos + fl);               
            EndIf;                                                   
                                                                     
            // Set starting position for search of next occurance     
            Pos=Pos+%Len(ReplaceStr)-1;                               
        EndDo;                                                        
                                                                      
        Return SearchStr;                                             
     /End-Free                                                        
    P Replace         E
    Birgitta
    Birgitta Hauser

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

  6. #18
    Registriert seit
    Jan 2012
    Beiträge
    1.199
    Hallo Panther,

    wenn die WrapText Procedure richtig arbeitet, wird sie das Rückgabefeld so mit Leerstellen aufbereiten, dass die Zerlegung mit %subst "passend" ist. Dann werden keine Wörter abgehackt.
    Also nochmal:
    Du hast ein Textfeld, in dem die Wörter alle (mit einem Leerzeichen getrennt) hintereinander stehen. Dieses Textfeld gibst du in die WrapText Procedure rein. Dafür bekommst du ein anderes Textfeld zurück:
    tempText = WrapText(text:78);
    (Du gibst die Variable "text" rein und bekommst die Variable "tempText" zurück)

    Da du dem WrapText ja mitgibst, welche Längen deine %subst - Operationen später herausschneiden (in diesem Beispiel 78 Zeichen), weiß die WrapText Routine, wie sie das Rückgabefeld "tempText" formatieren muss, dass die %subst-Operationen die Zeilen "passend" ausschneiden.

    (Das zurückgegebene Textfeld wird natürlich anders aussehen als das Textfeld, das du reingegeben hast.)

    Oder wo liegt dein Problem? Weißt du vielleicht nicht, was eine Procedure ist oder wie man WrapText kompiliert und einbindet?

    Gruß,
    Dieter


    Zitat Zitat von Panther Beitrag anzeigen
    Hallo dschroeder,

    vielen Dank für die Antwort.

    Das ist fast genau das, was ich benötige.

    Mir fehlt hier aber etwas wichtiges; ich Zitiere mich einmal :
    Ich habe ein Textfeld von 250 Zeichen. Dieses möchte ich sinnvoll, also leserlich in 5 Textfelder aufteilen.

    Mit Sinnvoll meine ich das Wörter nicht getrennt ( abgehackt ) werden.


    Panther

  7. #19
    Registriert seit
    Jan 2007
    Beiträge
    1.002
    Zitat Zitat von B.Hauser Beitrag anzeigen
    Warum wollt Ihr denn partout die Räder neu erfinden!
    @Birgitta,
    nicht neu erfinden, nur einfacher...

    Siehe hier:
    Code:
     D $strng          s           8192                                  
     D $text           s            250                                  
     D $cvtxt          DS          8192    qualified                     
     D   Feld1                       50A                                 
     D   Feld2                       50A                                 
     D   Feld3                       50A                                 
     D   Feld4                       50A                                 
     D   Feld5                       50A                                 
     D   Feld6                       50A                                 
     D $start          S              5U 0 inz(1)                        
     D $end            S              5U 0                               
     D $len            S              5U 0                               
      /free                                                              
       $text    = 'Wieso sollte die Funktion WRAPTEXT von Michael +      
                   Sansosterra den Erfordernissen nicht entsprechen? +   
                   M.E. ist dies genau was gefordert wurde. +            
                   Allerdings geht das einiges einfacher und vor allem + 
                   verständlicher. +                                     
                   Wieso mit Kanonen auf Spatzen schiessen?';            
     
       $strng = $Text;                                                    
       exsr $Wrap;                               
     
    ... do what ever you want...
     
       *inlr = *on;                                                       
     
       //  Convert Fliesstext in eine Datenstruktur                       
     
       begsr $Wrap;                                                       
         $len = %len($cvtxt.Feld1);                                       
         $end = $len;                                                     
     
         dow $strng <> *blanks;                                           
           dow %subst($strng:$end:1) <> *blank                            
               and $end > 1;                                              
             $end -= 1;                                                   
           enddo;                                                         
           if $end > $len or $end <= 1;                        // overflow
             $end = $len;                                                 
           endif;                                                         
           %subst($cvtxt:$start:$len)=%subst($strng:1:$end);
           $strng = %trim(%subst($strng:$end))+' ';                     
           $start += $len;                                              
           $end = $len;                                                 
         enddo;                                                         
       endsr;                                                           
      /end-free
    Alternativ mit Arrays arbeiten.

    @Robert
    Gute Idee der Shift - alte Schule, gelernt ist gelernt. ;-)

    Just my 2ct's
    kf

  8. #20
    Registriert seit
    Jan 2013
    Beiträge
    6
    Hallo Zusammen,

    erst einmal möchte ich mich bei allen die hier geantwortet haben bedanken.

    Ich habe es so wie Birgitta geschrieben hat umgesetzt und es funktioniert.

    Nochmals vielen Dank

Similar Threads

  1. iSeries Navigator - Verbindung trennen
    By USDAVIS in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 19-01-12, 14:03
  2. SQL -- trennen von Vorname Nachname
    By cicero22 in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 14-10-05, 06:24
  3. Verbindung PC zu AS/400 trennen!
    By c_kinkel in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 15-07-05, 09:16
  4. SQL CLI Apis: Datenbankverindung trennen
    By sim in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 30-08-04, 07:30
  5. Mehrzeiliges Textfeld
    By JoergHamacher in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 24-08-04, 12:21

Berechtigungen

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