C++Builder 高级编程技巧

1. C++ Builder 网上资源

C++ Builder 研究

http://www.ccrun.com/

C++ Builder 程序员

http://mybcb.diy.myrice.com/

电脑学习 C++ Builder 版块

http://www.itcomputer.com.cn/Programs/C/CB/

c++ Builder 快捷键大全:

http://www.itcomputer.com.cn/Programs/C/CB/200512/11211.html

C++ Builder IDE 使用技巧:

http://www.itcomputer.com.cn/Programs/C/CB/200512/11199.html

---------------------------------------------------------------------------

2. C++ Builder 里的快捷键

这里只是一个摘要式的说明,摘出了我认为比较有用也比较常用的,详情请参考:

http://www.itcomputer.com.cn/Programs/C/CB/200512/11211.html

说明:其中的区块操作快捷键要在选定某块之后才能起作用。

名称            作用                备注

系统:

F3              查找下一个

F5              设置/取消断点

F7              跟踪(进入子程序)

F8              单步(不进入子程序)

F9              运行工程,包括了编译

F11             切换到对象查看器

F12             切换设计窗体和代码窗口  很有用,特别是在窗口互相覆盖的时候

Ctrl+F2         结束调试或运行

Ctrl+F5         设置Watch变量

Ctrl+F9         编译工程

Alt+F9          编译单元

代码自动完成类:

Ctrl+J          代码模板            很有用,尤其是对代码规范而言

Ctrl+Space      代码补全            很有用,可以省很多敲键盘和查错的时间

这个因为跟 Windows 默认的中英文输入法切换快捷键冲突,所以需要作如下设置:

1) 右键点击任务栏上的输入法图标,选择“设置”;

2) 在跳出的窗口中点击“键设置”按钮;

3) 在跳出的窗口中选中“中文(简体)输入法 - 输入法/非输入法切换”,勾选“启用按键顺序”,然后点“确定”即可;

编辑类:

Ctrl+C          复制                基本快捷键

Ctrl+V          粘贴                基本快捷键

粘贴大段代码时请特别注意,很多问题来源于复制粘贴。

Ctrl+X          剪切                基本快捷键

Ctrl+S          保存                基本快捷键

Ctrl+Home       跳到文件开头        较有用

Ctrl+End        跳到文件结尾        较有用

Ctrl+Left       跳到上一个字        较有用

Ctrl+Right      跳到下一个字        较有用

Ctrl+Up         鼠标位置不动,滚动条上移

Ctrl+Down       鼠标位置不动,滚动条下移

Ctrl+Y          删除一行            较有用,减少无谓的空行,有助于代码规范

Ctrl+Shift+Y    删除到行尾

Ctrl+T          删除到字尾

Ctrl+Shift+I    块增加一级缩进      很有用,有助于代码规范

Ctrl+Shift+U    块减少一级缩进      很有用,有助于代码规范

Ctrl+K+I        同 Ctrl+Shift+I

Ctrl+K+U        同 Ctrl+Shift+U

---------------------------------------------------------------------------

3. 编辑器选项设置

主菜单里的“Tools” -> “Editor Options...” 或者在编辑器窗口右键点击,在弹出的菜单里选择“Properties”。

---------------------------------------------------------------------------

4. 让 Form 不自动创建

在主菜单里的“Project” -> “Options...” -> “Forms”中,将不想要其自动启动的 Form 从“Auto-created forms”移到“Available forms”即可。

---------------------------------------------------------------------------

5. 关掉数据库的登录窗口

将 TADOConnection 控件的 LoginPrompt 属性设为 false。

---------------------------------------------------------------------------

6. 设置密码框

