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

Delphi使用調查

543096d50ed49

2014年10月TIOBE的熱門程式語言排名中,Delphi往上爬到到11名超越Javascript、VB.net以及Ruby。

主要的原因應該是從XE4以來策略轉向行動裝置開發正確。也因為如此,壽山想要做一個小小調查,知道目前還有多少企業/公司在使用Delphi做開發。表單連結:

https://docs.google.com/forms/d/1mz_qzCSE8OP1VX8e-OjTuVrttnY2aXcBpeK35M-r6y8/viewform

 

Delphi XE7 更改編輯器配色保護眼睛

程式設計師除了是腦力密集的行業外,也是眼睛很吃緊的!
尤其是一天盯著編輯器十來個小時coding,傳統的白底黑字加上密密麻麻的原始碼真的是一大負擔。
所以常拿到編輯器後,第一件事就是更改配色、字型及大小。

一、進入 Tools -> Options…
Options

二、點選Editor Options -> Color 可以看到 Defaults的配色是白底

defaultcolor

三、壽山自己習慣是把 Color SpeedSetting下拉成 Twilight,另外會把 Element中的Comment(備註),從綠色改成Fuchsia(桃紅)

changeeditorcolor

 

四、接下來點選 左邊的Editor Options 中的Display。預設的字型是 Courier New,大小是10

fontsize

五、壽山會把字型改成 Adobe釋出的Source Code Pro字型(下載網址 https://github.com/adobe-fonts/source-code-pro),並把大小改成12。

當然你也可以選自己喜歡的字型,原則上是

1 文字距離等寬

2 1、I(i大寫)、l(L小寫)分得出來

3 符號看得清楚

changefontsize

 

六、改完之後就感覺好一點了,當然你也可以改成自己喜愛的配色、字型跟大小。寫程式應該是件快樂的事!

editor

 

 

 

Delphi 動態呼叫ODBC連結對話框

ConnectionPromptDataSource
撰寫Ado(dbgo)程式時,常常會做設定ODBC動作,那程式執行時期可以動態指定嗎?答案是可以的!
[pascal]
procedure TForm1.BtnCreateODBCClick(Sender: TObject);
var
AdoConStr : WideString;
begin
AdoConStr := PromptDataSource(self.Handle,AdoConnection1.ConnectionString);
AdoConnection1.ConnectionString := AdoConStr;
end;
[/pascal]