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


    来自:https://yq.aliyun.com/wenji/88428

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

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

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

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

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

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

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

    以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索星号掩盖密码 , form , 源码修改 , 对话框 , edit , prompt , 输入 , 源码文件中文字符 , 星号 prompt函数 vcl源码、vcl播放器源码、android 自定义对话框、自定义对话框、自定义confirm对话框,以便于您获取更多的相关知识。

  • 相关阅读:
    斐波纳契数列
    实现刮刮乐的效果
    简易版美图秀秀
    js 宏任务和微任务
    作业3 阅读
    作业2 结对子作业
    做汉堡
    练习一
    Java设计模式十八:代理模式(Proxy)
    Java设计模式二十:适配器模式(Adapter)
  • 原文地址:https://www.cnblogs.com/jijm123/p/7698253.html
Copyright © 2020-2023  润新知