C++Builder 程序员博客
16 Nov
如何动态的在Image上导入图片,又如何动态的删除,然后有动态的生成呢?
重点是如何动态是Image空间里的图清空。!!!
释放GDI资源:
Image1->Picture->Dormant();
释放内存:
Image1->Picture->FreeImage();
彻底销毁:
Image1->Picture->ReleaseHandle();
image->Picture->LoadFromFile(""); //加載
image->Picture = NULL; //清空
有些问题,稍微查下帮助就知道了
14 Nov
for(int i=0;i <10;i++)
{
testThread * thread[i];
thread[i]=new testThread(false,参数);
}
怎么不行???
编译时报错
/* 你的代码有问题,每次在循环里面定义1个指针数组 你的testThread的构造函数应该有2个参数, 应该改为 testThread* thread[10]; for(int i=0; i< 10 ; ++ i){ thread[i] = new testThread(false,?) ; } */
int xx;
xx=10;
testThread* thread[xx];
for(int i=0; i < xx ; ++ i){
thread[i] = new testThread(false,?) ;
}
这样为什么不行呢?
// 你需要把 xx定义为const变量 // const int xx =10; /*初始化在这里就要给出 ,后面就不能对他赋值(写入操作)了
谢谢楼上
void __fastcall testThread::Execute()
{
//—- Place thread code here —-
Form1->Caption = "Updated in a thread";
}
为什么报没有定义Form1,是否要在线程中加什么东西
// 你的留言中已回复,请查收
12 Nov
动态创建的窗体在Onshow的时候启用一线程.
该窗体有个TreeView1控件
线程里已加入该动态窗体的头文件,比如Form2.h
在线程文件里可以弹出Form2->TreeView1,但无法对其操作.
比如线程里ShowMessage(Form2->Caption)编译通过的,但不能获得Form2的Caption属性.
线程里访问VCL控件需要使用Synchronize来进行同步修改
另外,线程里ShowMessage是得不到你想要的值的。需要用Messagebox
能写个简单的例子吗?
比如我想访问窗体里的TreeView.
myThead是自己的线程类.我这样传进去的时候,好像编译有问题.
已在myThead头文件private中定义了接收参数的属性
myThead *amyThead=new myThead(false,this->TreeView)
10 Nov
例如一个TButton,他可能有OnClick或者OnMouseMove等一个或者多个事件。
则么将他的所有已有的事件复制给另一个TButton?
Button1->OnClick = Button2->OnClick;
这个当然知道,问题是怎么知道Button1->OnClick的property非空,然后赋值Button2->OnClick?
如果还有OnKeyDown等多个事件呢?怎么动态实现呢?
其实我想知道怎么遍历Button1的所有property
这个能实现吗?
那样的话最好是自定义消息处理,将一个 Button 接收到的消息都发送到另外一个 Button
void __fastcall ButtonNewProc(TMessage &Message);
Button->WindowProc = ButtonNewProc;
void __fastcall ButtonNewProc(TMessage &Message)
{
switch (Message.Msg)
{
case WM_PAINT:
break;
case …
break;
default:break;
}
}
这样好像和SetWindowLong设置窗口过程是一样的效果。
既然bcb里所有的Events都是__property,那么怎么遍历这些property呢?
或者在程序的运行期,怎么将属性框里修改过的值 赋值给相应的控件呢?
继续在线等
ccrun大哥,能出来指点下吗?
窗体有个KeyPreview属性,默认为false。
设置为true时,可以在button之前获得事件。
接下来就是循环界面上的所有控件,碰到Button,就执行你要做的函数DoSomething();
/* 妖哥可能很忙吧! */
void __fastcall TForm1::Button1Click(TObject *Sender) { Memo1->Clear(); Memo2->Clear() ; TTypeInfo *pTypeInfo =(TTypeInfo*)(Button1->ClassInfo()) ;//得到类属性 const int iPropCount =GetTypeData(pTypeInfo)->PropCount; //得到属性总数 TPropList propList ; GetPropInfos(pTypeInfo,propList); //得到Button1所有属性列表 for(int i=0; i<iPropCount ;++i) { Memo1->Lines->Add(String(propList[i]->Name) + "——-" + String(propList[i]->PropType[0]->Kind )); if(propList[i]->PropType[0]->Kind ==8)//这里就是tkMethod,所有的事件都是这个类型 { TMethod method=GetMethodProp(Button1, propList[i]->Name);//遍历Button1的属性名 Memo2->Lines->Add((char*)method.Code); //这里code可能该方法的代码 } } //设置某个方法(事件)的属性,如Button2的OnClick设置为Button3的OnClick //等加 :Button2->OnClick =Button3->OnClick; SetMethodProp(Button2,"OnClick",GetMethodProp(Button3,"OnClick")); /* 点击Button2后将会显示 I am walle */ } //————————————————————————— void __fastcall TForm1::Button2Click(TObject *Sender) { ShowMessage("I am Eva "); } //————————————————————————— void __fastcall TForm1::Button3Click(TObject *Sender) { ShowMessage("I am walle! "); } //————————————————————————— /* 如果你需要遍历所有的事件属性,将for循环改改即可,需要得到TTypeKind ,整数为8 的就是方法(tkMethod).然后调用SetMethodProp改变它的事件即可。 */
非常感谢jxw1987628!!!
真的很感谢
7 Nov
我如此开辟二维树,为什么不可以调用?望高手说说错那里,当然欢迎更好的开辟方法,小弟弟先谢谢了ⷯ
int **pBuf4;
int **pBuf5;
pBuf4 = new int *[height];
pBuf5 = new int *[height];
for(DWORD i=0;i <height;i++)
{
pBuf4[i]= new int [left];
pBuf5[i]= new int [left];
}
没错啊,有什么问题?
问题找大了 好象空间不连续,谁给提供一个空间连续的二维空间开辟方法!
你分配足够的空间给指针就是了
int *Buff = new int( height * left);
然后进行指定。访问Buff[line*left+row]即相当于访问 Buff[line][row]
如果一定要使用int**的话:
int **pBuf4 = new int *[height];
for(DWORD i=0;i <height;i++)
{
pBuf4[i]= Buff+left*i;
}
上面代码new int( height * left);应该为:
new int[ height * left];
计算字节量,一次 new char〔size〕;
再把返回指针定义为所需的类型指针,肯定连续。
把指针地址空间设成相应的大小一定可以
你要连续的空间,连续的内存,可以试试容器里面套容器
#include <vector> using namespace std; vector<vector<int> > CubeVector;//二维的
而且这个对简单数据类型很时候的。。操作起来比较方便。不用搞指针。。。
如果是存放大型对象,你可以用boost::shared_ptr 配合vectro来存储
对象的指针.这样弄起来很好!
楼上说的对,用STL最好,呵呵~~~~~~~
连续的话new一个一维的数组,然后自己计算下标
动态的本来就不可能是连续的。 用Vector不错的。
18 Oct
如何动态的显示Button。
即我在窗体上点那,Button就出现在那。
同意楼上,或者干脆在form的onclick里面移动butoon
这是我刚写好的,测试没有问题。鼠标点击窗口任意位置,在鼠标点击处创建一个Button
void __fastcall TForm1::FormClick(TObject *Sender) { TButton* btn = new TButton(this); btn->Parent = this; TPoint p; p.x = Mouse->CursorPos.x; p.y = Mouse->CursorPos.y; p = ScreenToClient(p); btn->Left = p.x - btn->Width/2; btn->Top = p.y - btn->Height/2; btn->Caption = "New Button"; }
主要看做什么用
那就只用这样就可以了:
// btn是你创建好的Button
TPoint p;
p.x = Mouse->CursorPos.x;
p.y = Mouse->CursorPos.y;
p = ScreenToClient(p);
btn->Left = p.x - btn->Width/2;
btn->Top = p.y - btn->Height/2;
16 Oct
BCB6.0程序中,界面内一个Buttom和CheckBox,CheckBox如选中,则在按下Buttom后循环工作,CheckBox取消后停止。
现在发现在进入循环后,无法点选CheckBox,具体代码如下:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int iFlag;
iFlag = 0;
Memo1->Lines->Add("Test Start….");
while(check)
{
iFlag++;
Memo1->Lines->Add(String(iFlag));
Sleep(1000);
}
Memo1->Lines->Add("Test End.");
}
//—————————————————————————
void __fastcall TForm1::CheckBox1Click(TObject *Sender)
{
if(CheckBox1->Checked == true)
{
check = 1;
}
else
{
check = 0;
}
}
//—————————————————————————
不好意思,刚才拼写少了一个s
Application->ProcessMessages();
我一般会把Application->ProcessMessages();放在sleep的上面,而不在下面……
收到,谢谢!
15 Oct
我在程序里动态创建TWebBrowser时出错,用的是bcb2006,请大侠们帮忙分析下是什么原因,要怎样解决,谢谢了。程序代码如下:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TWebBrowser *Web=new TWebBrowser(this);
Web->Align=alClient;
Web->TControl::Parent=this;
Web->OnDocumentComplete=WebBrowser1DocumentComplete;
}
最后一句编译通不过,错误代码为:[C++ Error] Unit1.cpp(28): E2034 Cannot convert 'void (_fastcall * (_closure )(TObject *,const IDispatch *,OleVariant &))(TObject *,const IDispatch *,OleVariant &)' to 'TWebBrowserDocumentComplete'
WebBrowser1DocumentComplete是我放了一个WebBrowser1在窗口上,自动生成的OnDocumentComplete事件,我打开dfm文件看WebBrowser1是怎么设置事件的,其设置代码如下:
object CppWebBrowser1: TCppWebBrowser
Left = 112
Top = 96
Width = 300
Height = 150
TabOrder = 0
OnDocumentComplete = CppWebBrowser1DocumentComplete
ControlData = {
4C000000021F0000810F00000000000000000000000000000000000000000000
000000004C000000000000000000000001000000E0D057007335CF11AE690800
2B2E126208000000000000004C0000000114020000000000C000000000000046
8000000000000000000000000000000000000000000000000000000000000000
00000000000000000100000000000000000000000000000000000000}
end
是的,不能直接做,只能按如下办法间接做(我就是如此):
你的 Form 内必须首先有一个 TWebBrowser ,如名字为 WebBrowser1.
在 .h 中声明函数指针变量:( 因为 WebBrowser1 的页面可能会关闭,所以他可能会被删除)
private:
TWebBrowserDocumentComplete WBrowerDocumentComplete;
在 .Cpp 的 FormCreate 中定义该变量。
WBrowerDocumentComplete = WebBrower1->OnDocumentComplete;
最后在你的程序最后一句改为:
Web->OnDocumentComplete = WBrowserDocumentComplete;
收工!至于其他事件也同样道理。
谢2位回答,估计楼上的应该能解决,试一下先
二楼的确实可以,不知有没有方法直接设置,先等二天,没有再结贴
觉得有点不可思议,一般情况,不需要这样间接的,标准VCL里面貌似就是可以直接关联。
不过也学习了。呵呵。乐趣就在这里了。
应该是定义问题,我记得好像TMenu的OnMeasureItem也有这个问题。
你试试这样:
Web->OnDocumentComplete = (TWebBrowserDocumentComplete)WebBrowser1DocumentComplete;
如果还是不行的话去它的头文件里找一下TWebBrowserDocumentComplete的定义,对应地改一下WebBrowser1DocumentComplete的定义。
楼上的代码我一开始就试过,不能转换的,5楼说得很对,呵呵,我也是第一次遇到直接设置不行的,看看自动生成的代码,多了ControlData = {
4C000000021F0000810F00000000000000000000000000000000000000000000
000000004C000000000000000000000001000000E0D057007335CF11AE690800
2B2E126208000000000000004C0000000114020000000000C000000000000046
8000000000000000000000000000000000000000000000000000000000000000
00000000000000000100000000000000000000000000000000000000}
不知是什么意思
二进制的方式表达ControlData
TWebBrowser 与 TCppWebBrowser 有这问题,其他组件控件未见此问题。
感谢大家回答,在6楼的提示下问题已解决
14 Oct
问题是这样的
我已经有了一个右键菜单句柄hMain,我想为这个菜单建立一个下级菜单,但总是不成功
HMENU PopMenu = CreateMenu();
AppendMenu(PopMenu,MF_STRING,0,"退出(&E)");
//TMenuItem *MM1;
AppendMenu(MM1->Handle,MF_POPUP,(UINT)PopMenu,"文件(&F)");
但是如果我不用MM1,而使用TMainMenu的话是可以的AppendMenu(MainMenu1->Handle,MF_POPUP,(UINT)PopMenu,"文件(&F)");
AppendMenu(PopupMenu1->Handle,MF_POPUP,(UINT)PopMenu,"文件(&F)");//这样也是不行的
请问是怎么回事呢?
先谢过各位了!
如何指定呢?
TMenuItem的Handle的属性不能赋值
代码如下:
void __fastcall TframeAttachRule::DynamicCreateSubMenuItem(TMenuItem* miFather,vector <TreeGroupEntity*>vecSonGrp)
{
for(size_t i=0;i <vecSonGrp.size();i++)
{
TMenuItem *miAdd = new TMenuItem (pmAttachGrp);
miAdd->Caption = vecSonGrp[i]->m_strGroupName;
miAdd->Tag = vecSonGrp[i]->m_iGroupId;
miFather->Add(miAdd);
miAdd->OnClick = nAttachGrpClick;
}
}
另外释放时只需要把最外面的父释放即可 miFather->Clear(),子按钮会自动释放。
API的方法:
HMENU PopMenu = CreatePopupMenu(); AppendMenu(PopMenu,MF_POPUP,UINT(PopMenu),"文件(&F)"); HMENU smu= GetSubMenu(PopMenu,0); AppendMenu(smu,MF_STRING,101,"新建(&N)"); AppendMenu(smu,MF_SEPARATOR,-1,0); AppendMenu(smu,MF_STRING,102,"退出(&E)"); //………..显示 TPoint pt=Mouse->CursorPos; TrackPopupMenu(PopMenu,TPM_LEFTALIGN|TPM_LEFTBUTTON,pt.x,pt.y,0,Handle,NULL);
VCL的方法:
TPopupMenu *PopMenu = new TPopupMenu(this); TMenuItem *mi = new TMenuItem(PopMenu); mi->Caption = "文件(&F)"; PopMenu->Items->Add(mi); TMenuItem *miNew = new TMenuItem(PopMenu); miNew->Caption = "新建(&N)"; mi->Add(miNew); TMenuItem *miSep = new TMenuItem(PopMenu); miSep->Caption="-"; mi->Add(miSep); TMenuItem *miExit = new TMenuItem(PopMenu); miExit->Caption = "退出(&E)"; mi->Add(miExit); // ……..关联右键菜单 Form1->PopupMenu = PopMenu;
不好意思,可能是我描述的不够清楚
我已知的句柄不是窗体的,我也不是要为窗体创建右键菜单
我是想再原有的右键菜单上增加几项
我已知的Handle是一个TMenuItem的Handle,我想为它添加下级菜单
比如:
已有的右键菜单结构:
文件->操作
->写入
->删除
我已经得到“操作”的句柄为:hOperation
目标右键菜单结构:
文件->操作->重写
->写入
->删除
我就是想在“操作”菜单下,再增加一个下级菜单,而不破坏原有右键菜单
如果使用TMenuItem *miAdd = new TMenuItem (pmAttachGrp);
TMenuItem的构造函数使用的是TComponent作为参数,而不是HANDLE
假设我TMenuItem *miAdd = new TMenuItem (NULL);
那么miAdd如何与 hOperation 进行关联呢?
对于原来的右键菜单,我除了已知的hOperation而外,其他的都不能操作,就类似外挂的东西
如果只能拿到Handle的话可以用API的方法:AppendMenu(hOperation,MF_STRING,101,"重写");
关键是你的hOperation必须有效,BCB的帮助里说:
__property HMENU Handle = {read=GetHandle, nodefault}; Description Use Handle when calling a Windows API function that requires a menu handle. Handle is only valid if the Count property is greater than 0.
最后一句话说TMenuItem的Count>0(也就是已经是一个子菜单)才有效,看你原菜单结构貌似不满足的说。(无效的Handle意味着这条路行不通)
//你找到的Handle HANDLE hWnd; if(hWnd!=0){ //这里hWnd是’操作’菜单的句柄 ,找到她对应的指针 TMenuItem*p=pop->FindItem((int)hWnd,fkHandle); if(p!=0){ //添加子菜单 TMenuItem*m=new TMenuItem(pop); m->Caption="bcb茶馆[4670-3864]"; p->Add(m); }
TPopupMenu *PopMenu = new TPopupMenu(this);
TMenuItem *mi = new TMenuItem(PopMenu);
mi->Caption = "文件(&F)";
PopMenu->Items->Add(mi);
TMenuItem *miNew = new TMenuItem(PopMenu);
miNew->Caption = "新建(&N)";
mi->Add(miNew);
TMenuItem *miSep = new TMenuItem(PopMenu);
miSep->Caption="-";
mi->Add(miSep);
TMenuItem *miExit = new TMenuItem(PopMenu);
miExit->Caption = "退出(&E)";
mi->Add(miExit);
// ……..关联右键菜单
Form1->PopupMenu = PopMenu;
顺便问问,怎么为这些动态添加的menu增加点击事件呢?
现成的
CMenu m_popMenu;
m_popMenu.LoadMenu(IDR_MENU_POPUP);
CMenu *pMenu = m_popMenu.GetSubMenu(3);
CStringList strSubClsNmList; //根所右键点击的不同类对象的ID,idCls,添加不同的POP菜单
if(!GetDirectClsList(idCls,strSubClsNmList))
return;
if (!strSubClsNmList.IsEmpty())
{
CMenu subMenu;
subMenu.CreatePopupMenu();
int i=0;
while (!strSubClsNmList.IsEmpty())
{
subMenu.AppendMenu(MF_STRING, i, strSubClsNmList.RemoveHead());
i++;
}
pMenu-> AppendMenu(MF_POPUP, (UINT)subMenu.m_hMenu, _T( "新增 "));
}
pMenu-> TrackPopupMenu(0,curPoint.x,curPoint.y,this);
顺便问问,怎么为这些动态添加的menu增加点击事件呢?
回9楼的。=====================================================
代码如下
============================================================
void __fastcall TForm1::Button1Click(TObject *Sender) { TMenuItem *p=new TMenuItem(pop); p->Caption="CCC"; //指定其click事件 p->OnClick=CCCItemClick; pop->Items->Add(p); //作为form的弹出菜单 PopupMenu=pop; } //————————————————————————— //为菜单定制的单击触发函数 void __fastcall TForm1::CCCItemClick(TObject *Sender) { TMenuItem *p=0; p=dynamic_cast<TMenuItem*>(Sender); if(p==0) return ; else ShowMessage(p->Caption); }
11 Oct
我有dll文件 和头文件,还有 自己生成适合bcb的lib文件,就是会出现调用不了的情况 谁能提供邮箱,我给dll,帮我在bcb下调用成功下
BCB工程中要添加你生成的那个适合于BCB的LIB库文件,然后别忘了正确的函数声名。
baidu.com bcb编写dll终极手册
如果还是不能调用的话,请发到 behard at tom.com
不过最好还是自己来记忆深刻一点
是用implib生成的lib文件吗?
a-few@netease.com
发给我看看.记得结贴给分