[Delphi XE3]ESC/POS範例

找遍了台灣的資料,對於POS收銀系統硬體相關的程式非常的少。

只好自己Try & Error一番,順便也將結果告訴一下大家囉~希望大家不要再為了它而浪費了不少時間。

很簡單的示範如何利用Delphi XE3及SPComm 元件來印出收據、切紙並打開錢櫃。

[sourcecode language=”delphi”]
procedure TForm2.Button1Click(Sender: TObject);
var
s:Ansistring;
begin
Comm1.CommName := ComboBox1.Text;
Try
Comm1.StartComm;
//初始化
s:= chr(27) + chr(64);
Comm1.WriteCommData(PAnsiChar(s),Length(s));
// 印出目前日期、時間並換行
s:= DateToStr(now)+’ ‘+TimeToStr(now)+ chr(10)+ chr(13) ;
Comm1.WriteCommData(PAnsiChar(s),Length(s));
s:= chr(27) + chr(100) + chr(2);
Comm1.WriteCommData(PAnsiChar(s),Length(s));
s:= chr(29) + chr(33) + chr(17) ;
Comm1.WriteCommData(PAnsiChar(s),Length(s));
s:= ‘Printer – Testing Success’+ chr(10);
Comm1.WriteCommData(PAnsiChar(s),Length(s));
s:= chr(29) + chr(33) + chr(0) ;
Comm1.WriteCommData(PAnsiChar(s),Length(s));
s:= chr(27) + chr(100) + chr(5);
Comm1.WriteCommData(PAnsiChar(s),Length(s));
// 切紙
s := Chr(29) + Chr(86) + Chr(0) ;
Comm1.WriteCommData(PAnsiChar(s),Length(s));
//打開錢櫃
s := chr(27) + chr(112) + chr(0) + chr(50) + chr(200) ;
Comm1.WriteCommData(PAnsiChar(s),Length(s));
Except
on E: Exception do Begin
     ShowMessage(‘Open ComPort Error!’+#10#13+’Error MSG:’+E.Message);
End;
End;
end;
[/sourcecode]

[Delphi XE3]如何清除Welcome Page中的Recently Opened Projects

Delphi 有記住打開過的專案的功能,在下一次開啟IDE時會顯示在Welcome Page中,那要如何清除呢?

1.File→Reopen→Properties

可以設定~

.Number of Projects →記住幾個開過的專案(預設10個)

.Number of files→記住幾個開過的檔案(預設15個)

.Reopen Items就是顯示在Welcome Page的內容,可以點選後用Delete或直接Clear

2.進入登錄編輯程式刪除

HKEY_CURRENT_USER\Software\Embarcadero\BDS\10.0\Closed Projects

3.寫程式刪除

uses 加入 System.Win.Registry

[delphi]
procedure TForm1.Button1Click(Sender: TObject);
var
iCount  : Integer;
Reg     : TRegistry;
sList   : TStrings;
begin
sList := TStringList.Create;
Reg   := TRegistry.Create;
try
Reg.RootKey := HKEY_CURRENT_USER;
if Reg.OpenKey(‘\Software\Embarcadero\BDS\10.0\Closed Projects’, True) then
Reg.GetValueNames(sList);
if sList.Count > 0 then begin
for iCount := 0 to Pred(sList.Count) do
Reg.DeleteValue(sList[icount]);
end else
MessageDlg(‘No registry items to be cleaned at this time.’,
mtInformation, [mbOk], 0);
finally
sList.Free;
Reg.Free;
end;
end;
[/delphi]

前端攻城師不可錯過的網站-前端工程開發實務

擁有非常深厚功力的啊嗚(蔣定宇),將他一系列「Web前端程式開發實務」的講議及資料無私的分享出來,目的是為了讓F2E(Front -End Engineer)的產業能更加成長。這真的是佛心來的,因為Joseph在Yahoo!期間就擔任多年的前端工程師,後期更是YDN的傳教士,協助推廣YUI。目前也是miiicasa的前端工程部門主管,所以對前端工程真的是有相當的專業在。推薦給各位!

網站: http://f2eclass.com/
投影片: http://www.slideshare.net/josephj/presentations
原始碼 : https://github.com/josephj/f2e-class/tree/master/slide

verlet-js蠻炫的JS物理引擎

verlet-js_examples_spiderweb_html

verlet-js是一套開放原始碼的JavaScript物理引擎,擁有粒子系統以及碰撞、關連、拖拉、模擬等特性。

透過Verlet也可以做出 box2d  效果的遊戲唷!在官方網站上,提供了幾個範例程式可以更瞭解物理引擎的用法。

官方網站:http://subprotocol.com/verlet-js/

GitHub:https://github.com/subprotocol/verlet-js

[Delphi]Splash-Screen的寫法

Delphi的資源似乎變得很少了!不過自從看到XE3似乎有些長進後,或許大家可以嘗試回鍋來做開發也不錯,畢竟Delphi在開發商用軟體的速度真的蠻快速的 :)。後續除了一些行動裝置開發、網頁開發的分享,也來做一下Delphi開發的分享好了!

Splash Screen是什麼?就是打開程式時,會先顯示個幾秒的圖片,大多是產品名稱、公司Logo這類的東西。在Delphi做法也很簡單:

1. File → New → VCL Form – Delphi 新增一個 Form

2. 開啟 Project → View Source 就可以看到 Project Source。
[delphi]
program Project1;

uses
Vcl.Forms,
Unit1 in ‘Unit1.pas’ {Form1},
Unit2 in ‘Unit2.pas’ {Form2};

