通过修改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. 编译工程并运行。就可以看到中文按钮,星号密码的输入对话框了。  
|