程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 修改VCL源碼實現自定義輸入對話框

修改VCL源碼實現自定義輸入對話框

編輯:關於C++

通過修改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. 編譯工程並運行。就可以看到中文按鈕,星號密碼的輸入對話框了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved