Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
PrintW - print a long string, breaking it at the last space or hyphen before col. 79
#11
If you test your code, always test the limits.
empty strings, long strings, etc.
Yours does not like long lines without dashes or spaces
45y and 2M lines of MBASIC>BASICA>QBASIC>QBX>QB64 experience
Reply
#12
@TDarcos - Works well so far, but why doesn't it work with Locate? Why doesn't this work?

Code: (Select All)

$Console:Only

Locate 2, 3
'Print
L$ = "Four score and seven years ago our fathers brought forth on this continent, a new nation, conceived in Liberty, and dedicated to the proposition that all men are created equal."
PrintW L$
'Locate 4, 3
Print
PrintW "Now we are engaged in a great civil war, testing whether that nation, or any nation so conceived and so dedicated, can long endure. We are met on a great battle-field of that war. We have come to dedicate a portion of that field, as a final resting place for those who here gave their lives that that nation might live. It is altogether fitting and proper that we should do this."
'Locate 6, 3
Print
PrintW "But, in a larger sense, we can not dedicate, we can not consecrate, we can not hallow, this ground. The brave men, living and dead, who struggled here, have consecrated it, far above our poor power to add or detract. The world will little note, nor long remember what we say here, but it can never forget what they did here. It is for us the living, rather, to be dedicated here to the unfinished work which they who fought here have thus far so nobly advanced. It is rather for us to be here dedicated to the great task remaining before us, that from these honored dead we take increased devotion to that cause for which they gave the last full measure of devotion, that we here highly resolve that these dead shall not have died in vain, that this nation, under God, shall have a new birth of freedom, and that government of the people, by the people, for the people, shall not perish from the earth."
'Locate 8, 3
Print
Print "- Abraham Lincoln"

End
Reply
#13
Quote:@Pete  - Use arrows right and left to narrow and widen right screen margin.
Nice Pete, but it would be really great if one could change the entire output screen with the keys.  Tongue
Reply
#14
(04-17-2024, 08:57 PM)mdijkens Wrote: If you test your code, always test the limits.
empty strings, long strings, etc.
Yours does not like long lines without dashes or spaces

Not sure I understand @mdijkens...  I thought word-wrap meant to wrap the next word if the line was too long. Are you refering to extra-long words, and splitting them at a syllable with a hiphen? Long strings are handled ok with my line-wrap, but, no it doesn't split words. And as for empty strings... why would you wrap them?  Confused
Of all the places on Earth, and all the planets in the Universe, I'd rather live here (Perth, W.A.) Big Grin
Please visit my Website at: http://oldendayskids.blogspot.com/
Reply
#15
(04-19-2024, 12:22 AM)PhilOfPerth Wrote:
(04-17-2024, 08:57 PM)mdijkens Wrote: If you test your code, always test the limits.
empty strings, long strings, etc.
Yours does not like long lines without dashes or spaces

Not sure I understand @mdijkens...  I thought word-wrap meant to wrap the next word if the line was too long. Are you refering to extra-long words, and splitting them at a syllable with a hiphen? Long strings are handled ok with my line-wrap, but, no it doesn't split words. And as for empty strings... why would you wrap them?  Confused

perhaps this
Code: (Select All)
PrintW "abcdefghijklmnopqrstuvwxyzAbcdefghijklmnopqrstuvwxyzAbcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"
Sub PrintW (Msg$)
    Dim Temp$, Split$, breakspace%, breakdash%
    Temp$ = Msg$
    While Len(Temp$) > 79
        ''   Print Len(Temp$)
        Split$ = Left$(Temp$, 79)
        breakspace% = _InStrRev(Split$, " ")
        breakdash% = _InStrRev(Split$, "-")
        ''   Print Split$
        ''   Print breakspace%; breakdash%
        ''   Input X$
        If breakspace% > breakdash% Then
            Split$ = Left$(Split$, breakspace%)
            Temp$ = Mid$(Temp$, breakspace% + 1, Len(Temp$))
        Else
            Split$ = Left$(Split$, breakdash%)
            Temp$ = Mid$(Temp$, breakdash% + 1, Len(Temp$))
        End If
        ''  Print "*"; Len(Temp$)
        Print Split$
    Wend
    Print Temp$
End Sub
b = b + ...
Reply
#16
(04-19-2024, 12:32 AM)bplus Wrote:
(04-19-2024, 12:22 AM)PhilOfPerth Wrote:
(04-17-2024, 08:57 PM)mdijkens Wrote: If you test your code, always test the limits.
empty strings, long strings, etc.
Yours does not like long lines without dashes or spaces

Not sure I understand @mdijkens...  I thought word-wrap meant to wrap the next word if the line was too long. Are you refering to extra-long words, and splitting them at a syllable with a hiphen? Long strings are handled ok with my line-wrap, but, no it doesn't split words. And as for empty strings... why would you wrap them?  Confused

perhaps this
Code: (Select All)
PrintW "abcdefghijklmnopqrstuvwxyzAbcdefghijklmnopqrstuvwxyzAbcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"
Sub PrintW (Msg$)
    Dim Temp$, Split$, breakspace%, breakdash%
    Temp$ = Msg$
    While Len(Temp$) > 79
        ''   Print Len(Temp$)
        Split$ = Left$(Temp$, 79)
        breakspace% = _InStrRev(Split$, " ")
        breakdash% = _InStrRev(Split$, "-")
        ''   Print Split$
        ''   Print breakspace%; breakdash%
        ''   Input X$
        If breakspace% > breakdash% Then
            Split$ = Left$(Split$, breakspace%)
            Temp$ = Mid$(Temp$, breakspace% + 1, Len(Temp$))
        Else
            Split$ = Left$(Split$, breakdash%)
            Temp$ = Mid$(Temp$, breakdash% + 1, Len(Temp$))
        End If
        ''  Print "*"; Len(Temp$)
        Print Split$
    Wend
    Print Temp$