将文本框的 PasswordChar 属性设为 * (其他字符也行,除了 #0 之外)。这里设为啥,输入密码时就显示啥。

---------------------------------------------------------------------------

7. 登录窗口先于多文档(MDI)主窗口显示

在项目源文件(Project Source)里先 new 一个登录窗口,登录成功再创建主窗口。如下所示:

Application->Initialize();

frmLogin = new TfrmLogin(Application);

frmLogin->ShowModal();

Application->CreateForm(__classid(TfrmMain), &frmMain);

Application->Run();

剩下的事情就是在 TfrmLogin 的登录成功事件中 Close() 关闭登录窗口,登录失败事件中 Application->Terminate() 关闭主程序。

---------------------------------------------------------------------------

8. 字符串下标

AnsiString, String 的下标都是从一开始的,从 1 到 length()。

---------------------------------------------------------------------------

9. 关于 TEdit 控件的复合赋值

用 += 对 TEdit 控件的 Text 属性赋值无效。编译能通过,但赋不上值。

---------------------------------------------------------------------------

10. OnKeyPress 与 OnKeyDown 的区别

OnKeyPress是经过系统转换后的按键,根据ASCII码区分的,比方说你按了Shift+a,则相当于输入了A。这个函数相当于处理WM_CHAR消息。

OnKeyDown没有经过系统转换,是根据虚拟按键值来判断的,比方说你按下了Ctrl+F3,则相当于在控制字符方面输入了Control,并按下了VK_F3这个虚拟键。这个函数相当于处理WM_KEYDOWN消息。

---------------------------------------------------------------------------

11. 让MDI程序不重复打开相同子窗口

1) 先写一个 openForm 函数,作用是判断将要创建的子窗口是否已存在。若已存在,则显示之,并将鼠标焦点转移到该窗口,并返回 true;若不存在,则返回 false。

bool __fastcall TfrmMain::openForm(TForm *frm)

{

bool frmExist = false;

// 判断该窗口是否已经被创建。

if (frm == NULL)

{

return false;

}

for (int i = 0; i < Screen->FormCount; i++)

{

if (Screen->Forms[i]->ClassType() == frm->ClassType())

{

frmExist = true;

break;

}

}

if (false == frmExist)

{

return false;

}

// 如果此窗口已经被创建,则判断该窗口当前状态,

// 如果其当前状态为最小化状态或隐藏状态,则显示之。

if (wsMinimized == frm->WindowState)

{

ShowWindow(frm->Handle, SW_SHOWNORMAL);

}

else

{

ShowWindow(frm->Handle, SW_SHOWNA);

}

if (! frm->Visible)

{

frm->Visible = true;

}

// 将光标的焦点转移到此窗口上。

frm->BringToFront();

frm->SetFocus();

return true;

}

2) 在创建子窗口时,先调用该函数。若返回 false (即不存在),则创建之。

if (false == openForm(formName))

{

formName = new formType(Application);

}

---------------------------------------------------------------------------

12. ADOQuery 的使用

★ 一个例子

if (! ADOConnection1->Connected)

{

ADOConnection1->Connected = true;

}

ADOQuery1->Active = false;

ADOQuery1->SQL->Clear();

ADOQuery1->SQL->Add("SELECT * FROM table_name");

ADOQuery1->Active = true;

Edit1->Text = ADOQuery1->RecordCount;

Edit2->Text = ADOQuery1->Fields->Fields[1]->AsString;

ADOQuery1->Next();

Edit3->Text = ADOQuery1->Fields->Fields[1]->AsString;

★ 往数据集里添加纪录

TADOQuery1->Edit();

TADOQuery1->Append();

★ 从数据集里删除纪录

TADOQuery1->Edit();

TADOQuery1->Delete();

★ 保存修改到数据集

TADOQuery1->Edit();

TADOQuery1->Post();

★ 取消对数据集的修改

TADOQuery1->Edit();

TADOQuery1->Cancel();

TADOQuery1->Close();

---------------------------------------------------------------------------

13. 关闭窗口事件

OnClose         消息阶段的事件,控制关闭时执行什么动作。这里也可以控制不允许关闭窗口,方法是将 Action 参数设为 caNone。

OnCloseQuery    处理阶段的事件,控制是否允许关闭窗口。如果不允许关闭,将 CanClose 参数设为 false。

---------------------------------------------------------------------------

14. 如何让窗口右上角的按钮不可用?

1) 直接重载窗口过程将关闭功能屏蔽

头文件

class   TForm1:public   TForm

{

private:

public:

protected:

virtual   void   __fastcall   WndProc(TMessage   &Message)

}

源文件

void   __fastcall   TForm1::WndProc(TMessage   &Message)

