
Delphi XE5提供 Andoird 4.4 Kitkat的樣式下載,使用的方式也相當簡單
1)在畫面上放一個TStyleBook元件
2)將 AndroidLight.fsf 或 AndroidDark.fsf 載入到TStyleBook元件
3)在 form oncreate事件加上~
{$IFDEF ANDROID}
if TOSVersion.Check(4, 4) then StyleBook := StyleBook1;
{$ENDIF}
下載網址: embarcadero網站
大型網站架構..net 架構師.rabbitMQ.redis.行動開發.APP開發教學.PHP Laravel開發..net core C# 開發.架構師之路.Delphi開發.資料庫程式.進銷存.餐飲POS系統

Delphi XE5提供 Andoird 4.4 Kitkat的樣式下載,使用的方式也相當簡單
1)在畫面上放一個TStyleBook元件
2)將 AndroidLight.fsf 或 AndroidDark.fsf 載入到TStyleBook元件
3)在 form oncreate事件加上~
{$IFDEF ANDROID}
if TOSVersion.Check(4, 4) then StyleBook := StyleBook1;
{$ENDIF}
下載網址: embarcadero網站
雖然在Delphi有clientdataset可以使用,但美中不足的是必需在程式部署時附上midas.dll,或是在程式中uses MidasLib。最近看到國外在討論的kbmmemtable,由於在寫餐飲的POS功能所以也來測試一下。
因為kbmmemtable不需要BDE支援,所以不用特別去設定DatabaseName, TableName和TableType這些屬性。
建立欄位很簡單,
with kbmMemTable1.FieldDefs do
begin
Clear;
Add(‘t01’, ftInteger, 0, false);
end;
建立index也只需要
Add(‘Index01’, ‘value’, []);
接著就可以像一般的ttable一樣,append新增edit修改delete刪除等動作…..
然後呢也可以直接讓datasource指定它,讓kbmmemtable的值顯示在dbgird上面。
它支援loadfromdataset的功能,如果需要cache資料在程式裡不要連結資料庫時,就可以利用這個功能。另外也可以支援savetofile的功能,共有二種
1)二進位資料
SaveToBinaryFile
LoadFromBinaryFile
2)csv格式
SaveToFile
LoadFromFile
看到別人寫單選複選按鈕很簡單,於是努力的研究到底是用了什麼元件。才發現是用Woll2Woll 的1stCalss元件做到,自己寫的要死要活,別人簡單就達成了!orz
實現的方式很簡單,只要使用 TfcButtonGroup這個元件即可。
設定.ClickStyle 的屬性 bcsRadioGroup(單選)bcsCheckList(複選)
在餐飲業用餐後,某些比較大型的連鎖餐飲體系都會附上一張滿意度問卷調查表,或是在一些比較沒有過多調味變化的餐飲店中,也會出現學生時代答案卡形式的點餐卡。
點餐卡雖然沒有太深厚的技術,不過對於店家來說卻是蠻便利的,只要將客戶畫記好的點餐卡放入OMR光學閱讀機中,就可以輸入到POS系統畫面中。節省許多點餐及詢問的時間~




延伸連結:
名科資訊有限公司 http://www.dartgoal.com.tw/
在客戶那邊看到了蠻特別的機器「取餐呼叫器」,透過簡單的發送器及接收器,可以免除要廣播、大聲叫號的問題。等於手上的號碼牌(取餐牌)是會自動提醒的。操作也很簡單,只要透過發送器按下號碼後送出,手上對應的接收器就會閃爍,可以用在需要叫號的各行各業,甚至用在目前正夯的健康照護產業也可以。


