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

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

时间: 2024-08-30 21:09:02

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

dao-MyBatis-generator-core 生成的Dao 怎么自定义名字 (或者手动修改哪些源码可以实现)

问题描述 MyBatis-generator-core 生成的Dao 怎么自定义名字 (或者手动修改哪些源码可以实现) generatorConfig.xml 生成后 com.lahand.dao下的BlackCardMapper类,怎么修改配置文件,让它生成 IBlackCardDa这样的名字,就是可以自定义生成的文件的名字 解决方案 这个好像是不行的.要手动去改.因为生成是按照你命名的那个entity类名的后面直接加上mapper的 解决方案二: 修改里面的generatorConfig.x

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

原文:Android菜鸟的成长笔记(6)--剖析源码学自定义主题Theme 还记得在Android菜鸟的成长笔记(3)中我们曾经遇到了一个问题吗?"这个界面和真真的QQ界面还有点不同的就是上面的标题myFirstApp,怎么去掉这个标题呢?",当时我直接在AndroidMainfest.xml中添加了一个属性: android:theme="@android:style/Theme.NoTitleBar" 可能有的朋友就会迷惑了,为什么添加了这个属性就可以了.这一篇

模板-有没有会修改cms源码 我想仿一个网站 但人家用的是dedecms谁能给我转成phpcms?

问题描述 有没有会修改cms源码 我想仿一个网站 但人家用的是dedecms谁能给我转成phpcms? 就是这个破站http://www.sellbang.com 他也是仿的别人的 但是模板我比较喜欢 但我只会phpCMS 不想再花时间研究dedecms 谁有现成的方法或软件给下呗 把它转成phpcms 解决方案 你会phpcms,dede更容易啊,

如何修改spark源码,更改程序名称。

问题描述 想修改spark源码,想把程序的名称改为其他的,而不是spark,这个怎么修改呢?源码中有用到APPLICATION_NAMEpublicstaticfinalStringAPPLICATION_NAME="APPLICATION_NAME";在default.java中,这个APPLICATION_NAME,程序是如何自动获取"spark"这个名称的,想修改又如何修改.大神们帮帮忙啊

向了解VLC开发的求教:如何修改VLC源码中UDP包长度?

问题描述 向了解VLC开发的求教:如何修改VLC源码中UDP包长度? 大家好 我在官网上下载了VLC的源代码,版本vlc-2.2.0.我现在在服务器端通过VLC向客户端发送本地视频文件并播放该视频,客户端接收数据并通过VLC播放视频,!他们之间通过UDP的方式传输,现在想要更改服务器端发出的UDP包的长度,使之变小,请问在VLC源代码哪里更改,看见源代码里边那么多的模块,看了两天实在找不到头绪,请高手指教,不胜感激! 解决方案 http://blog.csdn.net/lvmaker/artic

nginx支持先下载完数据再给客户端吗?最近修改upstream源码造成内存升高不知怎么解决了

问题描述 nginx支持先下载完数据再给客户端吗?最近修改upstream源码造成内存升高不知怎么解决了 nginx原本就能先下载完整数据,再发送给客户端吗?该怎么做? 我最近动了nginx的upstream模块,动完之后发现内存泄露了,我基本上都是用的nginx本来开辟的空间和数据或者在pool上开辟可是内存还是在升高,不明白我哪里操作不当了,谁能给指点指点吗?谢谢

Android修改源码解决Alertdialog触摸对话框边缘消失的问题_Android

研究其父类时候发现,可以设置这么一条属性,在AlertDialog.Builder.create()之后才能调用这两个方法 方法一: setCanceledOnTouchOutside(false);调用这个方法时,按对话框以外的地方不起作用.按返回键还起作用 方法二: setCanceleable(false);调用这个方法时,按对话框以外的地方不起作用.按返回键也不起作用 这两个方法都属于Dialog方法,可查阅源码 修改后的源码如下: 复制代码 代码如下: case 1:         

Android修改源码解决Alertdialog触摸对话框边缘消失的问题

研究其父类时候发现,可以设置这么一条属性,在AlertDialog.Builder.create()之后才能调用这两个方法 方法一: setCanceledOnTouchOutside(false);调用这个方法时,按对话框以外的地方不起作用.按返回键还起作用 方法二: setCanceleable(false);调用这个方法时,按对话框以外的地方不起作用.按返回键也不起作用 这两个方法都属于Dialog方法,可查阅源码 修改后的源码如下: 复制代码 代码如下:case 1:          

【IOS-COCOS2D游戏开发之十五】详解CCPROGRESSTIMER 进度条并修改COCOS2D源码实现“理想”游戏进度条!

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2d/491.html 游戏开发中难免用到进度条,例如做一些游戏技能的CD时间等都会使用到:那么cocos2d当然也封装了进度条,但是不太理想,如果童鞋们用过就应该知道,那么今天介绍两个知识点,第一:介绍cocos2d中的进度条CCProgressTimer如何使用:第二点:修改cocos2d封装的CCProgressT