Set margin in printing GW-BASIC - printing

I'm using GW-BASIC language and I need the output to be printed at the center of the page, right now it starts from the top left of the A4 size page, can I tried to set the margin using printer preference but there is no such option.
Can anyone tell me how to set it to print to the center of the page?

No way for me to be sure what the x and y need to be for your specific message on an A4 sized paper, but using the LOCATE statement to move the cursor would be the easiest way.
Likely take trial and error to get your message to be perfectly centered on your particular display.
Quick Google got me this : GW-BASIC User's Guide - LOCATE Statement
From the site:
Syntax:
LOCATE [row][,[col][,[cursor][,[start] [,stop]]]]
Comments:
row is the screen line number, a numeric expression within the range of 1 to 25.
col is the screen column number, a numeric expression within the range of 1 to 40, or 1 to 80, depending upon screen width.
cursor is a Boolean value indicating whether the cursor is visible; zero is off, nonzero is on.
start is the cursor start scan line, a numeric expression within the range of 0 to 31.
stop is the cursor stop scan line, a numeric expression within the range of 0 to 31.
Only the first two arguments are really necessary for a simple movement of the cursor, something like:
10 LOCATE 4,20
20 PRINT "YOUR TITLE HERE"
The above would move the cursor to the 4th row and 20th column then print "YOUR TITLE HERE".

Related

ANSI control sequence: after setting line home and limit, how should cursor movements behave? which coordinates to use?