End Sub
I get it. Thanks bplus. But how about this?
Code: (Select All)
SetScreen:
WWidth = 1120: WHeight = 820: Mode = 32: Size = 24
Screen _NewImage(WWidth, WHeight, Mode)
SetFont: f& = _LoadFont("C:\WINDOWS\fonts\courbd.ttf", Size, "monospace"): _Font f&
lhs = (_DesktopWidth - WWidth) / 2
_ScreenMove lhs, 86 '                                                                            centre display on screen

text$ = "abcdefghijklmnopqrstuvwxyzAbcdefghijklmnopqrstuv wxyzAbcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"
text$ = text$ + text$
text$ = text$ + " " '                                                                              add space at end to catch remnant of text

LineStart = 1 '                                                                                    set linelength to be 80
LineEnd = LineStart + 79 '                                                                         LineEnd is 80
FindSpace:
Ch$ = Mid$(text$, LineEnd + 1, 1)
If Ch$ <> " " Then '                                                                               Ch$ is character after LineEnd
    LineEnd = LineEnd - 1 '                                                                        if it's NOT a space, move LineEnd left until it IS


    If LineEnd = LineStart Then
        Print Mid$(text$, LineStart, 80)
        LineStart = LineStart + 80
        LineEnd = LineStart + 79
    End If


    GoTo FindSpace
End If
Print Mid$(text$, LineStart, LineEnd - LineStart + 1) '                                            print line from linestart to lineend
LineStart = LineEnd + 2
If Mid$(text$, LineStart + 1, 1) = " " Then '                                                      if char after end is a space (it's not)
    LineStart = LineStart + 1 '                                                                    step past it for new LineStart position
End If
LineEnd = LineEnd + 80
If CsrLin > 30 Then Print: Print "Press a key for more": Sleep: Cls
If LineStart >= Len(text$) Then Sleep: System
GoTo FindSpace '                                                                                   go again if not at end of text
End

(added lines 20 to 24)
Of all the places on Earth, and all the planets in the Universe, I'd rather live here (Perth, W.A.) Big Grin
Please visit my Website at: http://oldendayskids.blogspot.com/
Reply
#17
'how about this?"

screen is way too big for me
b = b + ...
Reply
#18
(04-18-2024, 09:36 PM)Kernelpanic Wrote: @TDarcos - Works well so far, but why doesn't it work with Locate? Why doesn't this work?

Code: (Select All)

$Console:Only

Locate 2, 3
'Print
L$ = "Four score and seven years ago our fathers brought forth on this continent, a new nation, conceived in Liberty, and dedicated to the proposition that all men are created equal."
PrintW L$
'Locate 4, 3
Print
PrintW "Now we are engaged in a great civil war, testing whether that nation, or any nation so conceived and so dedicated, can long endure. We are met on a great battle-field of that war. We have come to dedicate a portion of that field, as a final resting place for those who here gave their lives that that nation might live. It is altogether fitting and proper that we should do this."
'Locate 6, 3
Print
PrintW "But, in a larger sense, we can not dedicate, we can not consecrate, we can not hallow, this ground. The brave men, living and dead, who struggled here, have consecrated it, far above our poor power to add or detract. The world will little note, nor long remember what we say here, but it can never forget what they did here. It is for us the living, rather, to be dedicated here to the unfinished work which they who fought here have thus far so nobly advanced. It is rather for us to be here dedicated to the great task remaining before us, that from these honored dead we take increased devotion to that cause for which they gave the last full measure of devotion, that we here highly resolve that these dead shall not have died in vain, that this nation, under God, shall have a new birth of freedom, and that government of the people, by the people, for the people, shall not perish from the earth."
'Locate 8, 3
Print
Print "- Abraham Lincoln"

End
Don't panic, Kernelpanic; I looked at your example, and without even having to test it, I instantly knew exactly why the locate commands you gave after the first one didn't work. But, I wanted to check. I reran my original program, only putting a locate 6,4 before the third paragraph "But in a larger sense..." and did what was expected, indented the first line 4 characters, on the 6th screen line. All the other lines start at column 1. So locate works fine. My original hypothesis as to why you couldn't get the other locate statements to work in the above program is apparently the correct one:

The locate statements would work better if they weren't commented out.
While 1
   Fix Bugs
   report all bugs fixed
   receive bug report
end while
Reply
#19
(04-17-2024, 12:06 PM)SpriggsySpriggs Wrote: I first thought this was some unicode/wide string thing since it has the "W" suffix.
QB64 is essentially a 16-bit DOS environment masquerading under the Windows GUI. As such, it can not display wide strings. It might be able to work with them if you had UTF-8 (Unicode) or UTF-16 (Windows API W-style functions) translation. For it to work natively, the program and environment would have to be Wide chararcter or Unicode aware. It also could not operate through Windows terminal as it only supports 8-bit ASCII or possibly one of the alternate Windows code pages.  Now, if sending strings to a Windows control, or handling them internally as special strings, a properly formatted wide string might work, but for ordinary PRINT output purposes, everything has to be ASCII-based (Windows API A-style functions).
While 1
   Fix Bugs
   report all bugs fixed
   receive bug report
end while
Reply
#20
Quote:The locate statements would work better if they weren't commented out.
So, for me it doesn't work with Locate; see screenshots. The SUB is apparently confused by Locate.
I commented out Locate because it doesn't work.

[Image: Text-Formatieren-Locate.jpg]
Reply




Users browsing this thread: 5 Guest(s)