{

if(Message.Msg==WM_SYSCOMMAND)

{

if(Message.WParam==SC_CLOSE)

{

Message.WParam=0;

}

}

}

2)

HMENU hSysMenu = GetSystemMenu(Handle,0);//得到系统菜单句柄

EnableMenuItem(hSysMenu,SC_CLOSE,MF_DISABLED);//使"关闭"项不可用.此时"关闭"按钮变灰,但系统菜单中的"关闭"没有变灰,只是不能选择.

第二句也可以改为:

EnableMenuItem(hSysMenu,SC_CLOSE,MF_GRAYD);与上面不同的是,这时系统菜单中的"关闭"项也变灰了.

HWND m_hWnd = GetSystemMenu(Form_shuo->Handle,false);         //关闭按钮

EnableMenuItem(m_hWnd,SC_CLOSE,MF_GRAYED);

---------------------------------------------------------------------------

15. 窗口最大化不正常

有时候在窗口界面设置里将 WindowState 属性直接设为 wsMaximized 得到的最大化效果不理想(比如控件没有像设想的那样靠右排列、树视图下边缘超出可视范围等),这时候可以通过在窗口的 Show 或 ShowModal 语句后加上设置 WindowState 属性为 wsMaximized 的语句来得到理想的效果。

---------------------------------------------------------------------------

16. 隐藏程序主窗体

程序一开始就隐藏窗口,在 工程名.cpp 中修改:

Application->Initialize();

Application->CreateForm(__classid(TForm1), &Form1);

Application->ShowMainForm = false;

ShowWindow(Application->Handle, SW_HIDE);

Application->Run();

想显示程序时执行下面这两行代码:

ShowWindow(Application->Handle, SW_SHOW);

Application->MainForm->Visible = true;

注:根据我的经验,要想在程序一开始隐藏主窗体,只要在 工程名.cpp 文件中加入

Application->ShowMainForm = false;

即可,其他地方想隐藏只要执行 Hide() 方法;而想要显示时,只要执行 Show() 方法即可。

---------------------------------------------------------------------------

17. 由弹出的右键菜单的菜单项获取触发弹出事件的组件(多个组件关联到一个右键菜单时有用)

例:

void __fastcall TSomeForm::pmiSomeClick(TObject *Sender)

{

TMenuItem *mi = static_cast<TMenuItem *>(Sender);

TPopupMenu *pm = static_cast<TPopupMenu *>(mi->GetParentComponent());

TComponent *comp = pm->PopupComponent;

// 接下来就可以对 comp 进行操作了。

...

}

---------------------------------------------------------------------------

18. 让右键也能选中 TreeView,并且正确响应相应节点(TreeView->Selected 节点自动设为右击的节点)

首先将 TreeView 的 RightClickSelect 属性设为 true,再设置其 OnContextPopup 事件如下所示:

void __fastcall TSomeForm::tvSomeContextPopup(

TObject *Sender, TPoint &MousePos, bool &Handled)

{

TTreeView *tv = static_cast<TTreeView *>(Sender);

// 取鼠标点的地方的TTreeNode

TTreeNode *node = tv->GetNodeAt(MousePos.x, MousePos.y);

if (NULL == node)

{

// 鼠标点的地方没有TTreeNode,菜单不显

Handled = true;

}

else

{

// 右键选中TTreeNode

tv->Selected = node;

}

}

---------------------------------------------------------------------------

19. 在右键菜单弹出之前对右键菜单进行设置

在 OnContextPopup 事件中设置。

---------------------------------------------------------------------------

20. 将英文提示文字(Yes, No, OK, Cancel...)修改为中文

1) 在 BCB6 安装目录的 Source/Vcl 目录下找到 consts.pas,并复制一份到你的工程目录下;

2) 将刚拷过来的 consts.pas 文件中提示文字由英文改为中文;

3) 在当前工程中加入刚才修改过的 dialogs.pas,具体操作:Project-->Add to Project-->找到该文件,添加进来即可;

4) 设置一下工程选项:Project-->Options-->Packages-->取消 Build with runtime packages 前面的对钩,确定;

5) 重新编译运行工程即可。

出处:http://pc.8s8s.com/pc/pc12990.htm