Context:
I'm working on a device which inserted between an electronic typewriter's controller and its keyboard turns it into a serial printer/terminal.
I want it to support some of the control sequences from ECMA-48 / ISO-6429 / ANSI X3.64. (also known as ANSI escape code)
I'm having some uncertainty if I'm understanding correctly the standard, so I would like to ask to know how it should be.
It's related to the commands SLH - SET LINE HOME and SLL - SET LINE LIMIT.
For example I could have the situation that I have 1/12 inch wide characters, I want a left margin of 1 inch, and 80 columns of text.
Then I would set page home to 13 and page limit to 92.
(since character positions are counted from 1, home is the first position, limit is the last)
So far ok.
But when I already have set the home, than how should the functions:
CHA - CURSOR CHARACTER ABSOLUTE
CUP - CURSOR POSITION
HPA - CHARACTER POSITION ABSOLUTE
CPR - ACTIVE POSITION REPORT
and others related to the cursor position work?
Should they use coordinates relative to to the actual edge, or to the home position.
So in my above example if I wanted to move to column 2 of the text print area (home being 13), I should use coordinate 2 or 14?
(similarly for vertical position and page home & limit)
My understanding is that these control sequences still use the absolute coordinates.
so in my example I would have to use coordinate 14.
Is this correct?
And if it is correct, this raises some additional problems:
I would have to know where the margins are to know which horizontal and vertical offset to use when moving the cursor to absolute positions.
If a program sets the margins first, then no problem, but I a program connects to the device and does not change the margins then it does not know the offset.
(There is a way, it could send a carriage return to move to the home position and then request the ACTIVE POSITION REPORT to discover the left margin position, but it does not look like a nice solution)
What should my device do if it is requested to move to a position outside the defined home and limit?
The standard says that beyond these limits no implicit movement should happen, but this is explicit movement.
If it receives a command to move to position 1 when the home is 13 what should it do? Move to 1? Move to 13? ignore?
When it is at position 15, home is at 13 and receives command to move cursor left by 4 positions should it move by 4 to 11? move by 2 to 13? ignore?
Another problem I see is that there is a command to set page home, and page limit, but not total page height.
It is only possible to select predefined formats by PFS - PAGE FORMAT SELECTION.
But I don't see a way to select any other height.
If I want to use continuous paper with 12 inch long pages (72 lines of text at 1/6 inch line height) connected together into a long tape then I see no way to define that height so that my device can correctly keep track of its positions on the following pages. Is there a way to do it?
Looks like I had to find the answers by myself.
question 0:
Yes, it appears, that the coordinates should still be absolute.
he standard says about character positions in a line and line positions in a page and these are specified in the beginning of the document and nowhere at all is said about it being relative. Looks like the only role of line home and limit is the place where CR (and some others) returns to, and limit of where implicit movement (like advancing forward after printing a character) can go, similar for page home and page limit.
question 1:
There is no easy way for a program to recognise where the home and limit positions are. As I mentioned, requesting ACTIVE POSITION REPORT can help if this is implemented. (my devece does not support it yet).
Anyway, many programs don't recognise the concept of line home, and assume that normal character positions start from 1.
My solution to this is that after power on, the line home IS exactly at position 1, and if you want something else, you have to specify it.
This way a program can safely make this assumption.
(However after the PFS - PAGE FORMAT SELECTION command I do set the line home to 1 inch as this is what the standard proposes)
question 2:
As above, the home and limit are only a margin for implicit movements. So the cursor movement commands will move outside these limits with no problem. Only the actual page size will limit them.
question 3:
(but I didn't give it a number when asked)
DTA - DIMENSION TEXT AREA is the command for this purpose. It specifies the size of the text area limited by the actual page size, not by the home and limit positions.

Vertical Spacing in ESC/POS

I'm printing an adhesive label (6x5cm) with a printer model 3nStar RPT006.
In the adhesive I am printing a title, QR code and the QR code in text
something like this
My Title
▄
qr code
Using this class as reference, I'm doing something like this:
initialize(),
setJustification(Printer.JUSTIFY_CENTER),
'My Title',
feed(),
qr(qrText),
feed(),
qrText,
feed(2),
cut(Printer.CUT_FULL, 1),
My problem is: I don't know how to control the vertical size, or how to set the height of the paper. Between each label I have a gap of 3mm.
So my question is, how should I handle the vertical spacing/height?
Currently I very close to get a perfect label, but seems like the printed label is some millimeters shorter and each time I print a label, it miss a little bit more, so there is a time where I start to cut the adhesive part and not the gap
I'm not sure if it's possible in your environment, but there are three options.
Prepare blank image data with the required number of vertical dots and print it(graphics(EscposImage $image, $size)) instead of the line feed code.
Use setLineSpacing($height) to change the height of one line only for the required part and start a new line. Then return to the original size.
Make your own customization by adding the function to feed the paper in dot units to the library for printing.
ESC J

Is there a way to automatically feed a label after each print, then automatically backfeed that fed label before the next print in Zebra printers?

I apologize for the long title, but that is exactly what I am trying to achieve.
I'll try to explain more briefly here:
So I have a Zebra ZT610 with a scanner that checks every single label as they are printed. The problem is that we're trying to print labels solely, not in batch, and the issue with that is that the printed label will always be in a position where an operator will not be able to take the label without destroying it. The issue with this is it will become a waste of labels and ribbons if this process remains as is.
How it is now (it is not really in production, but to give you an imagination):
Operator clicks on print
Zebra prints a label (and the scanner checks the label simultaneously)
Operator feeds a label (in order to take the label without destroying it)
Operator takes the label
Repeat the process
That is the issue, in theory we would have to waste HALF of the amount of available labels (assuming that all printed labels passed the inspection) in order to finish the job, which is definitely absurd and no one in the world would do this hahah
What we're trying to achieve:
Operator clicks on print
Zebra prints a label (and the scanner checks the label simultaneously)
The printer feeds a label automatically (or maybe half of a label at least for the printed label to be taken without any issue or destroying it)
Operator takes the label
Operator prints another label
Printer backfeeds the latest fed label
Printer prints on the backfed label
Continue on from step 3, and so on.
I searched for anything related to this and all what i found was this:
^XA
^FD
^XZ
All it basically those is "print" a space on a label, thus technically feeding a label. But i was never able to get that label to go back inside the printer.
Thank you for reading this far.
EDIT:
We have also tried this:
Went into the printers settings via its IP address and login
Click on 'View and Modify Printer Settings'
Click on 'General Setup'
Below you will find 'Tear Off Adjust', we've set it to the maximum (120) but that was not enough, it is still too far inside.
But i hope the solution above helps other people out there.
Take a look at the ~JS command - Change Backfeed Sequence. By overriding the default backfeed, you can force the label media to feed forward after printing, then retract on the next print.
Not knowing how much backfeed you will need, start with 50% (~JS50) and adjust from there.

Align UITextView Right and Left.

I have UITextView, which is left aligned.
When last word does not fit on current line it goes to next line leaving spaces on end of line.
which does not give good look and feel.
So, what I want that if words of particular line feels the spaces left at end.
i.e. Spaces between two words can dynamically varies.
Here I am giving example of Scenario:
The width of text view,never put off until (here tomorrow does not fit,so it goes to next line leaving spaces).
Tomorrow what you can avoid all together.
So, problem is it does look good.
What I want is:
The width of text view never put off, until (varying spaces shown by)
tomorrow -what -you -can
avoid --all -- together.
Thanks in Advance.
There is no setting for justified aligment for text you only have center, left and right. If you want justified aligment where every line has the same amount of characters or something like that you can format the text entered to have carriage returns after x amount of characters or words, or something like that.

RichEdit's ITextRange: Determine if a user's cursor is in a word?

I'm using ITextRange from a RichEdit control. I want to determine if a user's cursor is touching a word.
The problem is that calling iTextRange.expand(tomWord) will include tailing spaces:
Brackets indicate the range:
Before:
weas[]el .
After:
[weasel ].
My original plan was to expand the range, and check if it contained the cursor. But the user's cursor could be two spaces after "weasel", and the range will still expand to contain it. So what else can I do?
I can recall facing a similar problem: that is, how to select a word without selecting any trailing space. I think that code like this C++
textRange->StartOf(tomWord,tomMove,NULL);
textRange->MoveEnd(tomWord,1,NULL);
should give you the right selection, so that you can then test if the caret is in the selection.

Resources