Dotmatrix Yazıcı Programlama ve Türkçe Karakter Sorunu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
3ddark
Üye
Mesajlar: 89
Kayıt: 14 Eyl 2010 10:55
Konum: İstanbul

Dotmatrix Yazıcı Programlama ve Türkçe Karakter Sorunu

Mesaj gönderen 3ddark »

Elimde Epson LX-300+II model yazıcı var. Normal bu yazıcının türkçe desteğide bulunuyor.
Windows üzerinden herhangi bir dosyayı yazıcıya gönderince türkçe karakterleri yazdırıyor fakat resim tabanlı gönderiyor. Yani yazıcının gerçek fontu gibi yazdırmıyor. Yazılar gözle görünür derecede bozuk.

Delphi ile yazdırma kısmını aşağıdaki kodu veya buna benzer kodları kullandığımda, çok güzel şekilde yazıcı çıktısı alabiliyorum veya bilgiler yazıcıya direk gittiği için yazıcıyı programlayabiliyorum.
Örnek chr(15) gönderip yazıcıyı CONDENSED mode alabiliyorum.




Alttaki kodda yazıcı ismini verince çalışıyor.

Kod: Tümünü seç

procedure TForm1.PrintOnDotMatrix;
var
	Handle: THandle;
	N: DWORD;
	DocInfo1: TDocInfo1;
	s : string;
begin
	if not OpenPrinter(PChar('Epson LX-300+'), Handle, nil) then
	begin
		ShowMessage('Printer «DotMatrix» not found.');
		Exit;
	end;

	with DocInfo1 do
	begin
		pDocName := PChar('Document Name');
		pOutputFile := nil;
		pDataType := 'RAW';
	end;

	StartDocPrinter(Handle, 1, @DocInfo1);

	s := 'IĞÜŞİÖÇ  ığüşiöç First line of first page' + #13 + #10;
	WritePrinter(Handle, PChar(s), Length(s), N);
	s := 'Second line of first page' + #13 + #10;
	WritePrinter(Handle, PChar(s), Length(s), N);

	EndPagePrinter(Handle);
	EndDocPrinter(Handle);
	ClosePrinter(Handle);
end;

Kod: Tümünü seç

	type
  	TPassThroughData = record
	  nLength: Word;
	  Data: array[0..255] of Char;
	end;


function TFormFaturaDetaylar.DirectToPrinter(S: string; NextLine: Boolean): Boolean;
var 
  PTBlock: TPassThroughData;
  TestInt: Integer;
begin
  TestInt := PassThrough;
  if Escape(Printer.Handle, QUERYESCSUPPORT, SizeOf(TESTINT), @testint, nil) > 0 then
  begin
    if NextLine then  S := S + #13 + #10;
    StrPCopy(PTBlock.Data, S);
    PTBlock.nLength := StrLen(PTBlock.Data);
    Escape(Printer.Handle, Passthrough, 0, @PTBlock, nil);
    Result := True;
  end
  else
    Result := False;
end;



PrinterSetupDialog := TPrinterSetupDialog.Create(self);
try
	if PrinterSetupDialog.Execute then
	begin
		...
		...
		DirectToPrinter(PrintData, true);
	end;
finally
	PrinterSetupDialog.free;
end;
Şeklinde yazdırıyorum. Yukarıdaki kodda çok güzel çalışıyor. Fakat Yazıcımın Türkçe desteği olmasına rağmen. IĞÜŞİÖÇ veya ığüşiöç karakterlerini gönderince. Hatalı bilgiler gösteriyor.
Çıktıları incelediğimde PC437 US olarak bastığını görüyorum.
Yazıcının fabrika değeri de PC437 US
Forumda gördüğüm kadarıyla bazı arkadaşlar win_to_dos karakter çevrim tablosu yapın şeklinde çözüm sunmuşlar. Fakat ben zaten onu kullandım ve ĞŞ haricindeki karakterleri çeviriyor.

Ama şöylede bir durum var. WindoxXP üzerinde çalıştıra edit.com yazınca çıkan editörden Türkçe karakterleri yazıp gönderince hiç bir sorun olmadan yazdırabiliyor.

Benim anladığım Delphi ile LPT (DOT MATRİX) yazıcıya direkt olarak bilgi gönderilemiyor.

Yazıcıda PC857 Türkçe karakter seti ayarlıdır. Özellikle EPSON servisini aradım ve bir tane program gönderdiler. Program ile cihaz ayarlarını okutup teyit ettim.
Aynı zamanda Tear Off ve Load/Eject tuşlarına basılı tutarak cihazı açtım. Ayarlı fontu buradan da teyit ettim.

ANLAŞMAZLIK OLMASIN DİYE TEKRAR SÖYLÜYORUM.
NORMALDE Delphi yazıcı bileşeni Synopse veya word, excel gibi programlardan yazıcıya göndermede Türkçe karakterler sorun olmuyor. Fakat font bozuk çıkıyor. Sanki yazıyı resim tabanlı gönderiyor.
Synopse ile şu anda kullanıyorum fakat çok fazla yer kaplıyor. Condensed özelliğini veya diğer yazıcı programlama özelliklerini kullanamıyorum.
Bu yapmak istediğim ise fatura modülünün yazdırma kısmı.

Yardımlarınızı bekliyorum. Şimdiden teşekkürler.
PostgreSQL - Delphi - Linux :!:
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Dotmatrix Yazıcı Programlama ve Türkçe Karakter Sorunu

Mesaj gönderen sabanakman »

