我修改dialogs.pas实际自定义对话框,但在多Form的工程中却不起效,何解?

nikita2000 2009-12-03 08:44:35
为了实际中文按键的对话框(MessageDlg和InputQuery),我修改了CB6的Dialogs.pas文件,然后在当前工程中加入刚才修改过的dialogs.pas(具体操作:Project-->Add to Project-->找到该文件,添加进来)。再设置工程选项:Project-->Options-->Packages-->取消Build with runtime packages前面的对钩,编译后运行。

如果当前工程包含的Form和QuickReport较少时,可以出现自定义的中文按键对话框。但是,若工程中的Form和QuickReport很多的时候(比如50多个),就不出现自定义对话框了,依然是BCB原来的英文按键对话框,我检查过工程文件,确实已经加入自定义的dialogs.pas文件了,请教高手,如何解决?
...全文
73 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
nikita2000 2009-12-05
  • 打赏
  • 举报
回复
结贴了,谢谢妖哥!
CACACACACA 2009-12-04
  • 打赏
  • 举报
回复
不至于修改源代码再编译吧. 按妖哥的处理就可以了.
ccrun.com 2009-12-03
  • 打赏
  • 举报
回复
这种单元中覆盖VCL的方法,比较灵活和方便。你可以将覆盖的代码单独放到一个单元中,然后添加到工程中就可以了。其他的单元无需包含这个单元的头文件。

例如添加一个新的Unit到工程,然后在.h文件中:
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Dialogs.hpp>


在.cpp文件中,将我在4楼回复的代码复制过来(除了测试部分)

工程中任意一个单元调用InputQuery,编译,就可以看到效果。
ccrun.com 2009-12-03
  • 打赏
  • 举报
回复
我在4楼的代码中,那个InputQuery函数的实现,覆盖了VCL中的Dialogs单元中的InputQuery,也就是说其他的单元中,即使不包含当前这个单元的头文件,调用了InputQuery以后,一样是修改后的效果。

MessageDlg也是VCL自己创建的,可以查看源码,有必要的进行覆盖。
nikita2000 2009-12-03
  • 打赏
  • 举报
回复
谢谢妖哥的帮助!

看了你的程序,这......自已动手创建一个输入窗口呀 -_-!!!

那MessageDlg呢,也如此这般地创建一个带Label和Button窗口吗?

自建对话框Form的方法我懂,其实说白了我就是想偷懒,想把Dialogs.pas改了用用,谁知道它在多Form的工程中会不起效。
ccrun.com 2009-12-03
  • 打赏
  • 举报
回复
现在有更简单的办法,无需改动dialogs.pas文件即可实现对InputQuery的定制。
首先在单元中添加以下代码:
TPoint GetAveCharSize(TCanvas *Canvas)
{
char Buffer[52];

for (int i = 0; i < 26; i++)
Buffer[i] = char(i + 'A');
for (int i = 0; i < 26; i++)
Buffer[i + 26] = char(i + 'a');

TPoint ptResult;
::GetTextExtentPoint(Canvas->Handle, Buffer, 52, PSIZE(&ptResult));

ptResult.x = ptResult.x / 52;

return ptResult;
}

bool __fastcall Dialogs::InputQuery(const String ACaption, const String APrompt, String &Value)
{
bool bResult = false;
TLabel *Prompt;
TEdit *Edit;
TButton *Button;
TPoint DialogUnits;
int ButtonTop, ButtonWidth, ButtonHeight;

TForm *Form = new TForm(Application);

try
{
Form->Font->Name = "宋体"; // 更改输入对话框窗体的字体为宋体
Form->Font->Size = 9; // 更改输入对话框窗体的字号为9号
Form->Canvas->Font = Form->Font;
DialogUnits = GetAveCharSize(Form->Canvas);
Form->BorderStyle = bsDialog;
Form->Caption = ACaption;
Form->ClientWidth = MulDiv(180, DialogUnits.x, 4);
Form->Position = poScreenCenter;

Prompt = new TLabel(Form);
Prompt->Parent = Form;
Prompt->Caption = APrompt;
Prompt->Left = MulDiv(8, DialogUnits.x, 4);
Prompt->Top = MulDiv(8, DialogUnits.y, 8);
Prompt->Constraints->MaxWidth = MulDiv(164, DialogUnits.x, 4);
Prompt->WordWrap = true;

Edit = new TEdit(Form);
Edit->Parent = Form;
Edit->Left = Prompt->Left;
Edit->Top = Prompt->Top + Prompt->Height + 5;
Edit->Width = MulDiv(164, DialogUnits.x, 4);
Edit->MaxLength = 255;
Edit->Text = Value;
if (Edit->Text == "Password") // 如果传进来的默认字符串是"Password"
Edit->PasswordChar = '*'; // 则将输入框变成星号样式的
Edit->SelectAll();

ButtonTop = Edit->Top + Edit->Height + 15;
ButtonWidth = MulDiv(50, DialogUnits.x, 4);
ButtonHeight = MulDiv(14, DialogUnits.y, 8);

Button = new TButton(Form);
Button->Parent = Form;
Button->Caption = "确定"; // 确定按钮,原先的标题是"OK"
Button->ModalResult = mrOk;
Button->Default = True;
Button->SetBounds(MulDiv(38, DialogUnits.x, 4), ButtonTop, ButtonWidth,
ButtonHeight);

Button = new TButton(Form);
Button->Parent = Form;
Button->Caption = "取消"; // 取消按钮,原先标题为"Cancel"
Button->ModalResult = mrCancel;
Button->Cancel = True;
Button->SetBounds(MulDiv(92, DialogUnits.x, 4), Edit->Top + Edit->Height + 15,
ButtonWidth, ButtonHeight);

Form->ClientHeight = Button->Top + Button->Height + 13;

if (Form->ShowModal() == mrOk)
{
Value = Edit->Text;
bResult = True;
}
}
__finally
{
delete Form;
}

return bResult;
}


然后加一个测试代码:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String strValue("Password");

if (InputQuery("标题", "提示", strValue))
ShowMessage(strValue);
}
nikita2000 2009-12-03
  • 打赏
  • 举报
回复
http://www.ccrun.com/article.asp?i=598&d=78208k
nikita2000 2009-12-03
  • 打赏
  • 举报
回复
我就是按ccrun你的网站里面教的那样改啊
ccrun.com 2009-12-03
  • 打赏
  • 举报
回复
这段文字好面熟啊。

你的Dialogs.pas中具体修改了哪些部分?如果修改不多,可以用另外一种方式达到同样效果。

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