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

勇闯江湖6

勇闯江湖6

2016-02-19 16:32

下面是个通过修改VCL源码实现自定义输入对话框教程,撑握了其技术要点,学起来就简单多了。赶紧跟着图老师小编一起来看看吧!

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

  在BCB中有两个函数可以实现输入对话框:InputBox和InputQuery,其实InputBox也是调用了InputQuery,这个函数有几个缺点:

  (1).输入对话框上的按钮是英文的。

  (2).不能实现星号密码的效果。

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

  但在实际编程中经常会遇到这样的问题。全是中文的界面和提示,可是在输入对话框中却是英文的按钮,显的有些不协调,而且有时在Win2k下做的程序,换在Win98下的时候,输入对话框中的提示会显示不完整。通常在Form中可以通过更改默认字体为宋体9号来解决,但是在输入对话框中可不可以呢?答案是肯定的,方法就是:修改VCL源码!

  以下方法介绍了在BCB 6.0 企业版中通过修改VCL源码实现自定义输入对话框。

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

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

展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
通过修改VCL源码实现自定义输入对话框

自定义confirm对话框

Web开发
自定义confirm对话框

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

用JQuery 实现的自定义对话框

Web开发
用JQuery 实现的自定义对话框

JQuery实现自定义对话框的代码

Web开发
JQuery实现自定义对话框的代码

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

JavaScript自定义模式对话框

Web开发
JavaScript自定义模式对话框

用Delphi 实现自定义颜色对话框及其构件

编程语言 网络编程
用Delphi 实现自定义颜色对话框及其构件

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

用VB测定可移动驱动器是否准备好

用VB测定可移动驱动器是否准备好

用VB捕捉屏幕图象

用VB捕捉屏幕图象
下拉加载更多内容 ↓