Posts: 128
Threads: 12
Joined: Apr 2022
Reputation:
14
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
Posts: 1,002
Threads: 50
Joined: May 2022
Reputation:
27
@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
Posts: 1,002
Threads: 50
Joined: May 2022
Reputation:
27
04-18-2024, 09:43 PM
(This post was last modified: 04-18-2024, 09:43 PM by Kernelpanic.)
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.
Posts: 652
Threads: 96
Joined: Apr 2022
Reputation:
22
04-19-2024, 12:22 AM
(This post was last modified: 04-19-2024, 12:23 AM by PhilOfPerth.)
(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?
Posts: 3,966
Threads: 176
Joined: Apr 2022
Reputation:
219
(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?
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 + ...
Posts: 652
Threads: 96
Joined: Apr 2022
Reputation:
22
(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?
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)
Posts: 3,966
Threads: 176
Joined: Apr 2022
Reputation:
219
'how about this?"
screen is way too big for me
b = b + ...
Posts: 67
Threads: 18
Joined: Aug 2022
Reputation:
12
04-19-2024, 01:09 PM
(This post was last modified: 04-19-2024, 01:12 PM by TDarcos.)
(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
Posts: 67
Threads: 18
Joined: Aug 2022
Reputation:
12
(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
Posts: 1,002
Threads: 50
Joined: May 2022
Reputation:
27
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.
|