参考:http://www.ccrun.com/article.asp?d=w74av8&i=620(通过消息实现自定义输入框)

注:其他想改动源代码并且应用到现有的 BCB 工程中去的情况估计也类似,但没测试过。

---------------------------------------------------------------------------

21. 显示和屏蔽任务栏

// 屏蔽任务栏

ShowWindow(FindWindow("Shell_TrayWnd", NULL), SW_HIDE);

// 显示任务栏

ShowWindow(FindWindow("Shell_TrayWnd", NULL), SW_SHOW);

---------------------------------------------------------------------------

22. 禁用和启用任务栏

// 禁用任务栏

EnableWindow(FindWindow("Shell_traywnd", NULL), false);

// 启用任务栏

EnableWindow(FindWindow("Shell_traywnd", NULL), true);

---------------------------------------------------------------------------

23. 自动隐藏任务栏

先定义如下函数:

void __fastcall TfrmSomeForm::autohideTaskBar(bool isAutohide)

{

APPBARDATA AppBarData;

memset(&AppBarData, 0, sizeof(APPBARDATA));

AppBarData.cbSize = sizeof(APPBARDATA);

AppBarData.hWnd = FindWindow("Shell_TrayWnd", NULL);

if (isAutohide)

{

// 设定任务栏自动隐藏

AppBarData.lParam = ABS_AUTOHIDE;

}

else

{

// 取消任务栏的自动隐藏

AppBarData.lParam = ABS_ALWAYSONTOP;

}

SHAppBarMessage(ABM_SETSTATE, &AppBarData);

}

要自动隐藏任务栏时,如下调用该函数:

autohideTaskBar(true);

要取消任务栏的自动隐藏时,如下调用该函数:

autohideTaskBar(false);

---------------------------------------------------------------------------

24. 显示和屏蔽桌面图标

// 屏蔽桌面图标

ShowWindow(FindWindow("ProgMan", NULL), SW_HIDE);

// 显示桌面图标

ShowWindow(FindWindow("ProgMan", NULL), SW_SHOW);

---------------------------------------------------------------------------

25. 屏蔽系统热键

1) 方法一,比较彻底,除 Ctrl + Alt + Del 之外全被屏蔽。

在程序中设置如下全局变量和全局函数:

// 钩子句柄

HHOOK OldHook;

long CALLBACK KeyProc(int code, WPARAM wParam, LPARAM lParam)

{

KBDLLHOOKSTRUCT *pkbhs;

if (code < 0)

{

return CallNextHookEx(OldHook, code, wParam, lParam);

}

pkbhs = (KBDLLHOOKSTRUCT*) lParam;

if (pkbhs->vkCode == 91 || pkbhs->vkCode == VK_RWIN)//封锁 win 键

{

return 1;

}

if (pkbhs->vkCode == VK_ESCAPE && GetAsyncKeyState(VK_CONTROL) < 0)

{

return 1; //封锁 CTRL+ESC

}

if (pkbhs->vkCode == VK_TAB && pkbhs->flags&LLKHF_ALTDOWN)

{

return 1; //封锁 ALT+TAB

}

if (pkbhs->vkCode == 115 && pkbhs->flags & LLKHF_ALTDOWN)

{

return 1; //封锁 ALT+F4

}

if (pkbhs->vkCode == VK_ESCAPE && pkbhs->flags & LLKHF_ALTDOWN)

{

return 1; //封锁 ALT+ESC

}

if (pkbhs->vkCode == VK_SPACE && GetAsyncKeyState(VK_CONTROL) < 0)

{

return 1; //封锁 CTRL+ ‘ ‘

}

return CallNextHookEx(OldHook, code, wParam, lParam);

}

然后就可以屏蔽和启用系统热键了:

// 屏蔽热键

OldHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)KeyProc, HInstance, 0);

// 启用热键

UnhookWindowsHookEx(OldHook);

2) 方法二,只能屏蔽部分热键。

// 屏蔽系统热键

SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, &temp, 0);

RegisterHotKey(frmSome->Handle, 1, MOD_ALT, VK_TAB);

RegisterHotKey(frmSome->Handle, 2, MOD_ALT, VK_F4);

