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

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

修改VCL源码实现自定义输入对话框的更多相关文章

  1. paramiko修改本分源码

    一.获取paramiko源码 环境:Python3 下载地址:https://github.com/paramiko/paramiko 使用的是 demos这个文件夹 二.修改部分源码用以登入 2.1 ...

  2. VCL源码修改立即生效

    为了深刻学习Delphi的VCL源码,要使的它立刻修改生效.网上很多办法,这招最简单最管用: 把source\vcl路径添加进来,只要有修改vcl源程序,都会重新编译.但是对RTL源码不能这样做. - ...

  3. Android菜鸟的成长笔记(6)——剖析源码学自定义主题Theme

    原文:Android菜鸟的成长笔记(6)--剖析源码学自定义主题Theme 还记得在Android菜鸟的成长笔记(3)中我们曾经遇到了一个问题吗?"这个界面和真真的QQ界面还有点不同的就是上 ...

  4. 修改CAS源码是的基于DB的认证方式配置更灵活

    最近在做CAS配置的时候,遇到了数据源不提供密码等数据的情况下,怎样实现密码输入认证呢? 第一步:新建Java项目,根据假面算法生成CAS加密工具 出于保密需要不提供自定义的加密工具,在您的实际项目中 ...

  5. VCL源码分析方法论(以TButton.Caption属性的由来为例)

    最近一段时间似乎流行源码分析:)我也来谈谈在过去一段时间里对VCL源码的分析方法方面的一点体会,本文将不探讨VCL类库的构架和设计模式方面的东本,只是以我们常见的控件属性/方法的实现过程作简单的说明, ...

  6. 修改spring源码重写classloader实现项目加密

      (一)操作方法和spring源码添加修改部分 事先说明:spring源码要下载好,会有修改spring的源码操作,本文和本作者所依赖的spring项目的版本是3.1.1,spring4及以上源码对 ...

  7. 研究VCL源码的原因和起点

    ---恢复内容开始--- 研究VCL源码的原因和起点 根本原因:当然是希望自己成为Delphi高手,因为这么多年过去,觉得自己始终不得要领,修改一个控件都无从下手,一直都只是个会拖控件的白痴.而我却拥 ...

  8. 修改json源码支持datetime序列化

    修改json源码支持datetime序列化 import json import datetime now = datetime.datetime.today() json.dumps(now) 抛出 ...

  9. 修改FFMpeg源码—捕获丢包

    概述 最近我们项目有一个需求就是解决客户端播放RTSP视频流花屏的问题,一般来说丢包就会引起花屏,导致客户端花屏的因素又有很多,比如说: 相机到服务器丢包 服务器到客户端丢包 等等... 其中服务器到 ...

随机推荐

  1. webview与JS的交互

    webview与JS的交互 一:hybird app, web app 和 native app 的区别   Web App Hybird App 混合Native App 开发成本 低 中 高 维护 ...

  2. 完整卸载 kUbuntu-desktop from Ubuntu 14.04 LTS系统 ubuntu14.04 LTS 64Bit

    sudo apt-get remove libkde3support4 k3b-data ntrack-module-libnl-0 libkrosscore4 libgpgme++2 libqapt ...

  3. SkylineGlobe API 如何以图层的方式导入MPT地形

    测试环境:TerraExplorer Pro 6.6; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&qu ...

  4. linux下比较两个文件:diff、 vimdiff

     diff更加具体的命令,比如file1, file2 >  diff -u file1 file2 >  vimdiff file1 file2 vimdiff 有点类似于  vim - ...

  5. echarts 响应式布局

    <body> <!-- 为ECharts准备一个具备大小(宽高)的Dom --> <div id="main" style="width: ...

  6. LVM : 简介

    在对磁盘分区的大小进行规划时,往往不能确定这个分区要使用的空间的大小.而使用 fdisk.gdisk 等工具对磁盘分区后,每个分区的大小就固定了.如果分区设置的过大,就白白浪费了磁盘空间:如果分区设置 ...

  7. libmysqlclient.so.16: cannot open shared object file: No such file or directory

    编译安装的mysql5.6.39,安装目录是/usr/local/mysql,启用程序时报错:libmysqlclient.so.16: cannot open shared object file: ...

  8. svn代码发版的脚本分享

    背景:开发将其代码放到svn里面,如何将修改后存放到svn里的代码发布到线上?简单做法:写个shell脚本,用于代码发版.比如开发的代码存放svn的路径是:svn://112.168.19.120/h ...

  9. Today

    I'm facing the major enemy. The information. I don't know when I've been crazy about seeking informa ...

  10. Daily scrum 12.21

    今天ui组反映了一个数据库数据类型的问题,开发人员在完成任务后再去处理. Member Today’s task 林豪森 与学霸其他小组交流,处理整合问题 宋天舒 修复数据库问题 张迎春 修复数据库问 ...