pos机cjt_pos机的费率一般多少
本文目录一览:
lq1600KⅢ和LQ1600K色带通用不?
色 带 通 用 型 号 对 照 表 机 型 耐 力 色 带 力士牌:QR-700732/733 LUCKS TIME RECORDER 安满能:EX-6200/3200 VERTEX TR810 三星(海信):ER-350C/150/290/IBM4614/STAR SP298 STAR SP300 车和牌:NT-1110 TEC 2200 卡西信银∏欧:117ER/150ER/230ER CAL.RIBBON GR24 卡西欧:TK-1300 EPSON ERC32 希诺达滑纳宴:NICRO-XT CITIZEN IR41 高腾501/EPSON190 ERC 09 四通2810 ERC 37 TEC收款机TEC1450/4550 LQ670K+(25.4mm宽)EPSON DLQ2000 LQ670K(12.7mm宽)/640K EPSON LQ2500 西门子 450/ND98/CITIZEN IR81 OMRON RS11 EPSON LQ1900/STON 2406/LQ1800/LQ1600K I/LQ1600K II EPSON LQ1600K EPSON LQ570/LQ 300K EPSON LQ800 EPSON LQ2600K/LQ1600KIII/LQ1600K IV EPSON LQ2170 GW 6330/5330 GW5360 IBM 5573/IBM 2900 IBM2380 APTI 4100 IBM5577 H02 OKI 8358 OKI ML590 CI-300 P300 OLIVETTI 6408E CITIZEN IR60/DP600 IBM 4785 EPSON ERC11 IBM 5407 YD4408(芯)/YD4401 IBM 5418 YD4800(芯)/YD4801C/YD4406 GW9360/STAR BP2000 HYOSUNG PY2<晓星>FUJITSU DPK8100E/8200E/8300E/8408E/8500E/8600E FUJITSU DPK8100 GW 6360 EPSON DLQ1000 S/L CITIZEN IDP460 CITIZEN IR41 OKI182/390 S/L DKI 8340 S/L IBM 5417 HITACHI KD500(芯)BANK STAR 951/961 C.ITOH 650 富士通M3081/3082/3083/3084/3086 FUJITSU M304X PANASONIC 1131 PANASONIC P181—3200 EPSON LQ2900K STAR LC2430 CITIZEN 230/540/GW 5350 CITIZEN 140D HITACHI BH10/12/STAR PR12 HITACHI P580 APTI 4300/4408 IBM 4226 常 用 带 芯 规 格 表 品 名 密度 扭向 规格(MM*M) EPSON LQ1600K/LQ800/LQ300K BK/LQ1600K II H/D 直带 12.7*12 EPSON ERC18/CITIZEN DP600 PU N/D 直带 12.7*7 EPSON LQ2500/LQ670K BK H/D 直带 12.7*8 EPSON ERC30/31/32/34/35/37/38/SP300PU N/D 右扭 12.7*6 EPSON LQ2170/LQ1600KIII/LQ1600KIV BK H/D 右扭 12.7*30 EPSON ERC23/ERC39 PU N/D 右扭 12.7*3.3 STAR CR3240/FUJITSU DL3408/DL3800/P5300 BK H/D 左扭12.7*7 STAR AR4408/IBM9055/OKI8368 BK H/D 右茄态扭 12.7*7 STAR AR3240/AR1000/STONE 2403 BK H/D 左扭12.7*13 OKI 5320/LQ100/DPK8100/IBM2380/ NEC P2200/P3300/P1090/M1824 BK H/D 直带 8*1.6 STAR AR6600 BK H/D 左扭12.7*45 HITACHI KD500/IBM 5417 BK H/D 左扭25.4*60 OKI 393/8360/8570/S10 H/D 左扭12.7*30 备注:如不同型号色带的规格、扭向、高低密度一致,其带芯均可通用。 针式打印机色带分类 机 型 耐 力 色 带 支票打印机色带系列 M408(天威、红石)、UNISYS S.40(耐力) 存折打印机色带系列 南天PR2/好利获得PR2、日立580、智凯PY6800、西门子4905 韩国晓星PY2/智凯PY2/实达BP2000、IBM9068A0、 西门子4915/实达BP3000 卡钟色带系列 TR-810 B/R、GR24 B/R、LUCKS TIME B/R、IR16 B/P、IR19 B/R NIBO 8800、SD-1000 电动打字机碳带系列 BROTHER AX10、NAKAJIMA AX210、CANON AP100 CANON AP200、OLIVETTI ET121 高速行▽打系列 OKI 8370/OKI 8360、富士通M304X、P300、YD4408、YD4800 KD300/500、DFX5000/8000、1600K3、日立9000/S10、IBM4224 STAR AR6600、实达PP405/PP407、M.TALLY660/691 APTI4100/长城4100/IBM5577H02、M.TALLY660/691 M.TALLY230/330/2060/DP8800、M.TALLY660/691、OKI 8570 通用打印机色带系列 EPSON 1600K、BROTHER M1724、BROTHER M1824、AR1000 BROTHER M2024、STAR AR3240、精工SP800/四通2403 POS机系列: (收款机、收银机) MD910、ERC-05、ERC-09、ERC-18、ERC-23、ERC-27、ERC-32 ERC-35、ERC-30/34/38、ERC-37、ERC-39、GR24、IBM9068 BROTHER SR402、IBM 4614/SP300、IBM 4694/4683-3、ND77 CJTOH 650/BANK STAR 951/961、STAR MP512/MP510/SP200 TEC1040、TEC1450、TEC5500、VERIFONE 900/DP600 ATM机系列 DP600、ERC11/IBM4785/4783、富士通 7000/ND98/ORMON RS11 富士通 7045、ND9A/SP300、ND35/ND71、MAGNETEC40、IBM9055 IBM9065、NCR2140、NCR5684/5685、NCR5085、SIEMENS BEETLE 60 票据打印机色带系列 NEC P3300、NEC P5300、OKI 5320/5530、OKI 8340、DPK 8100 DL3408、DL3800、智凯C605/CITIZEN 120D、智凯PY6800 长城5360/5370/5380、EPSON DLQ1000、EPSON DLQ2000、EPSON LQ800 EPSON DLQ3000、EPSON LQ2500/670K、EPSON LQ300、EPSON LQ630、STAR NX500、LC2430/2900、CR3240/AR970/5408+、松下 1121/1090、 松下 1624、松下 181、OLIVETTI PR50/PR60 税 控 机 CITIZEN GSX140、EPSON LQ2500/LQ670K 国内】常用色带芯通用型号一览表 (仅供经销商参〖考) 带宽(mm) 带长(m) 接 法 通 用 型 号 30 100 平接 FUJITSU DPK3081/3082/3083/3084/3085/3086 25.4 60 反扭接 KD36 KD500/IBM5417 6-8 平接 EPSON DLQ2000K 20 35 反扭接 YD4408/4600 T2060 6 平接 AMT525 16 45 反扭接 FUJITSU DPK5800/6408/DL2408/2600 12.7 35-45 反扭接 OKI8360/8370/OKI393 正扭接 LQ1600KIII/2170 LQ2600 OKI8570 10-14 反扭接 NECP3/P7 GW5360/5380 MS2403 正扭接 AR3240/2463 AR1000 平接 LQ1000/1600K/1900 MS2406 LQ300/800 6-8 反扭接 MS2401/DL3600CR3240/3200/AR970T/5408/6408/3200 DPK3600E/3800 TH3070LS 正扭接 TH3070 AR4408 P5300/6300 LQ500 平接 LQ670K/LQ2500/2550 ZJ3100 DP600 4-5 正扭接 平接 SP300/IBM4614 ERC-32 ERC-28 ERC-30 ERC-37 ERC-39 TM300 ERC-38/30/34 10 25 正扭接 HPR4905 10-12 平接 M1724/2724 3 平接 M2024 KX-1624 EPSON 2828 EPSON 155 3 正扭接 ERC-27 8 28 平接 PY6800 10-15 平接 GSX140/120 GSX145 1.6-1.8 平接 LQ100/150AR951/961/GW650/6360KX-P1121 P3300/P2200/DPK8100/8200/8300/8408 IBM2380/2390/OKI5320/5330/8320/8340/OKI8358 IBM9068/BROTHER1924/1824/DLQ1000/ 得实PR60/90/PR970/GW6370/6390/PR820 6.35 12-15 反扭接 PR-2 6 平接 PR-40 2.5-3.5 平接 PR50/60
Psock是什么?
什么是流?流,简单来说就是建立在面向对象基础上的一种抽象的处理数据的工具。在流中,定义了一些处物轿理数据的基本操作,如读取数据,写入数据等,程序㊣员是对流进行所有操作的,而不用关心流的另一头数据的真正流向。流不但可︽以处理文件,还可以处理动ω 态内存、网络数据等多种数据⊙形式。如果你对流〓的操作非常熟练,在程序中利用流的方便性,写起程序会大大提高效率的。
下面,笔者通过四个实例:EXE文件加密器、电子贺卡、自制OICQ和网络屏幕传输来说明Delphi编程中“流”的利用。这些例子中的一些技巧曾经是很多软件的秘密而不公开的,现在大家可以无偿的直接引用其中的代码了。
“万丈高楼平地起▲”,在分析实例之前,我们先来了解一下流的基本概念和函数,只有在理解了这些基本的东西后我们才能进行下一步。请务◣必认真领会这些基本方法。当然,如果你对它们已经很熟悉了,则可以跳过这一步。
一、Delphi中流的基本概念及函数声明
在Delphi中,所有流对象的基类为TStream类,其中定义了所有流的共同属性和方法。
TStream类中定义的属性介绍如下:
1、Size:此属性以字节返回流中数据大小。
2、Position:此属性控制流中存取指针的位置。
Tstream中定义的虚方法有四个:
1、Read:此方法实现将数据从↑流中读出。函◤数原形为■:
Function Read(var Buffer;Count:Longint):Longint;virtual;abstract;
参数Buffer为数据读出时放置的缓冲区,Count为需要读出的数据的字节数,该方法返回值为者蚂郑实际读出的字节数,它可以∩小于或等于Count中指定的值。
2、Write:此方法实现将数据写入流中。函数☉原形为:
Function Write(var Buffer;Count:Longint):Longint;virtual;abstract;
参数Buffer为将要写入流中的数々据的缓冲区,Count为数据的长度字节数,该方法返回值为实际写入流中的字节数。
3、Seek:此方法实现流中读取指∴针的移动。函数原形为:
Function Seek(Offset:Longint;Origint:Word):Longint;virtual;abstract;
参数Offset为偏移字∞节数,参数Origint指出Offset的实际意义,其可能的取值如下:
soFromBeginning:Offset为移动后指针距离数据开始的位置。此时Offset必须大于或者等于零。
soFromCurrent:Offset为移动后指针与当前指针的相对位置。
soFromEnd:Offset为移动后指针距离数据结束的位置。此时Offset必须小于或者等于零。该方法返回值为移动后指针的位置。
4、Setsize:此方法实现改变数据的大小。函数原形为:
Function Setsize(NewSize:Longint);virtual;
另外,TStream类中还定义了几个静态方法:
1、ReadBuffer:此方法的作用是从流中当前位置读取数据。函数原形为:
Procedure ReadBuffer(var Buffer;Count:Longint);
参数的定义跟上面的Read相同。注意:首颂当读取的数据字节数与需要读取的字节数不相同时,将产生EReadError异常。
2、WriteBuffer:此方法的作用是在当前位置向流写入数据。函数原形为:
Procedure WriteBuffer(var Buffer;Count:Longint);
参数的定义跟上面的Write相同。注意:当写入的数据字节数与需要写入◆的字节数不相同时,将产生EWriteError异常。
3、CopyFrom:此方法的作用是从其它流中拷贝数据流。函数原形为:
Function CopyFrom(Source:TStream;Count:Longint):Longint;
参数Source为提供数据的流,Count为拷贝的数据字节数。当Count大于0时,CopyFrom从Source参数的当前位置拷贝Count个字节的数据;当Count等于0时,CopyFrom设置Source参数的Position属性为0,然后拷贝Source的所有数据;
TStream还有其它派生类,其中最常用的是TFileStream类。使用TFileStream类来存取文件,首先要□ 建立一个实例。声明如下:
constructor Create(const Filename:string;Mode:Word);
Filename为文件名(包括路径),参数Mode为打开文件的方式,它包括文件的打开模式和共享模式,其可能的取值和意义如下:
打开模式:
fmCreate :用指定的文件名建立文件,如果文件已经存在则打开它。
fmOpenRead :以只读方式打开指定文件
fmOpenWrite :以只写方式打开指定文件
fmOpenReadWrite:以写写方式打开指定文件
共享模式:
fmShareCompat :共享模式与FCBs兼容
fmShareExclusive:不允许别的程序以任何方式打开该文件
fmShareDenyWrite:不允许别的程序以写∩方式打开该文件
fmShareDenyRead :不允许别的程序以读方式打开该文件
fmShareDenyNone :别的程序可以以任何方式打开该文件
TStream还有一个派生类TMemoryStream,实际应用中用的次数也非常频繁。它叫内存流,就是说在内存中建立一个流对象。它的基本方法和函数跟上面是一样的。
好了,有了︾上面的基础后,我们就可以开始我们的编程之行了。
-----------------------------------------------------------------------
二、实际应用之一:利用流制作EXE文件加密器、捆绑、自解压文件及安装程序
我们先来说一下如★何制作一个EXE文件加密器吧。
EXE文件加密器的原理:建立两个文件,一个用来添加资源到另外一个EXE文件里面,称为添加程序。另外ξ一个被添加的EXE文件称为头文件。该程序的功能是把添加到自己里面的文件读出来。Windows下的EXE文件∞结构比较复杂,有的程序还有校验和,当发现自己被改变后○会认为自己被病毒感染而拒绝执行。所以我们把文件添〖加到自己的程序里面,这样就不会改变原来的文件结构了。我们先写一个添加函数,该函数的功能是把一个文件当作一个流添加到另外一个文件的尾部。函数如下:
Function Cjt_AddtoFile(SourceFile,TargetFile:string):Boolean;
var
Target,Source:TFileStream;
MyFileSize:integer;
begin
try
Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareExclusive);
Target:=TFileStream.Create(TargetFile,fmOpenWrite or fmShareExclusive);
try
Target.Seek(0,soFromEnd);//往尾部添加资源
Target.CopyFrom(Source,0);
MyFileSize:=Source.Size+Sizeof(MyFileSize);//计算资源大小,并〓写入辅程尾部
Target.WriteBuffer(MyFileSize,sizeof(MyFileSize));
finally
Target.Free;
Source.Free;
end;
except
Result:=False;
Exit;
end;
Result:=True;
end;
有了上面的基础,我们应该很容易◥看得懂这个函数。其中参数SourceFile是要♀添加的文件,参数TargetFile是被添加到的目标文件。比如说把a.exe添加到b.exe里面可以:Cjt_AddtoFile('a.exe',b.exe');如果添加成功就返回True否则返≡回假。
根据上面的函数我们♀可以写出相反的读出函数:
Function Cjt_LoadFromFile(SourceFile,TargetFile :string):Boolean;
var
Source:TFileStream;
Target:TMemoryStream;
MyFileSize:integer;
begin
try
Target:=TMemoryStream.Create;
Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareDenyNone);
try
Source.Seek(-sizeof(MyFileSize),soFromEnd);
Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));//读出资源大小
Source.Seek(-MyFileSize,soFromEnd);//定位到资源位置
Target.CopyFrom(Source,MyFileSize-sizeof(MyFileSize));//取出资源
Target.SaveToFile(TargetFile);//存放到文件
finally
Target.Free;
Source.Free;
end;
except
Result:=false;
Exit;
end;
Result:=true;
end;
其中参数SourceFile是已经添加了文件的文件名称,参数TargetFile是取出文件后保存的目标文Ψ件名。比如说Cjt_LoadFromFile('b.exe','a.txt');在b.exe中取出文件保存为a.txt。如果取出成功就返回True否则返回假。
打开Delphi,新建》一个工程,在窗口上放上一∴个Edit控件Edit1和两个Button:Button1和Button2。Button的Caption属性分别设置为“确定”和“取消”。在Button1的Click事件中写代码:
var S:string;
begin
S:=ChangeFileExt(Application.ExeName,'.Cjt');
if Edit1.Text='790617' then
begin
Cjt_LoadFromFile(Application.ExeName,S);
{取出文件保存在当前路径下并命名"原文件.Cjt"}
Winexec(pchar(S),SW_Show);{运行"原文件.Cjt"}
Application.Terminate;{退出程序}
end
else
Application.MessageBox('密码不对,请重新输入!','密码错误',MB_ICONERROR+MB_OK);
编译这个程序,并把EXE文件改名为head.exe。新建一个文本文件head.rc,内容为: head exefile head.exe,然后把它们拷贝到Delphi的BIN目录下,执行Dos命令Brcc32.exe head.rc,将产生一【个head.res的文件,这个文件就是我们要的资源文件,先留着。
我们的头文件已经建立了,下面我们来建立添加程序。
新建一个工程,放上以下控件:一个Edit,一个Opendialog,两个Button1的Caption属性分别设置为"选择文件"和"加密"。在源程序中添加一句:{$R head.res}并把head.res文件拷贝到程△序当前目录下。这样一来就把刚才的head.exe跟程序一起编译了。
在Button1的Cilck事件里面写下代码:
if OpenDialog1.Execute then Edit1.Text:=OpenDialog1.FileName;
在Button2的Cilck事件里面写下代码:
var S:String;
begin
S:=ExtractFilePath(Edit1.Text);
if ExtractRes('exefile','head',S+'head.exe') then
if Cjt_AddtoFile(Edit1.Text,S+'head.exe') then
if DeleteFile(Edit1.Text) then
if RenameFile(S+'head.exe',Edit1.Text) then
Application.MessageBox('文件加密成功!','信息',MB_ICONINFORMATION+MB_OK)
else
begin
if FileExists(S+'head.exe') then DeleteFile(S+'head.exe');
Application.MessageBox('文件加密失败!','信息',MB_ICONINFORMATION+MB_OK)
end;
end;
其中ExtractRes为自定义函数,它的作用是把head.exe从资源文件中取出来。
Function ExtractRes(ResType, ResName, ResNewName : String):boolean;
var
Res : TResourceStream;
begin
try
Res := TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
try
Res.SavetoFile(ResNewName);
Result:=true;
finally
Res.Free;
end;
except
Result:=false;
end;
end;
注意:我们上面的函数只不过是简单的把一个文件添加到另一个文件的尾部。实际应用中可以改成可以添加多个文件,只要根据实际大小和个数定义好偏移地址就可以了。比如说文件捆绑机就是把两个或者多个程序添加到一个头文件里面。那些自解压程序和安装程序的原理也是一样的,不过多了压缩而已。比如说我们可以引用╱一个LAH单元,把流压缩后再添加,这样文件就会变的很小。读出来时先解压就可以了。另外,文中EXE加密器的例子还有很多不完善的地方,比如说密码固定为"790617",取出EXE运行ω后应该等它运行完毕后删除等等,读者可以自行修改。
---------------------------------------------------------------------
三、实际应用之二:利用流制作可执行电子贺卡
我们经常看到一些电子贺卡之类的制作软件,可以〗让你自己选择图片,然后它会生成一个EXE可执行文件给你。打开贺卡时就会一边放音乐一边显示出图片来。现在学了流操作之后,我们也可以做一个了。
添加图片过程我们可以直接用前面的Cjt_AddtoFile,而现在要做的是如何把图像读出并显示。我们用前面的Cjt_LoadFromFile先把图片读出来保存为文ω 件再调入也是可以的,但是还有更简单的方法,就是直接把文『件流读出来显示,有了流这个利器,一切都变的简单了。
现在的图片比较流行的是BMP格式和JPG格式。我们现在就针对这两种图片写出读取并显示函数。
Function Cjt_BmpLoad(ImgBmp:TImage;SourceFile:String):Boolean;
var
Source:TFileStream;
MyFileSize:integer;
begin
Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareDenyNone);
try
try
Source.Seek(-sizeof(MyFileSize),soFromEnd);
Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));//读出资源
Source.Seek(-MyFileSize,soFromEnd);//定位到资源开◆始位置
ImgBmp.Picture.Bitmap.LoadFromStream(Source);
finally
Source.Free;
end;
except
Result:=False;
Exit;
end;
Result:=True;
end;
上面是读出BMP图片的,下面的是读出JPG图片的函数,因〓为要用到JPG单元,所以要在程序中添加一句:uses jpeg。
Function Cjt_JpgLoad(JpgImg:Timage;SourceFile:String):Boolean;
var
Source:TFileStream;
MyFileSize:integer;
Myjpg: TJpegImage;
begin
try
Myjpg:= TJpegImage.Create;
Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareDenyNone);
try
Source.Seek(-sizeof(MyFileSize),soFromEnd);
Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));
Source.Seek(-MyFileSize,soFromEnd);
Myjpg.LoadFromStream(Source);
JpgImg.Picture.Bitmap.Assign(Myjpg);
finally
Source.Free;
Myjpg.free;
end;
except
Result:=false;
Exit;
end;
Result:=true;
end;
有了这两个函数,我们就可以制作读出程序了。下面我们以BMP图片为例:
运行Delphi,新建一个工程,放上一个显示图像控件Image1。在窗口的Create事件中写上一句就可以了:
Cjt_BmpLoad(Image1,Application.ExeName);
这个就是头文件了,然后我们用前面的方法生成一个head.res资源文件。
下面就可以开始制作我们≡的添加程序了。全部代︾码如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, ExtDlgs;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
OpenPictureDialog1: TOpenPictureDialog;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
Function ExtractRes(ResType, ResName, ResNewName : String):boolean;
Function Cjt_AddtoFile(SourceFile,TargetFile:string):Boolean;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
Function TForm1.ExtractRes(ResType, ResName, ResNewName : String):boolean;
var
Res : TResourceStream;
begin
try
Res := TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
try
Res.SavetoFile(ResNewName);
Result:=true;
finally
Res.Free;
end;
except
Result:=false;
end;
end;
Function TForm1.Cjt_AddtoFile(SourceFile,TargetFile:string):Boolean;
var
Target,Source:TFileStream;
MyFileSize:integer;
begin
try
Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareExclusive);
Target:=TFileStream.Create(TargetFile,fmOpenWrite or fmShareExclusive);
try
Target.Seek(0,soFromEnd);//往尾部添加资源
Target.CopyFrom(Source,0);
MyFileSize:=Source.Size+Sizeof(MyFileSize);//计算资源大小,并写入辅程尾部
Target.WriteBuffer(MyFileSize,sizeof(MyFileSize));
finally
Target.Free;
Source.Free;
end;
except
Result:=False;
Exit;
end;
Result:=True;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Caption:='Bmp2Exe演示程序.作者:陈经韬';
Edit1.Text:='';
OpenPictureDialog1.DefaultExt := GraphicExtension(TBitmap);
OpenPictureDialog1.Filter := GraphicFilter(TBitmap);
Button1.Caption:='选择BMP图片';
Button2.Caption:='生成EXE';
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenPictureDialog1.Execute then
Edit1.Text:=OpenPictureDialog1.FileName;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
HeadTemp:String;
begin
if Not FileExists(Edit1.Text) then
begin
Application.MessageBox('BMP图片文件不存在,请重新选择!','信息',MB_ICONINFORMATION+MB_OK)
Exit;
end;
HeadTemp:=ChangeFileExt(Edit1.Text,'.exe');
if ExtractRes('exefile','head',HeadTemp) then
if Cjt_AddtoFile(Edit1.Text,HeadTemp) then
Application.MessageBox('EXE文件生成成功!','信息',MB_ICONINFORMATION+MB_OK)
else
begin
if FileExists(HeadTemp) then DeleteFile(HeadTemp);
Application.MessageBox('EXE文件生成失败!','信息',MB_ICONINFORMATION+MB_OK)
end;
end;
end.
怎么样?很神奇吧:)把程序界面弄的漂亮点,再添加一些功能,你会发现比」起那些要注册的软件来也不会逊多少吧。
-----------------------------------------------------------------------
实际应用之三:利用流制作自▲己的OICQ
OICQ是深圳腾讯公司的一个网络实时通讯软件,在国内拥有大量的用户群。但OICQ必须连接上互联网登陆到腾讯的服务器才能使用。所以我们可以自己写一个在局部网里面使用。
OICQ使用的是UDP协议,这是一种无连接协议,即通信双方不用建立连接就可以发送信息,所以效率比较高。Delphi本身自带的FastNEt公司的NMUDP控件●就是一个UDP协议的用户数据报控件。不过要注意的是如果你使用了这个控件必须退出程序才能关闭计算机,因为TNMXXX控件有BUG。所有nm控件的基础 PowerSocket用到的ThreadTimer,用到一个隐藏的窗口(类为TmrWindowClass)处理有硬伤。
出问题的地方:
Psock::TThreadTimer::WndProc(var msg:TMessage)
if msg.message=WM_TIMER then
他自己处理
msg.result:=0
else
msg.result:=DefWindowProc(0,....)
end
问题就出在调用 DefWindowProc时,传输的HWND参数居然是常数0,这样实际上DefWindowProc是不能工作的,对任何输入的消息的调用均返回0,包括WM_QUERYENDSESSION,所以〒不能退出windows。由于DefWindowProc的不正常调用,实际上除WM_TIMER,其他消息由DefWindowProc处理都是无效的。
解决的办法是在 PSock.pas
在 TThreadTimer.Wndproc 内
Result := DefWindowProc( 0, Msg, WPARAM, LPARAM );
改为:
Result := DefWindowProc( FWindowHandle, Msg, WPARAM, LPARAM );
早期低版本的OICQ也有这个问题,如果不关闭OICQ的话,关闭计算机时屏幕闪了一下又返回了。
好了,废话少说,让我们编写我们的OICQ吧,这个实际上是Delphi自带的例子←而已:)
新建一个工程,在FASTNET面版拖一个NMUDP控件到窗口卐,然后依次放上三个EDIT,名字分别为EditIP、EditPort、EditMyTxt,三个按钮BtSend、BtClear、BtSave,一个MEMOMemoReceive,一个SaveDialog和一个状态条StatusBar1。当用户点击BtSend时,建立一个内存流对象,把要发送的文字信息写进内存流,然后NMUDP把流发送出去。当NMUDP有数据接收时,触发它的DataReceived事件,我们在这里再把接收到的流转换为字符信息,然后显示出◆来。
注意:所有的流对象建立后→使用完毕后要记得释放(Free),其实它的释构函数应该为Destroy,但如果建立流失败的话,用Destroy会产生异常,而用Free的话程序会先检查有没有成功建立了流,如果建立了才释放,所以用Free比较安全。
在这个程序中我们用到了NMUDP控件,它有几个重要的属性。RemoteHost表示远程电脑的IP或者计算︼机名,LocalPort是本地端口,主要监听有没有数据传入。而RemotePort是远程端口,发送数据时通过这个端口把数据发送出去。理解这些已经可以看⌒懂我们的程序了。
全部代码如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, ComCtrls,NMUDP;
type
TForm1 = class(TForm)
NMUDP1: TNMUDP;
EditIP: TEdit;
EditPort: TEdit;
EditMyTxt: TEdit;
MemoReceive: TMemo;
BtSend: TButton;
BtClear: TButton;
BtSave: TButton;
StatusBar1: TStatusBar;
SaveDialog1: TSaveDialog;
procedure BtSendClick(Sender: TObject);
procedure NMUDP1DataReceived(Sender: TComponent; NumberBytes: Integer;
FromIP: String; Port: Integer);
procedure NMUDP1InvalidHost(var handled: Boolean);
procedure NMUDP1DataSend(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure BtClearClick(Sender: TObject);
procedure BtSaveClick(Sender: TObject);
procedure EditMyTxtKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.BtSendClick(Sender: TObject);
var
MyStream: TMemoryStream;
MySendTxt: String;
Iport,icode:integer;
Begin
Val(EditPort.Text,Iport,icode);
if icode0 then
begin
Application.MessageBox('端口必须为数字,请重新输入!','信息',MB_ICONINFORMATION+MB_OK);
Exit;
end;
NMUDP1.RemoteHost := EditIP.Text; {远程主机}
NMUDP1.LocalPort:=Iport; {本地端口}
NMUDP1.RemotePort := Iport; {远程端口}
MySendTxt := EditMyTxt.Text;
MyStream := TMemoryStream.Create; {建立流}
try
MyStream.Write(MySendTxt[1], Length(EditMyTxt.Text));{写数据}
NMUDP1.SendStream(MyStream); {发送流}
finally
MyStream.Free; {释放流}
end;
end;
procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var
MyStream: TMemoryStream;
MyReciveTxt: String;
begin
MyStream := TMemoryStream.Create; {建立流}
try
NMUDP1.ReadStream(MyStream);{接收流}
SetLength(MyReciveTxt,NumberBytes);{NumberBytes为接收到的字节数}
MyStream.Read(MyReciveTxt[1],NumberBytes);{读数据}
MemoReceive.Lines.Add('接收到来自主机'+FromIP+'的信息:'+MyReciveTxt);
finally
MyStream.Free; {释放流}
end;
end;
procedure TForm1.NMUDP1InvalidHost(var handled: Boolean);
begin
Application.MessageBox('对方IP地址不正√确,请重新输入!','信息',MB_ICONINFORMATION+MB_OK);
end;
procedure TForm1.NMUDP1DataSend(Sender: TObject);
begin
StatusBar1.SimpleText:='信息成功发出!';
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
EditIP.Text:='127.0.0.1';
EditPort.Text:='8868';
BtSend.Caption:='发送';
BtClear.Caption:='清除聊天Ψ 记录';
BtSave.Caption:='保存聊天记录';
MemoReceive.ScrollBars:=ssBoth;
MemoReceive.Clear;
EditMyTxt.Text:='在这里输入信息,然后点击发送.';
StatusBar1.SimplePanel:=true;
end;
procedure TForm1.BtClearClick(Sender: TObject);
begin
MemoReceive.Clear;
end;
procedure TForm1.BtSaveClick(Sender: TObject);
begin
if SaveDialog1.Execute then MemoReceive.Lines.SaveToFile(SaveDialog1.FileName);
end;
procedure TForm1.EditMyTxtKeyPress(Sender: TObject; var Key: Char);
begin
if Key=#13 then BtSend.Click;
end;
end.
上面的程序跟OICQ相比当然差之甚远,因为OICQ利用的是Socket5通信方式。它上线时先从服务器取回好友信息和在线状态,发送超时还会将信息先保存在服务器,等对方下次上线后再发送然后把服务器▃的备份删除。你可以根据前面学的概念来完善这个程序,比如说再添加一个NMUDP控件来管理在线状态,发送的信息先转换成ASCII码进行与↓或运行并加上一个头信息,接收方接收信息后先判断信息头正确与否,如果正确才把信息解密显示出来,这样就提高了安全保密性。
另外,UDP协议还有一个很大的好处就是可以广播,就是说处于一个网段的都可以接收到信息而不必指定具体的IP地址。网段一般分A、B、C三类,
1~126.XXX.XXX.XXX (A类网) :广播地址为XXX.255.255.255
128~191.XXX.XXX.XXX(B类网):广播地址为XXX.XXX.255.255
192~254.XXX.XXX.XXX(C类网):广播地址为XXX.XXX.XXX.255
比如说三台计算机192.168.0.1、192.168.0.10、192.168.0.18,发送信息时只要指定IP地址为192.168.0.255就可以实现广播了。下面给出一个转换IP为广播IP的函数,快拿去完善自己的OICQ吧^-^.
Function Trun_ip(S:string):string;
var s1,s2,s3,ss,sss,Head:string;
n,m:integer;
begin
sss:=S;
n:=pos('.',s);
s1:=copy(s,1,n);
m:=length(s1);
delete(s,1,m);
Head:=copy(s1,1,(length(s1)-1));
n:=pos('.',s);
s2:=copy(s,1,n);
m:=length(s2);
delete(s,1,m);
n:=pos('.',s);
s3:=copy(s,1,n);
m:=length(s3);
delete(s,1,m);
ss:=sss;
if strtoint(Head) in [1..126] then ss:=s1+'255.255.255'; //1~126.255.255.255 (A类网)
if strtoint(Head) in [128..191] then ss:=s1+s2+'255.255';//128~
色带通用型号表
色 带 通 用 型 号 对 照 表 机 型 耐 力 色 带 力士牌:QR-700732/733 LUCKS TIME RECORDER 安满能:EX-6200/3200 VERTEX TR810 三星(海信):ER-350C/150/290/IBM4614/STAR SP298 STAR SP300 车和牌:NT-1110 TEC 2200 卡西欧:117ER/150ER/230ER CAL.RIBBON GR24 卡西欧:TK-1300 EPSON ERC32 希滑纳宴诺达:NICRO-XT CITIZEN IR41 高腾501/EPSON190 ERC 09 四通2810 ERC 37 TEC收款机TEC1450/4550 LQ670K+(25.4mm宽)EPSON DLQ2000 LQ670K(12.7mm宽)/640K EPSON LQ2500 西门子 450/ND98/CITIZEN IR81 OMRON RS11 EPSON LQ1900/STON 2406/LQ1800/LQ1600K I/LQ1600K II EPSON LQ1600K EPSON LQ570/LQ 300K EPSON LQ800 EPSON LQ2600K/LQ1600KIII/LQ1600K IV EPSON LQ2170 GW 6330/5330 GW5360 IBM 5573/IBM 2900 IBM2380 APTI 4100 IBM5577 H02 OKI 8358 OKI ML590 CI-300 P300 OLIVETTI 6408E CITIZEN IR60/DP600 IBM 4785 EPSON ERC11 IBM 5407 YD4408(芯)/YD4401 IBM 5418 YD4800(芯)/YD4801C/YD4406 GW9360/STAR BP2000 HYOSUNG PY2<晓星>FUJITSU DPK8100E/8200E/8300E/8408E/8500E/8600E FUJITSU DPK8100 GW 6360 EPSON DLQ1000 S/L CITIZEN IDP460 CITIZEN IR41 OKI182/390 S/L DKI 茄态8340 S/L IBM 5417 HITACHI KD500(芯)BANK STAR 951/961 C.ITOH 650 富士通M3081/3082/3083/3084/3086 FUJITSU M304X PANASONIC 1131 PANASONIC P181—3200 EPSON LQ2900K STAR LC2430 CITIZEN 230/540/GW 5350 CITIZEN 140D HITACHI BH10/12/信银STAR PR12 HITACHI P580 APTI 4300/4408 IBM 4226 常 用 带 芯 规 格 表 品 名 密度 扭向 规格(MM*M) EPSON LQ1600K/LQ800/LQ300K BK/LQ1600K II H/D 直带 12.7*12 EPSON ERC18/CITIZEN DP600 PU N/D 直带 12.7*7 EPSON LQ2500/LQ670K BK H/D 直带 12.7*8 EPSON ERC30/31/32/34/35/37/38/SP300PU N/D 右扭 12.7*6 EPSON LQ2170/LQ1600KIII/LQ1600KIV BK H/D 右扭 12.7*30 EPSON ERC23/ERC39 PU N/D 右扭 12.7*3.3 STAR CR3240/FUJITSU DL3408/DL3800/P5300 BK H/D 左扭12.7*7 STAR AR4408/IBM9055/OKI8368 BK H/D 右扭 12.7*7 STAR AR3240/AR1000/STONE 2403 BK H/D 左扭12.7*13 OKI 5320/LQ100/DPK8100/IBM2380/ NEC P2200/P3300/P1090/M1824 BK H/D 直带 8*1.6 STAR AR6600 BK H/D 左扭12.7*45 HITACHI KD500/IBM 5417 BK H/D 左扭25.4*60 OKI 393/8360/8570/S10 H/D 左扭12.7*30 备注:如不同型号色带的规格、扭向、高低密度一致,其带芯均可通用。 针式打印机色带分类 机 型 耐 力 色 带 支票打印机色带系列 M408(天威、红石)、UNISYS S.40(耐力) 存折打印机色带系列 南天PR2/好利获得PR2、日立580、智凯PY6800、西门子4905 韩国晓星PY2/智凯PY2/实达BP2000、IBM9068A0、 西门子4915/实达BP3000 卡钟色带系列 TR-810 B/R、GR24 B/R、LUCKS TIME B/R、IR16 B/P、IR19 B/R NIBO 8800、SD-1000 电动打字机碳带系列 BROTHER AX10、NAKAJIMA AX210、CANON AP100 CANON AP200、OLIVETTI ET121 高速行打系列 OKI 8370/OKI 8360、富士通M304X、P300、YD4408、YD4800 KD300/500、DFX5000/8000、1600K3、日立9000/S10、IBM4224 STAR AR6600、实达PP405/PP407、M.TALLY660/691 APTI4100/长城4100/IBM5577H02、M.TALLY660/691 M.TALLY230/330/2060/DP8800、M.TALLY660/691、OKI 8570 通用打印机色带系列 EPSON 1600K、BROTHER M1724、BROTHER M1824、AR1000 BROTHER M2024、STAR AR3240、精工SP800/四通2403 POS机系列: (收款机、收银机) MD910、ERC-05、ERC-09、ERC-18、ERC-23、ERC-27、ERC-32 ERC-35、ERC-30/34/38、ERC-37、ERC-39、GR24、IBM9068 BROTHER SR402、IBM 4614/SP300、IBM 4694/4683-3、ND77 CJTOH 650/BANK STAR 951/961、STAR MP512/MP510/SP200 TEC1040、TEC1450、TEC5500、VERIFONE 900/DP600 ATM机系列 DP600、ERC11/IBM4785/4783、富士通 7000/ND98/ORMON RS11 富士通 7045、ND9A/SP300、ND35/ND71、MAGNETEC40、IBM9055 IBM9065、NCR2140、NCR5684/5685、NCR5085、SIEMENS BEETLE 60 票据打印机色带系列 NEC P3300、NEC P5300、OKI 5320/5530、OKI 8340、DPK 8100 DL3408、DL3800、智凯C605/CITIZEN 120D、智凯PY6800 长城5360/5370/5380、EPSON DLQ1000、EPSON DLQ2000、EPSON LQ800 EPSON DLQ3000、EPSON LQ2500/670K、EPSON LQ300、EPSON LQ630、STAR NX500、LC2430/2900、CR3240/AR970/5408+、松下 1121/1090、 松下 1624、松下 181、OLIVETTI PR50/PR60 税 控 机 CITIZEN GSX140、EPSON LQ2500/LQ670K 国内常用色带芯通用型号一览表 (仅供经销商参考) 带宽(mm) 带长(m) 接 法 通 用 型 号 30 100 平接 FUJITSU DPK3081/3082/3083/3084/3085/3086 25.4 60 反扭接 KD36 KD500/IBM5417 6-8 平接 EPSON DLQ2000K 20 35 反扭接 YD4408/4600 T2060 6 平接 AMT525 16 45 反扭接 FUJITSU DPK5800/6408/DL2408/2600 12.7 35-45 反扭接 OKI8360/8370/OKI393 正扭接 LQ1600KIII/2170 LQ2600 OKI8570 10-14 反扭接 NECP3/P7 GW5360/5380 MS2403 正扭接 AR3240/2463 AR1000 平接 LQ1000/1600K/1900 MS2406 LQ300/800 6-8 反扭接 MS2401/DL3600CR3240/3200/AR970T/5408/6408/3200 DPK3600E/3800 TH3070LS 正扭接 TH3070 AR4408 P5300/6300 LQ500 平接 LQ670K/LQ2500/2550 ZJ3100 DP600 4-5 正扭接 平接 SP300/IBM4614 ERC-32 ERC-28 ERC-30 ERC-37 ERC-39 TM300 ERC-38/30/34 10 25 正扭接 HPR4905 10-12 平接 M1724/2724 3 平接 M2024 KX-1624 EPSON 2828 EPSON 155 3 正扭接 ERC-27 8 28 平接 PY6800 10-15 平接 GSX140/120 GSX145 1.6-1.8 平接 LQ100/150AR951/961/GW650/6360KX-P1121 P3300/P2200/DPK8100/8200/8300/8408 IBM2380/2390/OKI5320/5330/8320/8340/OKI8358 IBM9068/BROTHER1924/1824/DLQ1000/ 得实PR60/90/PR970/GW6370/6390/PR820 6.35 12-15 反扭接 PR-2 6 平接 PR-40 2.5-3.5 平接 PR50/60
[img]