Xprinter 80C manuel kesme yapma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Bay_Y
Üye
Mesajlar: 116
Kayıt: 10 Mar 2014 11:12
Konum: İstanbul

Xprinter 80C manuel kesme yapma

Mesaj gönderen Bay_Y »

Herkese merhabalar ,

Xprinter 80C network üzerinden (ethernet) çalışan adisyon yazıcısı normalde otomatik kesme yapıyor dip switch ile bu şekilde ayarlı , gayet güzel kesiyor ama şöyle bir sıkıntı oluyor , Quickreport da bir fiş tasarımı yaptım , Detail ve summary kısmında ödeme kısımları yapılan alışverişe göre değiştiği için tam olarak fiş boyutunu kestirmek mümkün değil biraz boyut olarak büyük bıraktığında da birkaç fiş kestikten sonra fişi ortadan kesiyor anlayacağın kayma yapıyor her seferinde fiş boyutunu 600px ayarlamama rağmen 3-5 fiş sonra yine aynı şeyi yapıyor. (Windows üzerinden yazdırıyorum.)

Bunu aşmanın bir yolu var mı ? yok ise printer i dip switchden manuel kısma aldım şu anda fişi kesmiyor ama bu seferde fişi nasıl keseceğimi bulamadım.

bu konuda yardımcı olabilecek arkadaşlara şimdiden teşekkürler.

herkese kolay gelsin.
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Xprinter 80C manuel kesme yapma

Mesaj gönderen ertank »

Merhaba,

Yazıcı model kodu biraz daha farklı olsa gerek. Anladığım kadarıya 80mm genişlikteki kağıtlara yazdırma yapıyorsunuz. XPrinter resmi sitesinde 80C kodunda bir yazcı göremedim.
http://poskeytech.com/html/80mm-Series/

Bilgim dahilinde POS yazıcılar yazdırma görevi bittikten sonra kağıdı otomatik keserler. Benim kullandığım bütün hepsi bu şekilde idi. Belirli bir uzunluk sınırı var mı emin değilim.

Şunu deneyebilirsiniz ki benim kullanım şeklim öyle idi. Rapor aracı kullanmadan Printer nesnesini direk kullanarak yazıcıya yazdırma yapmayı deneyin. Normal koşullarda Printer.EndDoc() komutunu gönderdikten sonra pozisyon nerede kaldı ise o noktada kesme yapıyor olmasını beklerim bu durumda.

Basit bir uygulama geliştirerek (gerçek bilgiler yazmadan sadece farklı satır adedi yazdırarak gibi) test etmeniz yarım saat vaktinizi alır en fazla diye düşünüyorum. Belki aşağıdaki test edilmemiş kodu test için kullanabilirsiniz:

Kod: Tümünü seç

uses
  Printers;

procedure TForm1.Button1Click(Sender: TObject);
var
  X: Integer;
  Y: Integer;
  TextHeight: Integer;
  I: Integer;
begin
  Y := 0;
  X := 0;

  Printer.BeginDoc();
  Printer.Canvas.Font.Name := 'Courier New';
  Printer.Canvas.Font.Size := 12;
  TextHeight := Printer.Canvas.TextHeight('İĞŞ');

  for I := 1 to StrToInt(Edit1.Text) do
  begin
    Printer.Canvas.TextOut(X, Y, I.ToString());
    Inc(Y, TextHeight);
  end;

  Printer.EndDoc();
end;
Form üzerindeki TEdit bileşenine misal 10 yazdıktan sonra 3-5 defa yazdırın. Ardından 15 ile deneyin. 20 ile deneyin. Tekrar 10'a geri dönün vb. Bu şekilde doğru yerden kesiyor olursa kodunuzu Printer nesnesin direk kullanacak şekilde düzenlersiniz.

NOT: Örnek kod dialog ile yazıcı seçimi istemeden sistemde tanımlı default Printer'a yazdırma yapar.
NOT2: Eğer örnek kod içindeki font yazıcıda tanımlı değil ise desteklediği font isimlerini Printer.Fonts (TStrings) içinden okuyup uygun bir font isimi kullanmanız gerekir.
Bay_Y
Üye
Mesajlar: 116
Kayıt: 10 Mar 2014 11:12
Konum: İstanbul

Re: Xprinter 80C manuel kesme yapma

Mesaj gönderen Bay_Y »

Teşekkür ederim Ertan Bey , ben QuickReport kullanıyorum orda tasarlanmış bir form var ve bu sıkıntıları da orda yaşıyorum , sanırım ordaki form uzunluğundan dolayı , bu söylediğinizi de deneyeceğim. Ama bu quickreport da tasarım da yapılması gerektiği için devamında onu kullanmam gerekecek sanırım.
Bay_Y
Üye
Mesajlar: 116
Kayıt: 10 Mar 2014 11:12
Konum: İstanbul

Re: Xprinter 80C manuel kesme yapma

