PDA

View Full Version : مشكل تازه با پرينتر سوزني LQ1170



mina291m
سه شنبه 28 خرداد 1387, 17:07 عصر
با سلام:
من يك گزارش دارم كه حتما بايد با پرينتر سوزني LQ1170 Epson پرينت گرفته بشه اما بعد از چند بار كه درست چاپ مي كنه يكي از كاغذها خراب مي شه .. خطها به صورت نا منظم و جابه جا چاپ ميشن. با FastReport و Quick Report امتحان كردم هر دو همين مشكل رو دارن. حتا يك فايل Word هم امتحان كردم اما اون هم جا به جا چاپ مي شد. در ضمن با 5-6 تا پرينتر هم امتحان كردم همين مشكل رو داشتن .
اگر كمكم كنيد ممنون مي شم............

dkhatibi
سه شنبه 28 خرداد 1387, 22:13 عصر
fبه نظر می رسه باید مشکلتونو با سازندگان پرینتز مطرج کنید.

kamrannazari
چهارشنبه 12 اسفند 1388, 01:46 صبح
همانطور كه همه اساتيد اطلاعا دارن پرينتر سوزني به ورت كاراكتر چاپ مي كنه و اگر شما از fastreport استفاده كنيد گزارش رو به صورت تصوير چاپ مي كنه كه هدف اصلي استفاده از پرينتر سوزني كه سرعت هست رو از بين مي بره ، البته فست ريپورت امكاني داره كه شما مي تونيد از ابتدا نوع گزارش خودتون رو از نوع چاپگر سوزني انتخاب كنيد ولي متاسفانه فقط براي انگليسي كار مي كنه چون فونت هاي فارسي تحت داس با ويندوز تفاوت دارن.

من سال گذشته زحمت زيادي كشيدم تا تونستم اين مشكل رو حل كنم حال قصد آموزش اون رو در اينجا دارم مطمنم بدرد خيلي ها مي خوره چون خودم خيلي اذيت شدم(با سعي و خطا كاراكتر ها رو پيدا كردم و جايگزين).

اول اين تابع رو كه نوشتم به برنامه تون اضافه كنيد.



function ToIranSystem(Str:String):String;
function IsConnected(Ch:Char):Boolean;
Begin
If Ord(Ch) in [142,147,149,151,153,155,157,159,161,168,170,172,17 4,175,224,227,228,231,232,234,236,238,240,243,245, 247,250,254] Then result:=True else Result:=False;
End;
function invert(St:String):String;
Var I:Integer;
S1:string;
B:Boolean;
Begin

If Length(St)<=1 Then S1:=St else
Begin
B:=True;
For I:=1 to Length(St) do
If (Ord(St[I]) in [140..175,224..254]) Then
//If (Ord(St[I]) in [32,125..254]) Then
B:=False;
If B Then
Begin
S1:='';
For I:=Length(St) downto 1 do
S1:=S1+St[I];
End else S1:=St;
End;
Result:=S1;

End;

Var Ch0,Ch1:Char;
InSt,OutSt,Tmp,St:String;
I:Integer;
Eng,B:Boolean;
Begin
If Length(Str)=0 Then
Begin
Result:='';
Exit;
End;
B:=True;
For I:=1 to Length(Str) do
If (Ord(Str[I]) in [129,141,142,143,144,152,192..230,236,237]) Then
//If (Ord(St[I]) in [32,125..254]) Then
B:=False;
If B Then
Begin
Result:=Str;
Exit;
End;
Begin
InSt:=Str+' ';
OutSt:='';
Ch0:=' ';
Ch1:=InSt[1];
Eng:=False;
For I:=1 to Length(InSt) do
Begin
Case Ch1 of
'0': Ch1:=#128;
'1': Ch1:=#129;
'2': Ch1:=#130;
'3': Ch1:=#131;
'4': Ch1:=#132;
'5': Ch1:=#133;
'6': Ch1:=#134;
'7': Ch1:=#135;
'8': Ch1:=#136;
'9': Ch1:=#137;
'Â': Ch1:=#141;
'Æ': Ch1:=#142;
'È': Ch1:=#147;
'': Ch1:=#149;
'Ê': Ch1:=#151;
'Ë': Ch1:=#153;
'Ì': Ch1:=#155;
'': Ch1:=#157;
'Í': Ch1:=#159;
'Î': Ch1:=#161;
'Ï': Ch1:=#162;
'Ð': Ch1:=#163;
'Ñ': Ch1:=#164;
'Ò': Ch1:=#165;
'Ž': Ch1:=#166;
'Ó': Ch1:=#168;
'Ô': Ch1:=#170;
'Õ': Ch1:=#172;
'Ö': Ch1:=#174;
'Ø': Ch1:=#175;
'Ù': Ch1:=#224;
'Ý': Ch1:=#234;
'Þ': Ch1:=#236;
'ß': Ch1:=#238;
'': Ch1:=#240;
'á': Ch1:=#243;
'ã': Ch1:=#245;
'ä': Ch1:=#247;
'æ': Ch1:=#248;
'í': Ch1:=#254;
'Ç': If IsConnected(Ch0) Then Ch1:=#145 else Ch1:=#144;
'Ú': If IsConnected(Ch0) Then Ch1:=#227 else Ch1:=#228;
'Û': If IsConnected(Ch0) Then Ch1:=#231 else Ch1:=#232;
'å': If IsConnected(Ch0) Then Ch1:=#250 else Ch1:=#251;
End;

