Xprinter 80C manuel kesme yapma
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Xprinter 80C manuel kesme yapma
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.
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.
Re: Xprinter 80C manuel kesme yapma
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:
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.
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;
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.
Re: Xprinter 80C manuel kesme yapma
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.
Re: Xprinter 80C manuel kesme yapma
Çok teşekkür ederim şimdilik işimi gördüm , sonrasına sonra bakarız , tekrar çok teşekkür ederim.
Re: Xprinter 80C manuel kesme yapma
Merhabalar , Çok güzel çalışıyor ama arada bir "Printing in Progress" diye hata veriyor nedeni nedir acaba sizinde başınıza geldi mi ?
Re: Xprinter 80C manuel kesme yapma
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.
Buradaki önemli nokta yazdırma görevi başladıktan sonra mutlaka bitirilmesi veya iptal edilmesi.
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;
Re: Xprinter 80C manuel kesme yapma
Çok teşekkür ederim
Icinde farkli font kullanmak sikinti yaratir mi ?
Icinde farkli font kullanmak sikinti yaratir mi ?
Re: Xprinter 80C manuel kesme yapma
Kullanabilirsiniz. Sorun olmaz.
Re: Xprinter 80C manuel kesme yapma
Hızlı cevap için çok teşekkür ediyorum.
Re: Xprinter 80C manuel kesme yapma
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.
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.
Re: Xprinter 80C manuel kesme yapma
Merhaba,
Aşağıdaki şekilde denediğiniz zaman "Printer.Printing" özelliğinin ne bilgi içerdiğini daha iyi anlayabilirsiniz.
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.
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));
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.
Re: Xprinter 80C manuel kesme yapma
Teşekkür ederim Ertan bey her zaman ki gibi can kurtaran gibi siniz. Çok Sağolun deneyeceğim.
Re: Xprinter 80C manuel kesme yapma
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;
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;
Re: Xprinter 80C manuel kesme yapma
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.
Kullanımı aşağıdaki gibi olabilir:
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.
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;
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;
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.
Re: Xprinter 80C manuel kesme yapma
Çok teşekkür ederim Ertan Bey ,
sağolun benim için yeterli.
sağolun benim için yeterli.