通过修改VCL源码实现自定义输入对话框

2008-02-23 05:35:41来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

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




标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 函数指针和软件设计

下一篇: ListBox自画的另一种效果

热门词条
热门标签