Ignazio Catanzaro

Sviluppatore Software

C# .Net

Archivio Posts
Anno 2012

Anno 2011

Anno 2010
Sondaggio
Introdurre argomenti di software engineering in un blog può essere utile?

Si
No

Gestione Handly Printer

Salve a tutti!

Chi ha a che fare con il Mobile a livello aziendale, prima o poi si ritroverà ad armeggiare con le famose Handly Printers, ovvero, stampanti termiche di piccole dimensioni utilizzate ad esempio nell'ambito della tentata vendita.

Ogni stampante termica ha un suo SDK e nel migliore dei casi un linguaggio proprietario (come ad esempio le stampanti Zebra).

Ma se volessimo semplicemente stampare del testo (ad esempio una bolla, una fattura, etc) e la nostra applicazione potrebbe usufruire potenzialmente di N diversi tipi di stampanti? Implementare nel software N SDK risulterebbe tedioso.

Come fare quindi? Semplice, utilizzando la porta seriale impostata alla connessione del dispositivo (le stampanti vengono associate al terminale Mobile tramite Bluetooth).

In basso, il listato della classe PrintEngine che permette la stampa tramite connessione seriale.
Il suo utilizzo è molto semplice :

1) Creare un nuovo oggetto di tipo PrintEngine dando al costruttore come parametro il nome della porta seriale su cui è connessa la stampante

             PrintEngine PE = new PrintEngine("COM1");

2) Aggiungere righe al documento da stampare tramite il metodo AddLine();

             PE.AddLine("Ciao io sono la prima Linea di testo");

3) Lanciare la stampa tramite Print();

             PE.Print();

4) Visualizzare un'anteprima (Opzionale) in una textbox con il metoto Preview();

//*******************************
//Ignazio Catanzaro - 2011      *
//                              * 
//For Compact Framework (CE-WM) *
//                              * 
//*******************************
using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.IO.Ports;

namespace MPPrint
{
    public class PrintEngine
    {
	private SerialPort SerialConn;
	private List<string> Lines;
	private StringBuilder PreviewBuffer;

	public PrintEngine()
	{
		this.Lines = new List<string>();

		this.SerialConn = new SerialPort();
		this.SerialConn.BaudRate = 9600;
		this.SerialConn.Parity = 0;
            	this.SerialConn.StopBits = StopBits.One;
		this.SerialConn.DataBits = 8;
	}

        ~PrintEngine()
        {
            try
            {
                if (this.SerialConn.IsOpen)
                {
                    this.SerialConn.Close();
                }
            }
            catch
            {
            }
        }

	public void AddLine(string Line)
	{
            this.Lines.Add(Line);
	}

	public void AddLine(List<string> Lines)
	{
            this.Lines.AddRange(Lines);
	}

	public void ClearLines()
	{
	    this.Lines.Clear();
	}

	public void FormFeed()
	{
	    if (this.SerialConn.IsOpen)
	    {
		this.SerialConn.Write("\f");
	    }
	}

	public void Print()
	{
		int num = 1;
		if (this.SerialConn.IsOpen)
		{
			using (List<string>.Enumerator enumerator = this.Lines.GetEnumerator())
			{
				while (enumerator.MoveNext())
				{
					string current = enumerator.Current;
					if (current == "&&FF" | current == "&&0")
					{
						if (current == "&&FF")
						{
							this.FormFeed();
						}
					}
					else
					{
						byte[] bytes = Encoding.Default.GetBytes(current);
						this.SerialConn.Write(bytes, 0, bytes.Length);
						this.SerialConn.WriteLine("\r");
						num++;
					}
				}
			}
		}
	}

	public void PrintSpace()
	{
		if (this.SerialConn.IsOpen)
		{
			short num = 1;
			do
			{
				this.SerialConn.Write(" ");
				num += 1;
			}
			while (num <= 7);
		}
	}

	public string Preview()
	{
		this.PreviewBuffer = new StringBuilder();
		using (List<string>.Enumerator enumerator = this.Lines.GetEnumerator())
		{
			while (enumerator.MoveNext())
			{
				string current = enumerator.Current;
				if (!(current == "&&1" | current == "&&0"))
				{
					this.PreviewBuffer.Append(current);
					this.PreviewBuffer.Append("\r\n");
				}
			}
		}
		return this.PreviewBuffer.ToString();
	}
    }
}

Potete ottenere risultati come questo :

Potete, ad esempio, creare un piccolo linguaggio di markup e gestire formati di stampa diversi come ho fatto io per il mio software di gestione logistica/contabilità :

Come potete notare attraverso alcuni tag speciali : <Header></Header> , <Body></Body>, <Footer></Footer>, <Compress></Compress>, etc...
posso identificare le varie "zone" del formato ed operare sulla PrintEngine in modo tale da ottenere il risultato voluto.
Altra cosa "sfiziosa" è quella di creare dei "posizionatori", ovvero, delle variabili (in celeste nel formato) che a runtime vengono
letteralmente sostituite con i valori correnti, ad esempio : @DOMAG è il magazzino del documento che a runtime verra sostituito con (1) - Centrale (vedi foto stampa).

Spero di esservi stato d'aiuto! Alla prossima!
Stay Tuned!

Categoria: Mobile Application
venerdì, 17 giu 2011 Ore. 18.02

Calendario
aprile 2024
lmmgvsd
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345
Ora e Data
Statistiche
  • Views Home Page: 32.327
  • Views Posts: 44.994
  • Views Gallerie: 0
  • n° Posts: 24
  • n° Commenti: 12
Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003