İyi günler. Hangi çevrim fonksiyonlarını kullandığınızı bilemiyorum ama OemToAnsi fonksiyonunu kullanırsanız tam çevrim elde edebilirsiniz sanırım.

Kod: Tümünü seç

function ToDos(const AnsiStr: ansiString):ansiString;
begin
  SetLength(Result, Length(AnsiStr));
  if Length(Result) > 0 then
    AnsiToOem(PansiChar(AnsiStr), PansiChar(Result));
  Result:=ReplaceStr(Result,chr(253),chr(15));
end;
Kaynak olması açısından konuyla alakalı çalışanların incelemesinde fayda olacak bir kaynak, SplPrint.pas
İyi çalışmalar.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
3ddark
Üye
Mesajlar: 89
Kayıt: 14 Eyl 2010 10:55
Konum: İstanbul

Re: Dotmatrix Yazıcı Programlama ve Türkçe Karakter Sorunu

Mesaj gönderen 3ddark »

Şaban bey,
ilginiz için teşekkür ederim.

Yazdırmak istediğim bilgiyi gönderdiğiniz ToDos fonksiyonuna gönderdim. Oradan dönen değeri de DirectToPrinter fonksiyonu ile yazdırdım.
Fakat yine sonuç aynı çıktı. Yazıcıdan doğru bilgiyi alamadım. ŞĞİ gibi karakterler bozuk çıkıyor.

Verdiğiniz pas dosyasını linkini de en kısa zamanda deneyeceğim. Sonucu burada bildiririm.
PostgreSQL - Delphi - Linux :!:
Kullanıcı avatarı
quadr
Üye
Mesajlar: 69
Kayıt: 21 Haz 2003 10:12
İletişim:

Re: Dotmatrix Yazıcı Programlama ve Türkçe Karakter Sorunu

Mesaj gönderen quadr »

Escape ile yazdır.
Bir record tanımla sonrasında escape ile yazdır.

Kod: Tümünü seç

type
  TBuffRec = record
    BuffLen : word;
    Buffer : array [0..255] of char;
  end;

var
  Buff : TBuffRec;
  S: string;
begin

 Printer.BeginDoc;

 S := 'IĞÜŞİÖÇ';
 StrPCopy(Buff.Buffer, S);
 Buff.BuffLen := StrLen(Buff.Buffer);
 Escape(Printer.Canvas.Handle,
           PASSTHROUGH,
           0,
           @Buff,
           nil);
Printer.EndDoc;

end;




Ayakkabıyı sefaletten
Çok sonraları tanıdım
Öyle ufuklarda mı olurmuş Allah'ım
Giyer giyer koşardım
Toprağın dostluğundan
Oyuncaklar yaptım çamurdan
Tenimin rengini aldım topraktan
Sen bakma esmerliğim sonradan...

http://www.tcct.us
Kullanıcı avatarı
m_ekici
Kıdemli Üye
Mesajlar: 563
Kayıt: 11 Haz 2003 06:49
Konum: Adana
İletişim:

Re: Dotmatrix Yazıcı Programlama ve Türkçe Karakter Sorunu

Mesaj gönderen m_ekici »

Çok süre geçti ama direk dos tan gönderme işlemini zamanında yapmıştım. DOS modunda iken türkçe harflari gönderdiğinde çıkıyorsa bu karakterleri delphi de çevirmen lazım.

Kod: Tümünü seç

Const
   HARF : Array[1..2,1..12] of char=(('ğ','Ğ','ü','Ü','ş','Ş','ı','İ','ö','Ö','ç','Ç'),
                                     ('§','¦','','š','Ÿ','ž','','˜','”','™','‡','€'));

WriteLn(PRN,CHR(32)+Format('%4.4s%4.4s  %-21.21s %-24.24s'+chr(15)+'  %-8.8s %-20.20s',[' ',IntToStr(SIRA),CEVIR(DET_STOKADI.Value),FloatToStr(DET_BOY.Value)+' x '+FloatToStr(DET_EN.Value),FloatToStr(DET_ADET.Value),CEVIR(DET_ACK.Value)]))

function TfMasaMenu.Cevir(A:String):String;
var
I,J : Integer;
S : String;
begin
     S:=A;
     for I:=1 to length(S) do
       for J:=1 to 12 do
         if S[I]=harf[1,J] then S[I]:=harf[2,J];
     Result:=S;
end;

ali.koskocaman
Üye
Mesajlar: 1
Kayıt: 21 Nis 2014 09:17

Re: Dotmatrix Yazıcı Programlama ve Türkçe Karakter Sorunu

Mesaj gönderen ali.koskocaman »

Merhaba arkadaşlar;
Mezuyu hortlatmak istemem lakin, yukardaki metodların hiç biri Türkçe karakterleri yazdırmıyor.

Elinde bir çözüm olan var mı?
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7588
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Re: Dotmatrix Yazıcı Programlama ve Türkçe Karakter Sorunu

Mesaj gönderen mussimsek »

Önce yazıcının Türkçe font ayarını yapmanız lazım. Kullandığınız marka ve modele göre, araştırabilirsiniz. Yazıcıyı aldığınız yerde yardımcı olabilir.

Kolay gelsin.
Kullanıcı avatarı
m_ekici
Kıdemli Üye
Mesajlar: 563
Kayıt: 11 Haz 2003 06:49
Konum: Adana
İletişim:

Re: Dotmatrix Yazıcı Programlama ve Türkçe Karakter Sorunu

Mesaj gönderen m_ekici »

Yazıcının marka model ve delphiden yazıcıya nasıl gönderdiğini yazarmısın?
Cevapla