Mesaj gönderen Bay_Y »

Çok teşekkür ederim şimdilik işimi gördüm , sonrasına sonra bakarız , tekrar çok teşekkür ederim.
Bay_Y
Üye
Mesajlar: 116
Kayıt: 10 Mar 2014 11:12
Konum: İstanbul

Re: Xprinter 80C manuel kesme yapma

Mesaj gönderen Bay_Y »

Merhabalar , Çok güzel çalışıyor ama arada bir "Printing in Progress" diye hata veriyor nedeni nedir acaba sizinde başınıza geldi mi ?
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Xprinter 80C manuel kesme yapma

Mesaj gönderen ertank »

Eğer yazdığınız kod bir şekilde yazdırma işlemi bitmeden (Printer.Abort veya Printer.EndDoc kullanılmadan) çıkıyor ise bir sonraki yazdırma girişiminde bu hata mesajını alıyor olabilirsiniz. Kontrollü olmak adına kodunuzu aşağıdaki şekilde düzenlemenizde fayda var.

Kod: Tümünü seç

try
  Printer.BeginDoc();
  try
    // yazdırma işlemi kodlarınız burada olacak
  finally
    // Başladıktan sonra yazdırma işlemini mutlaka tamamlamalıyız.
    Printer.EndDoc();
  end;
except
  // hata oluşur ise yazdırma işlemini iptal ederek Printer nesnesini kullanılabilir durumda bırakmalıyız
  if Printer.Printing then Printer.Abort();
end;
Buradaki önemli nokta yazdırma görevi başladıktan sonra mutlaka bitirilmesi veya iptal edilmesi.
Bay_Y
Üye
Mesajlar: 116
Kayıt: 10 Mar 2014 11:12
Konum: İstanbul

Re: Xprinter 80C manuel kesme yapma

Mesaj gönderen Bay_Y »

Çok teşekkür ederim
Icinde farkli font kullanmak sikinti yaratir mi ?
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Xprinter 80C manuel kesme yapma

Mesaj gönderen ertank »

Kullanabilirsiniz. Sorun olmaz.
Bay_Y
Üye
Mesajlar: 116
Kayıt: 10 Mar 2014 11:12
Konum: İstanbul

Re: Xprinter 80C manuel kesme yapma

Mesaj gönderen Bay_Y »

Hızlı cevap için çok teşekkür ediyorum.
Bay_Y
Üye
Mesajlar: 116
Kayıt: 10 Mar 2014 11:12
Konum: İstanbul

Re: Xprinter 80C manuel kesme yapma

Mesaj gönderen Bay_Y »

herkese merhabalar?
gönderilen yazının yazıcıdan çıktığını teyit edebiliyor muyuz?
sorun çıkıp çıkmadığını ?

if printer.printing then
Bu yazdımı demek ?
yazmaya çalışıyor mu demek ?

bana tamam gönderdi ve yazıcıdan da çıktı gibi birşey lazım mümkünse çok şey istediğimin farkındayım ama mümkünse.
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Xprinter 80C manuel kesme yapma

Mesaj gönderen ertank »

Merhaba,

Aşağıdaki şekilde denediğiniz zaman "Printer.Printing" özelliğinin ne bilgi içerdiğini daha iyi anlayabilirsiniz.

Kod: Tümünü seç

  Printer.BeginDoc();
  ShowMessage(BoolToStr(Printer.Printing, True));
  Printer.EndDoc();
  ShowMessage(BoolToStr(Printer.Printing, True));
Windows Spooler yazıcıya bilgiyi yazıcının hafızasının kabul ettiği kadarıyla gönderebilir. Yazıcı son kağıdı yazdırır iken kağıt sıkıştırması yaşayabilir. Ancak Windows Spooler bilgi göndermeyi tamamladığı için herşey normal yazıldı diye düşünebilir. Bu gibi riskler dışında windows spooler her bir görev eklendiği veya silindiğinde (tamamlandığında) sistem çapında WM_SPOOLERSTATUS mesajı gönderir. Bu mesajı aşağıdaki gibi bir yöntem ile kontrol edip yazıcıdaki bütün görevlerin tamamlandığını anlamanız mümkün olabilir.

Kod: Tümünü seç

unit Unit1;

interface

uses
  Winapi.Windows,
  Winapi.Messages,
  System.SysUtils,
  System.Variants,
  System.Classes,
  Vcl.Graphics,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.Dialogs,
  Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
  private
    { Private declarations }
    procedure WM_SpoolerStatus(var Msg : TWMSPOOLERSTATUS); message WM_SPOOLERSTATUS;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WM_SpoolerStatus(var Msg : TWMSPOOLERSTATUS);
begin
  Memo1.Lines.Add('Yazdırma durumu: ' + IntToStr(Msg.JobStatus));
  Memo1.Lines.Add('Yazdırılacak görev adedi: ' + IntToStr(Msg.JobsLeft));
  Msg.Result := 0;
