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

2016-02-19 16:32 29 1 收藏

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

【 tulaoshi.com - 编程语言 】

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

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

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

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

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

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

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

  1. 在BCB6安装目录的SourceVcl目录下找到dialogs.pas,并copy一份到你的工程目录下.

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

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

来源:https://www.tulaoshi.com/n/20160219/1612368.html

延伸阅读
代码如下: package test001; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JToolBar; public class TestJOptionPane implements ActionListener{     private JFrame jf = new JFr...
标签: 办公软件
    Excel 2000 新增的在对话框中输入区域引用可以折叠的按钮,这样用户在工作表上选定所需的区域时,对话框就不会阻挡视线。对这类对话框的操作是,在折叠按钮上单击可以将其折叠,再次单击则返回到对话框,图2-9和图2-10分别显示了折叠前后的效果。
问:程序是基于对话框的,我显示两个对话框,一个在另一个后面,下面是我的做法: CMyApp::InitInstance () { ... CMyDialog1 dlg1; m_hMainWnd = &dlg1; int result = dlg1.DoModal (); CMyDialog2 dlg2; result = dlg2.DoModal (); ... } 在上面的代码中,首先一个对话框得到了适当地调用...
标签: Web开发
//by zdzhuo  html head script type="text/javascript" var d = document; var mk = new Array( 'red','span style="color:red;"', '/red','/span', 'big','span style="font-size:22pt;"', '/big','/span', 'zhuo','span style="font-style:oblique;"', '/zhuo...
1、意图 有时候我们希望将非模态窗口显示为模态窗口。比如在IE的“文件”菜单下选择“打印”,弹出的“打印”对话框就是非模态的(也许我们不太清楚Microsoft的设计意图,一般来说这里的“打印”对话框应该是模态的)。这种情况下如何将“打印”对话框显示为模态的呢(这个对话框对我们来说是Black Box)? 2、简单实现 简单...

经验教程

145

收藏

59
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部