RegisterHotKey(frmSome->Handle, 3, MOD_CONTROL, VK_ESCAPE);

RegisterHotKey(frmSome->Handle, 4, MOD_ALT, VK_ESCAPE);

// 恢复系统热键

SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0, &temp, 0);

UnregisterHotKey(frmSome->Handle, 1);

UnregisterHotKey(frmSome->Handle, 2);

UnregisterHotKey(frmSome->Handle, 3);

UnregisterHotKey(frmSome->Handle, 4);

---------------------------------------------------------------------------

26. 禁止拖动窗口

1) 在类定义的 public (不确定是不是一定要 public) 部分加上如下声明:

void __fastcall WMKillFocus(TMessage &msg);

BEGIN_MESSAGE_MAP

VCL_MESSAGE_HANDLER(WM_NCHITTEST, TMessage, WMKillFocus);

END_MESSAGE_MAP (TForm)

2) 函数 WMKillFocus 实现如下:

void __fastcall TfrmSomeForm::WMKillFocus(TMessage &msg)

{

TForm::Dispatch(&msg);

if (msg.Result == HTCAPTION)

msg.Result = HTCLIENT;

}

---------------------------------------------------------------------------

27. 关于画图

1) TPaintBox 加滚动条方法

将 TPaintBox 置于 TScrollBox 之上,然后在画图时设定 TScrollBox 的 HorzScrollBar->Range 和 VertScrollBar->Range 即可。

2) TImage 加滚动条方法

将 TImage 置于 TScrollBox 之上,然后在画图时设定 TScrollBox 的 HorzScrollBar->Range 和 VertScrollBar->Range,同时还需设定 TImage 的 Picture->Bitmap->Width 和 Picture->Bitmap->Height。

3) 保存 TPaintBox 图像的方法

Graphics::TBitmap *savePic = new Graphics::TBitmap;

TRect Dect, Sect;

Dect = Rect(0, 0, pb->Width, pb->Height);

Sect = Rect(0, 0, pb->Width, pb->Height);

pb->Canvas->Brush->Style = bsClear;

savePic->Width = pb->Width;

savePic->Height = pb->Height;

savePic->Canvas->CopyRect(Dect, pb->Canvas, Sect);

savePic->SaveToFile("c://abc.bmp");

delete savePic;

以上方法的缺点是无法保存超出屏幕大小的图像。

4) 保存 TImage 图像的方法

img->Picture->SaveToFile("c://a.jpg");

5) TImage 图像过大导致“空间不足”错误的处理方法

设一个小点的格式(默认值是 pfDevice):

img->Picture->Bitmap->PixelFormat = pf1bit;

6) 画笔颜色(上一条的副作用)

如下语句将使得 TImage 变成黑白图片:

img->Picture->Bitmap->PixelFormat = pf1bit;

如果想恢复彩色,应该设成大一些的格式(pf4bit 以上):

img->Picture->Bitmap->PixelFormat = pf4bit;

---------------------------------------------------------------------------

28. 压缩图片

将 BMP 格式图片压缩为 JPG 格式:

TJPEGImage *jpg = new TJPEGImage();

jpg->PixelFormat = jf8Bit; ;//设置像素格式

jpg->Assign(bmp);

jpg->Compress();

jpg->SaveToFile("C://a.jpg");

delete jpg;

要记得导入头文件:

#include <jpeg.hpp>

---------------------------------------------------------------------------

29. 配置备份

1. 将注册表下

HKEY_CURRENT_USER/Software/Borland/C++Builder/6.0

导出为 reg 文件,这里边包含了大部分的设置,包括语法颜色什么的。恢复时导入注册表文件即可。

2. 将 bcb 目录下 Bin 下的 Codding.dst 和 Debugging.dst 备份。这是 bcb 编写代码和 debug 时的窗体位置配置。恢复时将文件复制到 bin 目录即可。

时间: 2024-10-29 12:40:58

C++Builder 高级编程技巧的相关文章

QT高级编程技巧(二)-- 编写多线程和并发应用

