Inhalt einer Zeile eines Textfeldes auslesen

Startseite Foren Deutsches LiveCode-Forum Inhalt einer Zeile eines Textfeldes auslesen

Schlagwörter: 

Ansicht von 14 Antwort-Themen
  • Autor
    Beiträge
    • #47700
      Peter_M
      Teilnehmer

        Hallo LiveCoder,

        ist es möglich, den Textinhalt, den eine bestimmte Zeile eines Textfeldes hat, auszulesen? Danke für eure Antworten ?

        Peter

      • #47701
        Klaus Major
        Administrator

          Hi Peter,

          meinst Du:

          ...
          put line X of fld y into die_gewünschte_zeile
          ...

          Oder wäre das zu einfach? 😀

          Gruß

          Klaus

        • #47704
          Peter_M
          Teilnehmer

            Hi Klaus,  danke für deine Idee.

            Leider wird durch den line-Befehl nicht die im Textfeld angezeigte Zeile ausgegeben, sondern die Zeilenangabe identifiziert ausschließlich per “cr” produzierte Zeilen.

            LG

            Peter

          • #47705
            Klaus Major
            Administrator

              No capisce, bitte näher präzisieren!
              Meinst Du nur den sichtbaren Teil einer Zeile im Feld?

            • #47706
              Peter_M
              Teilnehmer

                Genau, gemeint ist der Teil einer Zeile, der als komplette Zeile eines Textfeldes erscheint ( in Abhängigkeit von Textfeldbreite, Fontart und -größe,word wrap eingeschaltet). Das heißt, ich möchte meinem Programm mitteilen, welcher Teil meines Textes zum Beispiel in Zeile 6 des Textfeldes angezeigt wird….

              • #47707
                Klaus Major
                Administrator

                  OK, ich denke, ich habe eine Lösung mit “measuretext”.

                  Was genau möchtest Du sehen? Wieviele Buchstaben in angezeigt werden, also
                  eventuell auch mitten im Wort, oder wieviele GANZE Wörter angezeigt werden?

                  Gruß

                  Klaus

                • #47708
                  Peter_M
                  Teilnehmer

                    <span style=”font-family: ‘courier new’, courier, monospace;”>Hallo Klaus, ich möchte den Inhalt einer bestimmten Zeile eines Textfeldes in einer Variablen abspeichern.</span>

                  • #47709
                    Klaus Major
                    Administrator

                      Ja, ich glaube, soweit waren wir schon! 😎

                      Ich meine, möchtest du den Text eventuell abgeschnitten sehen, weil er so im Textfeld erscheint?
                      Z.B.:
                      Wir freuen uns, Sie hier in unserem Hause begrü| -> Feld rechts zu Ende (…ßen zu dürfen!)
                      Oder einen sichtbaren und SINNVOLLEN Teil des Satzes, auch wenn noch ein paar Buchstaben mehr zu sehen sind:
                      Wir freuen uns, Sie hier in unserem Hause |

                      Versrtehst Du, was ich meine?

                    • #47714
                      Torsten
                      Teilnehmer

                        Hi Klaus,

                        ich habe mal kurz mit measureText probiert, indem ich eine Textbox mit Text dynamisch verändere (und damit ja auch die Umbrüche). Aber die Werte für measureText sind immer gleich. Wie willst Du da etwas rauslesen?

                        Beste Grüße

                        Torsten

                         

                      • #47715
                        Klaus Major
                        Administrator

                          Aber die Werte für measureText sind immer gleich.

                          Bei mir aber nicht! Wie misst Du denn?
                          Zeig mal Dein Skript, bitte.

                        • #47716
                          Torsten
                          Teilnehmer

                            das card script:

                            
                            on resizeStack 
                               
                               showMeasureText
                               pass resizeStack
                               
                            end resizeStack
                            
                            command showMeasureText
                               
                               put the text of field "Text" into tText
                               put measureText(tText,field "Text","width") into tWidth
                               put measureText(tText,field "Text","size") into tSize
                               put measureText(tText,field "Text","bounds") into tBounds
                               
                               put "Width:" && tWidth & cr & \
                                     "Size:" && tSize & cr & \
                                     "Bounds:" && tBounds into field "measureText"
                               
                            end showMeasureText

                            Ergebnis ist immer:

                            Width: 2002
                            Size: 2002,14
                            Bounds: 0,-11,2002,3

                          • #47717
                            Klaus Major
                            Administrator

                              Tja, wenn Du immer einen Text mit der SELBEN Länge misst, ist doch wohl nichts Anderes zu erwarten, oder? 😀

                              Hier mein Ergebnis und Skript.
                              1. Text Zeile 1 ist ein Werbetext von ADOBE:
                              “From Adobe docs: scaleMode Specifies the scaling mode of the Flash movie within the Stage. This string property has four legal values: “exactFit” , “showAll” , “noBorder” , and “noScale”.”
                              2. Feld ist 670 pixel breit.
                              3. Ich will wissen, wiewiel Text( welche Buchstaben) in der ersten Zeile angezeigt wird:

                              Button Skript:

                              on mouseUp 
                                 put line 1 of fld "f1" into tText
                                 put the millisecs into tMS
                              
                                 ## Habe einen kleinen Wert genommen um auch zu sehen wie SCHNELL measuretext
                                 ## arbeitet. SEHR schnell, kann ich sagen :-)
                                 put char 1 to 9 of tText into tText2
                                 put the width of fld 1 into Breite
                              
                                 ## Ich messe den Text mit immer einem Buchstaben mehr, bis es nicht mehr passt.
                                 repeat with i = 10 to 5000
                                    put char i of tText after tText2
                                    put measuretext(tText2,fld "f1") into tWidth
                                    ## Hier müsste man die Breite des Scrollbalken abziehen.
                                    if tWidth = (Breite - 5) then
                                       exit repeat
                                    end if
                                 end repeat
                                 put the millisecs - tMS & CR & tWidth & CR & tText2
                              end mouseUp

                              Ergebnis, muss noch etwas feingestimmt werden, kommt aber ungefähr hin:
                              —————————————
                              1
                              665
                              From Adobe docs:scaleMode Specifies the scaling mode of the Flash movie within the Stage. This string property h
                              —————————————
                              Gruß

                              Klaus

                            • #47718
                              Torsten
                              Teilnehmer

                                Ah jetzt ja!

                                Ich verstehe, worauf Du hinauswillst, jetzt musst Du allerdings z.B. die vierte Zeile auslesen, d.h. Du musst den Wert der ersten Zeile messen, dann die Breite der zweiten Zeile etc.
                                Problem könnten dabei die unterschiedlich langen Räume am rechten Rand sein, wenn umgebrochen wird. Da musst Du das letzte Wort bzw. dessen erste Buchstaben wieder abziehen, um diese für diue nächste Zeile einzusetzen.

                                In der jetzigen Form gehst Du davon aus, dass nicht umgebrochen wird, aber so kann man das Problem generell lösen, cool.

                                PS: mit dem Ansatz könnte man auch umgekehrt arbeiten, man hat einen Fliesstext im Field und will an anstatt der automatischen Umbrüche CRs setzen 😉

                                Beste Grüße
                                Torsten

                              • #47719
                                Klaus Major
                                Administrator

                                  Die Aufgabe ist, herauszufinden, wieviel Text in einer Zeile zu sehen (sic!) ist.
                                  Also füge ich einem kurzen Text immer einen weiteren Buchstaben hinzu und wenn das Ergebnis
                                  measuretext() >= (Breite des Feldes – Scrollbarbreite)
                                  ist, habe ich den SICHTBAREN String der X-ten Zeile des Feldes, den ich dann anzeigen kann.
                                  Nicht mehr und nicht weniger, n’est-ce-pas?

                                  Quasi -> reverse enginered formattedwidth

                                  Und ja, damit kann man noch eine Menge mehr machen!
                                  Funktion des Monats: measuretext() 😀

                                • #47722
                                  Torsten
                                  Teilnehmer

                                    Hallo Peter,

                                    hier ist die Funktion, die das tut, was Du brauchst, nämlich die visuell sichtbare Zeile eines Feldes auszulesen.

                                    Bedienung:
                                    put textFromLine("die Zahl meiner Zeile", "der Name des Feldes") into tMeineZeile

                                    also:
                                    put textFromLine(3, "Text") liefert den Text der dritten Zeile von field “Text”.

                                    Viel Spass damit!
                                    PS: Muchas gracias an Klaus, der den entscheidenden Tipp gegeben hat. Man muss dazu sagen, dass measureText wirklich nur die Breite des visuellen Textes misst. Um zu ermitteln, ob dieser Text in ein Feld passt, muss man noch den Scrollbar (wenn vorhanden) und die Margins (2*!) von der Breite des Feldes abziehen.

                                    Happy Scripting!
                                    Torsten

                                    Livecode:

                                    
                                    ------------------------------------------------
                                    function textFromLine tLineIndex, tFieldName
                                       ------------------------------------------------
                                       -- tLineIndex = Nummer der Zeile, deren Text man sehen möchte 
                                       -- wenn tLineIndex empty oder ein Zeichen (z.B. "alle)") ist, werden alle sichtbaren Zeilen als getrennte Zeilen zurückgegeben
                                       -- tFieldName = Name des Feldes, in dem der Text steht
                                       -------------------------------------------------
                                       
                                       put 16 into tvScrollOffset --> Breite des vertikalen Scrollbars (ist das immer so, keine Ahnung)
                                       put field tFieldName into tText
                                       put the width of field tFieldName into tFieldWidth
                                       put the margins of field tFieldName into tMargins
                                       put tFieldWidth - (tMargins * 2) into tFieldWidth
                                       if the vScrollbar of field tFieldName is true then 
                                          put tFieldWidth - tvScrollOffset into tFieldWidth
                                       end if
                                       
                                       repeat for each line tLine in tText
                                          
                                          put empty into tCurrentLine
                                          put 1 into tWordIndex
                                          put 1 into tStartWord
                                          
                                          repeat  
                                             
                                             if word tWordIndex of tLine is empty then 
                                                put word tStartWord to tWordIndex - 1 of tLine into tDisplayedLine
                                                put tDisplayedLine & return after tReturnText
                                                exit repeat
                                             end if
                                             
                                             put word tStartWord to tWordIndex of tLine into tCurrentLine
                                             put measuretext(tCurrentLine,field tFieldName) into tCurrentLineWidth
                                             
                                             if tCurrentLineWidth > tFieldWidth then
                                                
                                                subtract 1 from tWordIndex
                                                put word tStartWord to tWordIndex of tLine into tDisplayedLine
                                                put tDisplayedLine & return after tReturnText
                                                put tWordIndex + 1 into tWordIndex
                                                put tWordIndex into tStartWord
                                                next repeat
                                                
                                             end if
                                             
                                             add 1 to tWordIndex
                                             
                                          end repeat
                                          
                                       end repeat
                                       
                                       ## Wird eine Zeilennummer angegeben, beklommt man den Text genau dieser Zeile zurück
                                       ## Wenn keine Nummer übergeben wurde, wird der gesamte Text mit eingefügten Returns zurückgegeben
                                       
                                       if tLineIndex is a number then
                                          return line tLineIndex of tReturnText
                                       else
                                          return tReturnText
                                       end if
                                       
                                    end textFromLine 
                                    
                                Ansicht von 14 Antwort-Themen
                                • Du musst angemeldet sein, um auf dieses Thema antworten zu können.