end;

end.
Bay_Y
Üye
Mesajlar: 116
Kayıt: 10 Mar 2014 11:12
Konum: İstanbul

Re: Xprinter 80C manuel kesme yapma

Mesaj gönderen Bay_Y »

Teşekkür ederim Ertan bey her zaman ki gibi can kurtaran gibi siniz. Çok Sağolun deneyeceğim.
Bay_Y
Üye
Mesajlar: 116
Kayıt: 10 Mar 2014 11:12
Konum: İstanbul

Re: Xprinter 80C manuel kesme yapma

Mesaj gönderen Bay_Y »

Kızmazsanız birşey daha sormak istiyorum.
Ben bir yazı gönderdiğimde normalde memo hiçbirşey yazmıyor normalde önce bir iş deyip sonra bekleyen iş yok demesi geremiyor mu veya önce 1 sonra 0 ama hiçbir değişiklik olmuyor.

private
{ Private declarations }
procedure WM_SpoolerStatus(var Msg : TWMSPOOLERSTATUS);
message WM_SPOOLERSTATUS;
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
Var TextHeight : integer ;
begin
Printer.BeginDoc();
Printer.Canvas.Font.Name := 'Courier New';
Printer.Canvas.Font.Size := 12;
TextHeight := Printer.Canvas.TextHeight('İĞŞ');
Printer.Canvas.TextOut(10, 10, 'PRİNTER TEST');
ShowMessage(BoolToStr(Printer.Printing, True));
Printer.EndDoc();
ShowMessage(BoolToStr(Printer.Printing, True));
end;

procedure TForm2.WM_SpoolerStatus(var Msg : TWMSPOOLERSTATUS);
begin
memo1.Lines.Add(IntToStr(msg.JobsLeft) +
' Jobs currenly in spooler');
msg.Result := 0;
end;
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Xprinter 80C manuel kesme yapma

Mesaj gönderen ertank »

Merhaba,

Windows sanırım XP sürümlerinden sonra ilgili spooler mesajını BROADCAST etmeyi bırakmış. Yeni yöntemde siz belirli yazıcı için sorgulama yapmanız gerekiyormuş.

Aşağıdaki kod ile deneme yaptığımda TMemo içinde önce 1 ve sonra 0 rakamlarını ben gördüm. Sizde de çalışacağını düşünüyorum. Yeni yöntem ile siz ihtiyacınız olduğunda bilgiyi sorguluyorsunuz. İhtiyacınıza göre belki bir TThread içinde sürekli kontrol etmek isteyebilirsiniz. Aşağıda Thread kullanım örneği eklenmemiştir.

Kod: Tümünü seç

uses
  Winapi.WinSpool;

function GetActivePrinterJobs(const PrinterName: string): string;
var
  PrinterHandle: THandle;
  PrinterInfoData: TBytes;
  PrinterInfo: TPrinterInfo2;
  BytesNeeded: Cardinal;
begin
  SetLength(PrinterInfoData, 0);
  if OpenPrinter(PChar(PrinterName), PrinterHandle, nil) then
  try
    GetPrinterW(PrinterHandle, 2, nil, 0, @BytesNeeded);
    SetLength(PrinterInfoData, BytesNeeded);

    Win32Check(GetPrinterW(PrinterHandle, 2, PrinterInfoData, Length(PrinterInfoData), @BytesNeeded));

    PrinterInfo := TPrinterInfo2(Pointer(PrinterInfoData)^);

    Result := PrinterInfo.cJobs.ToString();
  finally
    ClosePrinter(PrinterHandle);
  end;
end;
Kullanımı aşağıdaki gibi olabilir:

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
begin
  Printer.BeginDoc();
  Memo1.Lines.Add(GetActivePrinterJobs(Printer.Printers[ Printer.PrinterIndex]));
  Printer.EndDoc();
  Sleep(2000);
  Memo1.Lines.Add(GetActivePrinterJobs(Printer.Printers[ Printer.PrinterIndex]));
end;
Benim test kodum windows spooler servisinin 2 saniye içinde görevi yazıcıya tamamen gönderebileceği yönünde.

Fonksiyondan gelen 0 bilgisi yazıcının kağıda yazma işlemini tamamladığı anlamına gelmez. Windows Spooler'ın görevin tamamını yazıcıya ilettiği anlamına gelir. Yazıcıların kendi bellekleri elverdiğince yazdırma işlemleri Windows Spooler'dan çok hızlı bir şekilde gönderiliyor olabilir.
Bay_Y
Üye
Mesajlar: 116
Kayıt: 10 Mar 2014 11:12
Konum: İstanbul

Re: Xprinter 80C manuel kesme yapma

Mesaj gönderen Bay_Y »

Çok teşekkür ederim Ertan Bey ,
sağolun benim için yeterli.
Cevapla