通过修改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.
编译工程并运行。就可以看到中文按钮,星号密码的输入对话框了。
7.
最近两天ccrun在csdn回答两个网友问题时恰好写了些代码,有兴趣的可以下载了看看:
地址:http://ccrun.8u8.com/custominputbox.rar
标签:
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com