Solved

Using a POS-printer (EPSON TM-U210B) in Delphi-app.

Posted on 2001-08-16
6
7,725 Views
Last Modified: 2007-11-27
Hi,

I am developing an application that uses the EPSON TM-U210B printer. This is a POS-printer (POS=Point Of Sales).

On the EPSON-website, I have found the specific driver and also some example source code to access the printer's functions.

However, these examples are written in Visual Basic.

For example, the printer has a special function to cut off the paper. In VB the code is like:

Printer.FontSize = 10
Printer.FontName = "control"
Printer.Print "F"
Printer.EndDoc

OK, I have tried to translate this into Delphi-code by using these lines:

with Printer do
begin
  BeginDoc;
  Canvas.Font.Size := 10;
  Canvas.Font.Name := 'control';
  Canvas.TextOut(0,0,'F');
  EndDoc;
end;

However, this is not working very well. Maybe I made a big mistake by trying to translate the VB-code without asking any help to you guys...

Furthermore, by using the canvas it seems like the printer is very fast running out of memory. Someway it is only possible to add about 20 lines into the canvas-text, or it will delete the last (few) lines.

I hope there is someone who can help me with this.
If you need to have some additional information, please ask!

Thank you in advance.

RoosieDB
0
Comment
Question by:roosiedb
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 2
6 Comments
 
LVL 40

Accepted Solution

by:
Richard Quadling earned 200 total points
ID: 6396356
Printing with these printers is a strange affair in Windows.

Whilst you can use the Windows printer drivers, I have found that writing direct to the port to be far easier.

Assuming you have the printing working, then, to get the cutter working, you will need to identify the port that the printer is connected to, open it, send the cutter code and close the port.

Something like ...

var
  Device, Driver, Port: Array[0..255] Of Char;
  DeviceMode: THandle;

ComboBox1.Items.Text := Printer.Printers.Text;
Printer.PrinterIndex := ComboBox1.ItemIndex;

Printer.GetPrinter(Device,Driver,Port,DeviceMode);
Reg := TRegistry.Create;

