همانطور كه همه اساتيد اطلاعا دارن پرينتر سوزني به ورت كاراكتر چاپ مي كنه و اگر شما از 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;