台灣捷康與Delphi&C++ Builder User互動

最近忙著手邊的案子,好少分享相關的技術(雖然一直使用這些技術)
不過台灣捷康透過FB一直與User做互動,裡面有幾位怪獸級高手(ex:縹緲、廖啟甫)大哥都在裡頭
https://www.facebook.com/groups/qcomtw/

Delphi控制TSC Printer

[pascal]
procedure openport(PrinterName:pchar);stdcall;far; external ‘tsclib.dll’;
procedure closeport; external ‘tsclib.dll’;
procedure sendcommand(Command:pchar);stdcall;far;external ‘tsclib.dll’;
procedure setup(LabelWidth, LabelHeight, Speed, Density, Sensor, Vertical,
Offset:pchar);tsdcall; far; external ‘tsclib.dll’;
procedure downloadpcx(Filename,ImageName:pchar);stdcall;far;
external ‘tsclib.dll’;
procedure barcode(X, Y, CodeType, Height, Readable, Rotation, Narrow,
Wide, Code :pchar); stdcall; far; external ‘tsclib.dll’;
procedure printerfont(X, Y, FontName, Rotation, Xmul, Ymul, Content:pchar);
stdcall;far; external ‘tsclib.dll’;
procedure clearbuffer; external ‘tsclib.dll’;
procedure printlabel(NumberOfSet, NumberOfCopoy:pchar);stdcall; far;
external ‘tsclib.dll’;
procedure formfeed;external ‘tsclib.dll’;
procedure nobackfeed; external ‘tsclib.dll’
procedure windowsfont (X, Y, FontHeight, Rotation, FontStyle,
FontUnderline : integer; FaceName,
TextContect:pchar);stdcall;far;external ‘tsclib.dll’;
[/pascal]

