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自有的MD5函數

MessageDigest_5.pas路徑 source/Win32/soap/wsdlimporter

[pascal]
uses Types, MessageDigest_5;

procedure TForm1.Button1Click(Sender: TObject);
var
MD5: IMD5;
begin
MD5 := GetMD5;
MD5.Init;
MD5.Update(TByteDynArray(RawByteString(Edit1.Text)), Length(Edit1.Text));
Edit2.Text := LowerCase(MD5.AsString);
end;
[/pascal]
來源:颖川闲人的BLOG

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]

餐飲控菜系統遇到的多國語系問題

 

 

支援多國語言有許多方法,像是透過ini或是直接在資料庫。

昨天搞了餐廳用的廚房控菜系統後,今天再讓它支援多國語系。因為介面上不多,所以使用ini方式,不過如果使用Delphi7開發的朋友都會知道,遇到不是ansi編碼的ini file會掛掉。

XE後能使用TMemIniFile取代TIniFile,就能克服儲存成unicode讀不出來的問題了!

英 繁 簡