If Not(Ord(Ch1) in [142,145,147,149,151,153,155,157,159,161,162,163,16 4,165,166,168,170,172,174,175,224,227,228,231,232, 234,236,238,240,243,245,247,248,250,254]) Then
Case Ord(Ch0) of
142:Ch0:=#143;
147:Ch0:=#146;
149:Ch0:=#148;
151:Ch0:=#150;
153:Ch0:=#152;
155:Ch0:=#154;
157:Ch0:=#156;
159:Ch0:=#158;
161:Ch0:=#160;
168:Ch0:=#167;
170:Ch0:=#169;
172:Ch0:=#171;
174:Ch0:=#173;
227:Ch0:=#226;
228:Ch0:=#225;
231:Ch0:=#230;
232:Ch0:=#229;
234:Ch0:=#233;
236:Ch0:=#235;
238:Ch0:=#237;
240:Ch0:=#239;
243:Ch0:=#241;
245:Ch0:=#244;
247:Ch0:=#246;
254:Ch0:=#252;
250:Ch0:=#249;
251:Ch0:=#249;
End;
If I=1 Then
OutSt:=Ch1
else
OutSt:=Ch1+Ch0+Copy(OutSt,2,Length(OutSt)-1);// else
If I<>Length(InSt) Then
Begin
Ch0:=Ch1;
Ch1:=InSt[i+1];
End;
End;
// OutSt:=InSt;
Tmp:='';
St:='';
Eng:=True;
For I:=1 to Length(OutSt) Do
Begin
If (Ord(OutSt[I]) in [32]) Then
Tmp:=Tmp+OutSt[I]
else
If (Ord(OutSt[I]) in [140..175,224..254]) Then
// If (Ord(OutSt[I]) in [32,125..254]) Then
Begin
If Eng Then
Begin
Tmp:=Invert(Tmp);
St:=St+Tmp;
Tmp:=OutSt[I];
End else begin
Tmp:=Tmp+OutSt[I];
End;
Eng:=False;
End else
Begin
If (Not Eng) Then
Begin
Tmp:=Invert(Tmp);
St:=St+Tmp;
Tmp:=OutSt[I];
End else begin
Tmp:=Tmp+OutSt[I];
End;
Eng:=True;
End;
End;
If Eng Then
Tmp:=Invert(Tmp);
St:=St+Tmp;
outst:=st;
Result:=OutSt;
End;
End;

kamrannazari
چهارشنبه 12 اسفند 1388, 01:51 صبح
در مرحله بعد روي آيكون فست ريپورت كليك نيد و در رويداد OnUserFunction اين رو كپي كنيد.




If UpperCase(MethodName) = Uppercase('ToIranSystem') then
Result := ToIranSystem(Params[0]);



روي فرم خود دابل كليك كنيد و در رويداد OnCreate فرم اين كد رو اضافه كنيد



frxReport1.AddFunction('Function ToIranSystem(Str:String):String;','ãÊÝÑÞå',' ÌåÊ Ç ãÊä ÝÇÑÓí ÏÑ ÒÇÑÔ åÇí ÈÇ ÇÑ ÓæÒäí ÇÒ Çíä ÊÇÈÚ ÈÑÇí ÊÈÏíá ãÊä ÝÇÑÓí Èå ãÊä ÞÇÈá Ç ÇÓÊÝÇÏå ãí ÔæÏ');



حالا مي تونيد روي آيكون فست ريپورت دابل كليك كنيد و در بخش طراحي اگر مي خوايد متني به صورت ايران سيستم روي پرينتر سوزني چاپ بشه در رويداد OnAfterdata
با استفاده از همين تابع متن رو جايگزين كنيد

قدر اين كد رو بدونيد