学习QT多线程编程之前,有必要先熟悉事件循环的概念.先看一个单线程界面程序的主函数代码: int main(int argc, char* argv[]) { QApplication app(argc, argv); // 构造主窗口对象并显示 MainWindow w; w.show(); // 进入事件循环 return app.exec(); } 在程序初始化完成后,主线程进入main()函数开始执行应用代码.一般地,我们在主线程上构建界面对象,然后进入事件循环以处理控件绘制.用户输入.

Python高级编程技巧实战 基于Python项目与面试题讲解

精选50个Python各领域开发及面试常见问题作为训练任务,每个任务先提出问题,然后分析问题.并给出高效的解决办法,最后手把手带你解决问题,全面提升用Python快速解决问题与高效编程的能力. ----------------------课程目录------------------------------讲师:程序员硕 Linux系统工程师Freescale半导体公司Linux Kernel工程师, 对开源Linux Kernel的mtd模块贡献过多个patch. 在清华大学信研院工作期间, 参

Python高级编程技巧(转)

译文:http://blog.jobbole.com/61171/ 本文展示一些高级的Python设计结构和它们的使用方法.在日常工作中,你可以根据需要选择合适的数据结构,例如对快速查找性的要求.对数据一致 性的要求或是对索引的要求等,同时也可以将各种数据结构合适地结合在一起,从而生成具有逻辑性并易于理解的数据模型.Python的数据结构从句法 上来看 非常直观,并且提供了大量的可选操作.这篇指南尝试将大部分常用的数据结构知识放到一起,并且提供对其最佳用法的探讨. 推导式(Comprehensi

python 的一些高级编程技巧

正文: 本文展示一些高级的Python设计结构和它们的使用方法.在日常工作中,你可以根据需要选择合适的数据结构,例如对快速查找性的要求.对数据一致性的要求或是对索引的要求等,同时也可以将各种数据结构合适地结合在一起,从而生成具有逻辑性并易于理解的数据模型.Python的数据结构从句法上来看非常直观,并且提供了大量的可选操作.这篇指南尝试将大部分常用的数据结构知识放到一起,并且提供对其最佳用法的探讨. 推导式(Comprehensions) 如果你已经使用了很长时间的Python,那么你至少应该听

python高级编程技巧

http://blog.sina.com.cn/s/blog_a89e19440101fb28.html Python列表解析语法[]和生成 器()语法类似 [expr for iter_var in iterable] 或 [expr for iter_var in iterable if cond_expr] 例子:[i for i in range(10)if i %2==0] Enumerate >>> i=0 >>> s=['a','b','c'] >&

Linux Shell 高级编程技巧4----几个常用的shell脚本例子

4.几个常用的shell脚本例子    4.0.在写脚本(同样适用在编程的时候),最好写好完善的注释    4.1.kill_processes.sh(一个杀死进程的脚本) #!/bin/bash current_PID=$$ ps -aux | grep "/usr/sbin/httpd" | grep -v "grep" | awk '{print $2}' > /tmp/${current_PID}.txt for pid in `cat /tmp/${

Linux Shell 高级编程技巧2----shell工具

2.shell工具    2.1.日志文件        简介            创建日志文件是很重要的,记录了重要的信息.一旦出现错误,这些信息对于我们排错是非常有用的:监控的信息也可以记录到日志文件        常用的日志文件的方法            以时间为标识的日志文件                例子 #!/bin/bash #当前的日期 current_date=`date "+%Y%m%d"` #今天的日志文件名 todaylog="log/${cu

Linux Shell 高级编程技巧3----运行级别脚本介绍

3.运行级别脚本介绍    3.1.运行级别        运行级别介绍:            0    关机            1    单用户模式            2    多用户模式,没有NFS服务            3    多用户模式            4    目前还没有使用            5    X windows 的启动模式            6    重启计算机        运行级别对应的目录(/etc/rcN.d,N是数字0.1.2...)

Linux Shell 高级编程技巧1---深入讨论(awk、&lt;&lt;)

1.深入讨论(awk.<<)    1.1.深入讨论awk        记录和域,模式和动作,正则表达式和元字符            基础教程中已经介绍        条件和逻辑操作符            <    小于            >=    大于等于            <=    小于等于            ==    等于            !=    不等于            ~    匹配正则表达式            !~