原始出處 :  http://www.ccrun.com/doc/go.asp?id=598 
通過修改VCL源碼實現自定義輸入對話框

在BCB中有兩個函數可以實現輸入對話框:InputBox和InputQuery,其實InputBox也是調用了InputQuery,這個函數有幾個缺點:
  (1).輸入對話框上的按鈕是英文的。
  (2).不能實現星號密碼的效果。
但在實際編程中經常會遇到這樣的問題。全是中文的界面和提示,可是在輸入對話框中卻是英文的按鈕,顯的有些不協調,而且有時在Win2k下做的程序,換在Win98下的時候,輸入對話框中的提示會顯示不完整。通常在Form中可以通過更改默認字體為細明體9號來解決,但是在輸入對話框中可不可以呢?答案是肯定的,方法就是:修改VCL源碼!

以下方法介紹了在BCB 6.0 企業版中通過修改VCL源碼實現自定義輸入對話框。

1. 在BCB6安裝目錄的SourceVcl目錄下找到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. 編譯工程並運行。就可以看到中文按鈕,星號密碼的輸入對話框了。


全站熱搜

Nelson 發表在 痞客邦 留言(0) 人氣()