1. openport(a)
說明: 指定電腦端的輸出埠
參數:
a: 字串型別
(1) 單機列印時,請指定印表機驅動程式名稱
例如: TSC CLEVER TTP-243
(2) 若連接印表機伺服器,請指定伺服器路徑及共用印表機名稱
例如: \\SERVER\TTP243
(3) 直接指定平行傳輸介面,請指定輸出埠名稱為 LPT1 到 LPT4
(4) 直接指定 USB 傳輸介面,請指定輸出埠名稱為 USB
2. closeport()
說明: 關閉指定的電腦端輸出埠
參數: 無
3. setup(a,b,c,d,e,f,g)
說明: 設定標籤的寬度、高度、列印速度、列印濃度、感應器類別、gap/black mark
垂直間距、gap/black mark 偏移距離)
參數:
a: 字串型別,設定標籤寬度,單位 mm
b: 字串型別,設定標籤高度,單位 mm
c: 字串型別,設定列印速度,(列印速度隨機型不同而有不同的選項)
1.0: 每秒 1.0 吋列印速度
1.5: 每秒 1.5 吋列印速度
2.0: 每秒 2.0 吋列印速度
3.0: 每秒 3.0 吋列印速度
4.0: 每秒 4.0 吋列印速度
6.0: 每秒 6.0 吋列印速度
8.0: 每秒 8.0 吋列印速度
10.0: 每秒 10.0 吋列印速度
d: 字串型別,設定列印濃度
0~15,數字愈大列印結果愈黑
e: 字串型別,設定使用感應器類別
0 表示使用垂直間距感測器(gap sensor)
1 表示使用黑標感測器(black mark sensor)
f: 字串型別,設定 gap/black mark 垂直間距高度,單位: mm
g: 字串型別,設定 gap/black mark 偏移距離,單位: mm,此參數若使用一
般標籤時均設為 0
4. clearbuffer()
說明: 清除
參數: 無
5. barcode(a,b,c,d,e,f,g,h,I)
說明: 使用條碼機內建條碼列印
參數:
a: 字串型別,條碼 X 方向起始點,以點(point)表示。
(200 DPI,1 點=1/8 mm, 300 DPI,1 點=1/12 mm)
b: 字串型別,條碼 Y 方向起始點,以點(point)表示。
(200 DPI,1 點=1/8 mm, 300 DPI,1 點=1/12 mm)
c: 字串型別
128 Code 128, switching code subset A, B, C
automatically
128M Code 128, switching code subset A, B, C
manually.
EAN128 Code 128, switching code subset A, B, C
automatically
25 Interleaved 2 of 5
25C Interleaved 2 of 5 with check digits
39 Code 39
39C Code 39 with check digits
93 Code 93
EAN13 EAN 13
EAN13+2 EAN 13 with 2 digits add-on
EAN13+5 EAN 13 with 5 digits add-on
EAN8 EAN 8
EAN8+2 EAN 8 with 2 digits add-on
EAN8+5 EAN 8 with 5 digits add-on
CODA Codabar
POST Postnet
UPCA UPC-A
UPCA+2 UPC-A with 2 digits add-on
UPCA+5 UPC-A with 5 digits add-on
UPCE UPC-E
UPCE+2 UPC-E with 2 digits add-on
UPCE+5 UPC-E with 5 digits add-on
d: 字串型別,設定條碼高度,高度以點來表示
e: 字串型別,設定是否列印條碼碼文
0: 不列印碼文
1: 列印碼文
f: 字串型別,設定條碼旋轉角度
0: 旋轉 0 度
90: 旋轉 90 度
180: 旋轉 180 度
270: 旋轉 270 度
g: 字串型別,設定條碼窄 bar 比例因子,請參考 TSPL 使用手冊
h: 字串型別,設定條碼窄 bar 比例因子,請參考 TSPL 使用手冊
I: 字串型別,條碼內容
6. printerfont(a,b,c,d,e,f,g)
說明: 使用條碼機內建文字列印
參數:
a: 字串型別,文字 X 方向起始點,以點(point)表示。
(200 DPI,1 點=1/8 mm, 300 DPI,1 點=1/12 mm)
b: 字串型別,文字 Y 方向起始點,以點(point)表示。
(200 DPI,1 點=1/8 mm, 300 DPI,1 點=1/12 mm)
c: 字串型別,內建字型名稱,共 12 種。
1: 8*/12 dots
2: 12*20 dots
3: 16*24 dots
4: 24*32 dots
5: 32*48 dots
TST24.BF2: 繁體中文 24*24
TST16.BF2: 繁體中文 16*16
TTT24.BF2: 繁體中文 24*24 (電信碼)
TSS24.BF2: 簡體中文 24*24
TSS16.BF2: 簡體中文 16*16
K: 韓文 24*24
L: 韓文 16*16
d: 字串型別,設定文字旋轉角度
0: 旋轉 0 度
90: 旋轉 90 度
180: 旋轉 180 度
270: 旋轉 270 度
e: 字串型別,設定文字 X 方向放大倍率,1~8
f: 字串型別,設定文字 X 方向放大倍率,1~8
g: 字串型別,列印文字內容
7. sendcommand(command)
說明: 送內建指令到條碼印表機
參數: 詳細指令請參考 TSPL
8. printlabel(a,b)
說明: 列印標籤內容
參數:
a: 字串型別,設定列印標籤式數(set)
b: 字串型別,設定列印標籤份數(copy)
9. downloadpcx(a,b)
說明:下載單色 PCX 格式圖檔至印表機
參數:
a: 字串型別,檔案名(可包含路徑)
b: 字串型別,下載至印表機記憶體內之檔名(請使用大寫檔名)
10. formfeed()
說明: 跳頁,該函式需在 setup 後使用
參數: 無
11. nobackfeed()
說明: 設定紙張不回吐
參數: 無
12. windowsfont(a,b,c,d,e,f,g,h)
說明: 使用 Windows TTF 字型列印文字
參數: a: 整數型別,文字 X 方向起始點,以點(point)表示
b: 整數型別,文字 Y 方向起始點,以點(point)表示。
c: 整數型別,字體高度,以點(point)表示。
d: 整數型別,旋轉角度,逆時鐘方向旋轉
0 -> 0 degree
90-> 90 degree
180-> 180 degree
270-> 270 degree
e: 整數型別,字體外形
0-> 標準(Normal)
1-> 斜體(Italic)
2-> 粗體(Bold)
3-> 粗斜體(Bold and Italic)
f: 整數型別, 底線
0-> 無底線
1-> 加底線
g: 字串型別,字體名稱。如: Arial, Times new Roman, 細名體, 標楷體
h: 字串型別,列印文字內容。
13. about()
說明: 顯示 DLL 版本號碼
參數: 無

Delphi 將字型樣式轉成字串

[pascal]
// 字串轉成字型樣式
Function StringToStyle(s:String):TFontStyles;
var ft:TFontStyles;
begin
if pos(‘B’,s) >0 then
ft := ft + [fsBold];
if pos(‘I’,s) >0 then
ft := ft + [fsItalic];
if pos(‘U’,s) >0 then
ft := ft + [fsUnderline];
if pos(‘S’,s) >0 then
ft := ft + [fsStrikeOut];
Result := ft;
end;

// 字型樣式轉成文字
Function StyleToString(ft:TFontStyles):String;
var s:String;
begin
s:= ”;
if fsBold in ft then
s := s + ‘B’;
if fsItalic in ft then
s := s + ‘I’;
if fsUnderline in ft then
s := s + ‘U’;
if fsStrikeOut in ft then
s := s + ‘S’;
Result := s;
end
[/pascal]

Delphi 仿DBNavigator方式