Reg.RootKey := HKEY_LOCAL_MACHINE;
Reg.OpenKey('System\CurrentControlSet\Control\Print\Printers\'+Device+'\',False);
sPort := Reg.ReadString('Port');
Reg.CloseKey;

Then, using standard file writing, send the string

#27 + 'i' for Full Cut
or
#27 + 'm' for Partial Cut.

Regards,

Richard Quadling.
0
 
LVL 3

Expert Comment

by:VSF
ID: 6398522
The best way to print on Matrix printer AFAIK is using writeln commands, it's faster and allow you to use the printer commands, take a look at the following:

//SIMPLE PRINTing WITH WriteLn
procedure TForm1.Button1Click(Sender: TObject);
var
F : TextFile; i : integer;
begin
AssignFile(F,'LPT1');  //Assign the file to the port
Rewrite(F);
Writeln(F,'Test line - 0');
Writeln(F,'Test Line - 1');
Writeln(F, #27#69 + 'Bold Line' + #27#70);
Writeln(F, #15 + 'Compressed Mode Line' + #18);
Writeln(F,#12);        // Eject page
CloseFile(F);
end;


//BETTER PRINTING WITH WriteLn
//Demonstrates the usage of the justify function of the printer!
procedure TForm1.Button1Click(Sender: TObject);
const
  cJustif = #27#97#51;
  cEject = #12;
  { Font Size }
  c10cpi = #18;
  c12cpi = #27#77;
  c17cpi = #15;
  cIExpanded = #14;
  cFExpanded = #20;
  { Font Format }
  cIBold = #27#71;
  cFBold = #27#72;
  cIItalic = #27#52;
  cFItalic = #27#53;
var
  Text: string;
  F: TextFile;
begin
  Text := c10cpi +
  'This is a test for EPSON LX-300 Printer. ' +
  'This procedure ilustrates the usage of the JUSTIFY function of the printer' +
  'without loosing the font format: ' +
  cIbold + 'BOLD - Bold, ' + cFbold +
  cIItalic + 'ITALIC - Italic, ' + cFItalic +
  c17cpi + 'Condensed (17cpi), ' + c10cpi +
  c12cpi + '12 cpi, ' + c10cpi +
  cIExpanded + 'Expanded.' + cFExpanded +
  ' Remenber This is only a simple and incomplete sample' +
  'you can Do much more if u want to.';
  AssignFile(F, 'LPT1');
  Rewrite(F);
  try
  WriteLn(F, cJustif, Texto);
  WriteLn(F, cEject);
  finally
  CloseFile(F);
  end;
end;

Hope this helps!
VSF
www.victory.hpg.com.br

0
 

Author Comment

by:roosiedb
ID: 6403054
It was very difficult to choose between the proposed answers, however, RQuadling's solution worked after I added some code from the other comment. I don't understand because the printer's manual says that #27 + 'f' is cutting off paper, not #27 + 'i' or 'm'... But, as I said, it worked.

I have graded your solution as "average" because I still had to find out what you mean by "using standard file writing" (example?). And I still don't understand why I need to access the registry for just a simple printing job...

I hope you appreciate my honesty here and that you don't kill me???  :-)

Anyway, thank you for your help...
0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 40

Expert Comment

by:Richard Quadling
ID: 6405515
There is a difference between using the windows drivers and writing to the port directly.

In answer to your points though.

The windows drivers uses a wierd font called "Control" to talk to the printer. The characters you send using this font are very specific. And to be honest with you, I've never got them working as easily as I have with the normal control codes. Control codes aka escape sequences/control strings, normally start with an ESC (char 27) and normally contain keyboard enterable characters. But not always. Also, it is sometimes necessary to send NUL (char 0). This can be quite hard for some languages/programming.

The case of the letters is VERY important! F is not f.

ESC 'f' m n, deals with the delay for handling things like cheque printing or any other bit of paper shoved in. (m and n are delays).

I do not know if ESC 'F' is a real sequence for the TM series.

Sorry about the "standard file writing". Should have done an example.

Thanks for the points though.

If I where you, try and get hold of the Operator's manual for your printer. Normally, they contain the control strings in the appendix along with a full description. From what I can tell, the codes, when applicable, have the same meaning across the entire TM series (I've been doing this for around 11 years and that still holds true, but I think the new TM-HL series may not!).

Regards,

Richard Quadling.
0
 

Author Comment

by:roosiedb
ID: 6407790
Maybe that's what I didn't understand quite well: in the manual there was some example in Visual Basic, with something like: printer.font = "Control". And after that: printer.print "F". And now I am not using the Control-font, that explains everything!! Thank you.
0
 

Author Comment

by:roosiedb
ID: 6424446
I have posted another question about this EPSON printer problem. Could you please review this new question for me?

Rgrds,
RoosieDB
0

Featured Post

On Demand Webinar: Networking for the Cloud Era

Did you know SD-WANs can improve network connectivity? Check out this webinar to learn how an SD-WAN simplified, one-click tool can help you migrate and manage data in the cloud.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction The parallel port is a very commonly known port, it was widely used to connect a printer to the PC, if you look at the back of your computer, for those who don't have newer computers, there will be a port with 25 pins and a small print…
Have you ever had your Delphi form/application just hanging while waiting for data to load? This is the article to read if you want to learn some things about adding threads for data loading in the background. First, I'll setup a general applica…
In this video you will find out how to export Office 365 mailboxes using the built in eDiscovery tool. Bear in mind that although this method might be useful in some cases, using PST files as Office 365 backup is troublesome in a long run (more on t…
Visualize your data even better in Access queries. Given a date and a value, this lesson shows how to compare that value with the previous value, calculate the difference, and display a circle if the value is the same, an up triangle if it increased…
Suggested Courses
Course of the Month9 days, 3 hours left to enroll

615 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question