延伸連結:
漢偉科技有限公司 http://www.ehanway.com.tw/
Delphi XE3預設會安裝Interbase,不過如果遇到連結Firebird時,會出現unavailable database的訊息。
解決的方式:
將firebird目錄下bin\fbclient.dll copy到system32,並命名成gds32.dll即可。
二個重點函數
imagealphablending($thumb,false)
imagesavealpha($thumb,true);
[php]
function pngthumb($sourePic,$smallFileName,$width,$heigh){
$image=imagecreatefrompng($sourePic);//PNG
imagesavealpha($image,true);
$BigWidth=imagesx($image);
$BigHeigh=imagesy($image);
$thumb = imagecreatetruecolor($width,$heigh);
imagealphablending($thumb,false);
imagesavealpha($thumb,true);
if(imagecopyresampled($thumb,$image,0,0,0,0,$width,$heigh,$BigWidth,$BigHeigh)){
imagepng($thumb,$smallFileName);}
return $smallFileName;
}
[/php]
方法很簡單,建立好TabSheet後,將TabSheet的TabVisible屬性設為False。
接著只要用程式去控制就行了
PageControl1.ActivePageIndex := x(TabSheetIndex);
或
PageControl1.ActivePage := x(TabSheetName);
對於開發軟體的人來說,最怕的莫過於自己辛苦開發多時的軟體,上市之後馬上遭受破解、盜版。不僅對開發者來說是莫大損失,也會降低開發的意願,所以開發者便會以各種方式來保護軟體。
保護軟體目前的方式有軟體保護(註冊碼、試用期間….)或硬體保護二種方式。當然軟體的部份總是道高一尺、魔高一丈,網路上總有神人有辦法破解,比較保險的做法仍是以硬體保護為主。
剛好前陣子接到德錡實業的業務經理簡先生電話,寄來了一支測試的Rockey4軟體保護鎖,順便將測試的結果告訴大家。
目前Rockey4軟體保護鎖支援的系統有:
支援的程式語言則有:
這邊筆者就列出PHP跟Delphi的使用方式
PHP
在使用前需註冊 regsvr32 Rockey4NDCom.dll
[php]
// 使用COM調用Dll
$Rockey = new COM("Com.CRockey4ND") or die("<h3>無法初始化保護鎖元件</h3>");
$Rockey->p1 = new VARIANT(0xc44c, VT_UI2);
$Rockey->p2 = new VARIANT(0xc8f8, VT_UI2);
$Rockey->p3 = new VARIANT(0x0799, VT_UI2);
$Rockey->p4 = new VARIANT(0xc43b, VT_UI2);
// 開啟保護鎖
$result = $Rockey->RockeyCM(3);
if ($result==0) {
print "<h4>Success</h4>";
} else {
print "<h4>Failed, Error Code: $result</h4>";
exit();
}
// 讀出資料
$Rockey->buffer = new VARIANT($text, VT_BSTR);
$Rockey->p1 = new VARIANT(0, VT_UI4);
$Rockey->p2 = new VARIANT(500, VT_UI4);
$result = $Rockey->RockeyCM(7);
if ($result==0) {
print "<h4>Success, Result: ".$Rockey->buffer."</h4>";
} else {
print "<h4>Failed, Error Code: $result</h4>";
exit();
}
[/php]
Delphi
Delphi的方式則有二種:一種是以Dcu一種是載入Dll
Dcu(Delphi Compiled Unit)要先把Rockey4ND.dcu複製到開發的資料夾。
DLL則是要把Rockey4ND.dll複製到開發的資料夾。
DCU寫法
1.Use rockey4nd;
2.宣告
mBuf:array[0..100] of Byte;
mFun,mP1,mP2,mP3,mP4,rt:Word;
lP1,lP2:LongWord;
mHand:array[0..16] of Word;
mHardID:array[0..16] of LongWord;
rc:array[0..4] of Word;
[pascal]
R4ND_Init(); //初始化
mP1:=$c44c;
mP2:=$c8f8;
mP3:=$799;
mP4:=$c43b;
for i:=0 to 30 do
mBuf[i]:=0;
rt:=0;
// 尋找是否有插Keypro
mFun:=1;
rt:= Rockey(mFun,mHand[0],lP1,lP2,mP1,mP2,mP3,mP4,mBuf[0]);
if rt<>0 then
begin
FmtStr(str,’cannot find ROCKEY1,error:%d ‘,[rt]);
List.Items.Add(str);
exit;
end;
List.Items.Add(‘find ROCKEY No.1’);
[/pascal]
DLL寫法
[pascal]
mBuf:array[0..100] of Byte;
mFun,mP1,mP2,mP3,mP4,rt:Word;
lP1,lP2:LongWord;
mHand:array[0..16] of Word;
mHardID:array[0..16] of LongWord;
rc:array[0..4] of Word;
function Rockey(fun:Word; var Handle:Word;
var lp1,lp2:LongWord;
var P1,P2,P3,P4:Word;
var buf:Byte):Word;
stdcall;external ‘Rockey4ND.dll’;
[/pascal]
[pascal]
mP1:=$c44c;
mP2:=$c8f8;
mP3:=$799;
mP4:=$c43b;
for i:=0 to 30 do
mBuf[i]:=0;
rt:=0;
mFun:=1;
rt:= Rockey(mFun,mHand[0],lP1,lP2,mP1,mP2,mP3,mP4,mBuf[0]);
if rt<>0 then
begin
FmtStr(str,’not find ROCKEY1,error:%x ‘,[rt]);
List.Items.Add(str);
exit;
end;
List.Items.Add(‘Find the first ROCKEY’);
[/pascal]
在測試完之後,發現程式的撰寫並不複雜。可以杜絕盜版以及破解的風險,避免軟體從商用變成公用 🙂
在安全性上保護鎖上面分兩級 4 個密碼,每個密碼 16 位長,第一級是基本密碼,對加密鎖進行基本調用時用,第二級密碼是開發商專用密碼,作用是控制加密鎖的寫入和定義加密算法,它在最終用戶的軟體中是不應該也是不需要出現的,即使跟蹤也跟不到。而每個開發商的加密鎖密碼都是不同的,也不用擔心其他開發商可以破解。
價格的部份,一支的價格介於400-500上下(依數量而定),也算是還可以接受的價格。建議有需要的朋友可以參考囉 🙂
相關連結:

德錡實業有限公司(http://www.mtitw.com)
Feitian http://www.ftsafe.com/
業務 簡建昌 0988778171電話 02-27555955
地址 台北市復興南路二段180巷29號1樓
動態建立TPanel元件時,發現設定了Color屬性後無效。
解決的方式很簡單,要設定Panel的ParentBackground為 false就可以了!
順帶一提,如果把ParentBackground設為True的時候,就會看到Panel會有透空的效果。