Delphi有很好用的DBNavitor元件,美中不足的是按鈕的樣式稍嫌不足!那是否可以仿DBNavigator的方式?
筆者提供一個簡單的範例給大家 🙂
delphi_simulate_dbnavigator
一、自訂首筆/上筆/下筆/末筆
[pascal]
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
BtnFirst.Enabled := not Datasource1.DataSet.Bof;
BtnPrior.Enabled := not Datasource1.DataSet.Bof;
BtnNext.Enabled := not Datasource1.DataSet.eof;
BtnLast.Enabled := not Datasource1.DataSet.eof;
if TDataSource(Sender).State in [dsEdit,dsInsert] then begin
BtnFirst.Enabled := False;
BtnPrior.Enabled := False;
BtnNext.Enabled := False;
BtnLast.Enabled := False;
end;
end;
[/pascal]
二、自訂新增/修改/刪除/取消/存檔
[pascal]
procedure TForm1.DataSource1StateChange(Sender: TObject);
begin
BtnAdd.Enabled := TDataSource(Sender).State in [dsbrowse];
BtnEdit.Enabled := TDataSource(Sender).State in [dsbrowse];
BtnDelete.Enabled := TDataSource(Sender).State in [dsBrowse];
BtnAbort.Enabled := TDataSource(Sender).State in [dsEdit,dsInsert];
BtnSave.Enabled := TDataSource(Sender).State in [dsEdit,dsInsert];
end;
[/pascal]
三、讓button按下後與DBNavigator一樣
[pascal]
procedure TForm1.BtnAbortClick(Sender: TObject);
begin
dbnavigator1.BtnClick(nbcancel);
end;

procedure TForm1.BtnAddClick(Sender: TObject);
begin
dbnavigator1.BtnClick(nbinsert);
end;

procedure TForm1.BtnDeleteClick(Sender: TObject);
begin
dbnavigator1.BtnClick(nbdelete);
end;

procedure TForm1.BtnEditClick(Sender: TObject);
begin
dbnavigator1.BtnClick(nbedit);
end;

procedure TForm1.BtnFirstClick(Sender: TObject);
begin
dbnavigator1.BtnClick(nbfirst);
end;

procedure TForm1.BtnLastClick(Sender: TObject);
begin
dbnavigator1.BtnClick(nblast);
end;

procedure TForm1.BtnNextClick(Sender: TObject);
begin
dbnavigator1.BtnClick(nbnext);
end;

procedure TForm1.BtnPriorClick(Sender: TObject);
begin
dbnavigator1.BtnClick(nbprior);
end;

procedure TForm1.BtnSaveClick(Sender: TObject);
begin
dbnavigator1.BtnClick(nbpost);
end;
[/pascal]

Delphi Infopower expendbutton運用

1. wwDBGrid1的 control type設為CustomEdit、Control Name為 wwExpendButton
2. wwExpendButton的 AutoHideExpend設True、DataSource與DataField設為wwDBGrid1顯示的內容、Grid設為wwDBGrid2、ShowAsButton與ShowText設為True
3. wwDBGrid2連結正確

Delphi偵測條碼槍方式

條碼槍的原理其實很簡單,就是一個仿鍵盤輸入的機器。
放上一個Edit元件,接著setfocus後
在edit的keypress檢查enter(#13)就行了
[pascal]
procedure TForm1.EdtBarcodeKeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then begin
// 處理EdtBarcode內容(就是刷到的條碼)
end;
end;
[/pascal]

Delphi 條件編譯語法 $IFDEF $ELSE $ENDIF

對Delphi來說,{}(左右大括號)內是註解,不過如果是{$(左大括號加錢字號)內容是給編譯器看的編譯指令。

編譯指令的用途為:

1.程式除錯

2.版本控制

定義方式:
1. Project -> Options… -> Conditional defines 程式定義
2. Unit內定義
[pascal]
{$DEFINE xxxxx}
[/pascal]

使用方式:
[pascal]
// 除錯用
{$IFDEF DEBUG}
ShowMessage(‘開發除錯模式’);
{$ENDIF}
{$IFDEF RELEASE}
ShowMessage(‘版本發佈模式’);
{$ENDIF}
[/pascal]

[pascal]
// 版本控制 發佈MAC版本或WINDOWS版本
{$IFDEF MACOS}
MacApi.Appkit,Macapi.CoreFoundation, Macapi.Foundation,
{$ENDIF}
{$IFDEF MSWINDOWS}
Winapi.Messages, Winapi.Windows,
{$ENDIF}
[/pascal]

Delphi開發路上你不孤單~調查目前狀況

前陣子做了一個「Delphi使用調查」,今天來發佈小小的結果。如果對是那家公司有興趣,就請加入  Delphi Developer【Delphi開發者】 社團。
未命名 - 2