通過修改VCL源碼實現自定義輸入對話框
在BCB中有兩個函數可以實現輸入對話框:InputBox和InputQuery,其實InputBox也是調用了InputQuery,這個函數有幾個缺點:
(1).輸入對話框上的按鈕是英文的。
(2).不能實現星號密碼的效果。
但在實際編程中經常會遇到這樣的問題。全是中文的界面和提示,可是在輸入對話框中卻是英文的按鈕,顯的有些不協調,而且有時在Win2k下做的程序,換在Win98下的時候,輸入對話框中的提示會顯示不完整。通常在Form中可以通過更改默認字體為宋體9號來解決,但是在輸入對話框中可不可以呢?答案是肯定的,方法就是:修改VCL源碼!
以下方法介紹了在BCB 6.0 企業版中通過修改VCL源碼實現自定義輸入對話框。
1. 在BCB6安裝目錄的Source\Vcl目錄下找到dialogs.pas,並copy一份到你的工程目錄下.
2. 打開剛才復制過來的dialogs.pas,修改其中的InputQuery函數代碼(1857-1927行):
修改後的代碼如下:
function InputQuery(const ACaption, APrompt: string;
var Value: string): Boolean;
var
Form: TForm;
Prompt: TLabel;
Edit: TEdit;
DialogUnits: TPoint;
ButtonTop, ButtonWidth, ButtonHeight: Integer;
begin
Result := False;
Form := TForm.Create(Application);
with Form do
try
Font.Name := '宋體'; // 更改輸入對話框窗體的字體為宋體
Font.Size := 9; // 更改輸入對話框窗體的字號為9號
Canvas.Font := Font;
DialogUnits := GetAveCharSize(Canvas);
BorderStyle := bsDialog;
Caption := ACaption;
ClientWidth := MulDiv(180, DialogUnits.X, 4);
Position := poScreenCenter;
Prompt := TLabel.Create(Form);
with Prompt do
begin
Parent := Form;
Caption := APrompt;
Left := MulDiv(8, DialogUnits.X, 4);
Top := MulDiv(8, DialogUnits.Y, 8);
Constraints.MaxWidth := MulDiv(164, DialogUnits.X, 4);
WordWrap := True;
end;
Edit := TEdit.Create(Form);
with Edit do
begin
Parent := Form;
Left := Prompt.Left;
Top := Prompt.Top + Prompt.Height + 5;
Width := MulDiv(164, DialogUnits.X, 4);
MaxLength := 255;
Text := Value;
if Text = 'Password' then // 如果傳進來的默認字符串是"Password"
PasswordChar := '*'; // 則將輸入框變成星號樣式的
SelectAll;
end;
ButtonTop := Edit.Top + Edit.Height + 15;
ButtonWidth := MulDiv(50, DialogUnits.X, 4);
ButtonHeight := MulDiv(14, DialogUnits.Y, 8);
with TButton.Create(Form) do
begin
Parent := Form;
Caption := '確定'; // 確定按鈕,原先的標題是"OK"
ModalResult := mrOk;
Default := True;
SetBounds(MulDiv(38, DialogUnits.X, 4), ButtonTop, ButtonWidth,
ButtonHeight);
end;
with TButton.Create(Form) do
begin
Parent := Form;
Caption := '取消'; // 取消按鈕,原先標題為"Cancel"
ModalResult := mrCancel;
Cancel := True;
SetBounds(MulDiv(92, DialogUnits.X, 4), Edit.Top + Edit.Height + 15,
ButtonWidth, ButtonHeight);
Form.ClientHeight := Top + Height + 13;
end;
if ShowModal = mrOk then
begin
Value := Edit.Text;
Result := True;
end;
finally
Form.Free;
end;
end;
修改完成以後保存這個文件。
3. 在當前工程中加入剛才修改過的dialogs.pas,具體操作:Project-->Add to Project-->找到該文件,添加進來即可。
4. 設置一下工程選項:Project-->Options-->Packages-->取消Build with runtime packages前面的對鉤,確定。
5. 在程序中加入使用InputBox或InputQuery函數的代碼。以下為例子:
//---------------------------------------------------------------------------
// by ccrun(老妖)(www.ccrun.com)
// 普通的輸入對話框效果
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String strTemp = "";
InputQuery("標題", "提示", strTemp);
ShowMessage(strTemp);
}
//---------------------------------------------------------------------------
// 星號密碼的輸入對話框效果,與上面代碼不同的是,將Default字符串設為Password
// 就可以實現星號密碼了。這樣做是為了防止所有的輸入對話框全變成星號。
// 這裡的"Password"要與剛才修改dialogs.pas中的字符相對應。
void __fastcall TForm1::Button2Click(TObject *Sender)
{
String strTemp = "Password";
InputQuery("標題", "提示", strTemp);
ShowMessage(strTemp);
}
6. 編譯工程並運行。就可以看到中文按鈕,星號密碼的輸入對話框了。