{$R *.res}

begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.Run;
end.
[/delphi]
3. 改成如下就可以!
[delphi]
program Project1;

uses
Vcl.Forms,
Unit1 in ‘Unit1.pas’ {Form1},
Unit2 in ‘Unit2.pas’ {Form2};

{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
try
Form2:=TForm2.create(application);
Form2.show;
Form2.Update;
Application.CreateForm(TForm1, Form1);
finally
Form2.Free;
end;
Application.Run;
end.
[/delphi]
4. 如此一來,如果專案變大後,一方面在程式初始化時,可以Show出產品畫面外,避免看起來好像是程式當掉的冏境。也可以讓程式看起來更專業些XD

【POS系統開發】淺談ESC/POS

ESC/POS是由EPSON所制定給POS印表機專用的控制碼,因為清楚的制定各機型間的專有功能,且具有高度彈性的特性。後來被廣泛的支援並應用!目前大部份的熱感應印表機(出單機、發票機),都支援ESC/POS這套控制碼。所以POS在開發時,印表機可以在不用安裝驅動程式的狀況下,直接以ESC/POS指令列印。

而從下圖可以看到ESC/POS則是由ESC/P (Epson Standard Code for Printers)所衍生下來的。
esc-pos-history
如果對於指令有興趣的朋友,可以參考以下的文件。

【認識POS硬體】可程式電子錢櫃Cash drawer

  對一套POS系統來說,收銀結帳是很重要的環節,在早期POS未普遍時,大多由老闆/老闆娘或是可信賴的人來經手金錢,而POS系統普及後,由於可控管結算收銀金額及程式化錢櫃,才讓重要工作可以轉交給收銀員。

錢櫃主要分二種介面接頭(Interface connector),一種是印表機介面(RJ11/RJ12 connector);另一種是RS-232介面。在選購時就要注意,印表機介面的錢櫃是需要連結出單機、發票機或其他印表裝置,因為RJ11/RJ12的接頭接受24V電源輸入,而不用外接電源;而RS-232介面的錢櫃則是直接連結電腦,但RS-232不提供電源,所以需要12V的電源(也有5V的電源)。

控制的部份也分為二種:

1.RS-232介面錢櫃

RS-232介面的錢櫃控制很簡單,只要隨便向RS-232丟訊號即可。

或是在DOS模式(開始→執行 cmd),輸入 copy con com1此類的指令就可以打開了!

2.RJ11/RJ12介面錢櫃

而RJ11/RJ12介面的錢櫃,因為需要先送指令到印表機後,再由印表機發出開錢櫃的指令,相對之下安全性就較高,也可以從印表機的設定中,設定列印前(後)開啟錢櫃。較高階的錢櫃也可以偵測是開啟或關閉的。

 

ComPort控制元件SPComm for Delphi XE3

SPComm是年代蠻久遠的ComPort控制元件,之所以一直歷久不衰是因為簡單易用。

因為最近使用XE3在開發POS系統的原因,所以也找了新版本的SPComm,而原作者是copyleft的方式,再加上不易找到,所以筆者也將它開放到GitHub讓有需要的朋友一起使用。

GitHub: https://github.com/superlevin/spcomm_xe3

常用ASCII CHR碼對照

因為開發需求,把對照表留下來一下。

Chr(0) Null Chr(29) 分组符 Chr(38) & Chr(48) 0
Chr(8) 退格 Chr(30) 記錄分離符號 Chr(39) Chr(49) 1
Chr(9) Tab Chr(31) 單元分隔符號 Chr(40) ( Chr(50) 2
Chr(10) 换行 Chr(32) 空格SPACE Chr(41) ) Chr(51) 3
Chr(12) 换页 Chr(33) ! Chr(42) * Chr(52) 4
Chr(13) Enter Chr(33) ! Chr(43) + Chr(53) 5
Chr(22) 粘贴 Chr(34) Chr(44) , Chr(54) 6
Chr(26) 撤销 Chr(35) # Chr(45) Chr(55) 7
Chr(27) Esc Chr(36) $ Chr(46) . Chr(56) 8
Chr(28) 文件分隔符 Chr(37) % Chr(47) / Chr(57) 9
Chr(58) : Chr(68) D Chr(78) N Chr(88) X
Chr(59) ; Chr(69) E Chr(79) O Chr(89) Y
Chr(60) < Chr(70) F Chr(80) P Chr(90) Z
Chr(61) = Chr(71) G Chr(81) Q Chr(91) [
Chr(62) > Chr(72) H Chr(82) R Chr(92) \
Chr(63) ? Chr(73) I Chr(83) S Chr(93) ]
Chr(64) @ Chr(74) J Chr(84) T Chr(94) ^
Chr(65) A Chr(75) K Chr(85) U Chr(95) _
Chr(66) B Chr(76) L Chr(86) V Chr(96) `
Chr(67) C Chr(77) M Chr(87) W Chr(97) a
Chr(98) b Chr(108) l Chr(118) v Chr(128)
Chr(99) c Chr(109) m Chr(119) w
Chr(100) d Chr(110) n Chr(120) x
Chr(101) e Chr(111) o Chr(121) y
Chr(102) f Chr(112) p Chr(122) z
Chr(103) g Chr(113) q Chr(123) {
Chr(104) h Chr(114) r Chr(124) |
Chr(105) i Chr(115) s Chr(125) }
Chr(106) j Chr(116) t Chr(126) ~
Chr(107) k Chr(117) u Chr(127) 删除