我爱builder

C++Builder 程序员博客

如何动态的在Image上导入图片,又如何动态的删除,然后有动态的生成呢?
重点是如何动态是Image空间里的图清空。!!!

释放GDI资源:
Image1->Picture->Dormant(); 

释放内存:       
Image1->Picture->FreeImage();

彻底销毁:
Image1->Picture->ReleaseHandle();

image->Picture->LoadFromFile("");    //加載
image->Picture = NULL;    //清空

有些问题,稍微查下帮助就知道了

  • Filed under: C++ Builder
  • for(int i=0;i <10;i++)
    {
    testThread * thread[i];
    thread[i]=new testThread(false,参数);
    }
    怎么不行???

    编译时报错

    C/C++ code
    /* 你的代码有问题,每次在循环里面定义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,?) ;

    }
    这样为什么不行呢?

    C/C++ code
    // 你需要把 xx定义为const变量 // const int xx =10; /*初始化在这里就要给出 ,后面就不能对他赋值(写入操作)了

    谢谢楼上

    void __fastcall testThread::Execute()
    {
            //—- Place thread code here —-
          Form1->Caption = "Updated in a thread";
    }

    为什么报没有定义Form1,是否要在线程中加什么东西

    C/C++ code
    // 你的留言中已回复,请查收

  • Filed under: C++ Builder
  • 动态创建的窗体在Onshow的时候启用一线程.
    该窗体有个TreeView1控件
    线程里已加入该动态窗体的头文件,比如Form2.h
    在线程文件里可以弹出Form2->TreeView1,但无法对其操作.
    比如线程里ShowMessage(Form2->Caption)编译通过的,但不能获得Form2的Caption属性.

    线程里访问VCL控件需要使用Synchronize来进行同步修改
    另外,线程里ShowMessage是得不到你想要的值的。需要用Messagebox

    引用 1 楼 yuanreid 的回复:
    建议启动线程时,将Form2的Handle,窗口的指针,线程需要显示的属性(Caption)都传入线程中,线程中想操作窗口某个属性可以发送消息,要读取某个属性也可以通过SendMessage的返回值来获取,或直接通过Form2的指针操作(这种方式不推荐,多线程中不推荐直接访问窗口控件,有可能出现异常,需要根据你的使用环境判断)

    不是有可能,是基本上会出现异常

    能写个简单的例子吗?
    比如我想访问窗体里的TreeView.
    myThead是自己的线程类.我这样传进去的时候,好像编译有问题.
    已在myThead头文件private中定义了接收参数的属性
    myThead *amyThead=new myThead(false,this->TreeView)

  • Filed under: C++ Builder
  • 例如一个TButton,他可能有OnClick或者OnMouseMove等一个或者多个事件。

    则么将他的所有已有的事件复制给另一个TButton?

    Button1->OnClick = Button2->OnClick;

    引用 2 楼 sterrys 的回复:
    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;
      }

    }

    引用 5 楼 sterrys 的回复:
    那样的话最好是自定义消息处理,将一个 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();

    C/C++ code
    /* 妖哥可能很忙吧! */
    C/C++ code
    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!!!
    真的很感谢

  • Filed under: C++ Builder
  •  
    我如此开辟二维树,为什么不可以调用?望高手说说错那里,当然欢迎更好的开辟方法,小弟弟先谢谢了ⷯ𜁠
        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〕;
    再把返回指针定义为所需的类型指针,肯定连续。

    把指针地址空间设成相应的大小一定可以

    你要连续的空间,连续的内存,可以试试容器里面套容器

    C/C++ code
    #include <vector> using namespace std; vector<vector<int> > CubeVector;//二维的

    而且这个对简单数据类型很时候的。。操作起来比较方便。不用搞指针。。。

    如果是存放大型对象,你可以用boost::shared_ptr 配合vectro来存储

    对象的指针.这样弄起来很好!

    楼上说的对,用STL最好,呵呵~~~~~~~

    连续的话new一个一维的数组,然后自己计算下标

    动态的本来就不可能是连续的。 用Vector不错的。

  • Filed under: C++ Builder
  • 如何动态的显示Button。
    即我在窗体上点那,Button就出现在那。

    同意楼上,或者干脆在form的onclick里面移动butoon

    这是我刚写好的,测试没有问题。鼠标点击窗口任意位置,在鼠标点击处创建一个Button

    C/C++ code
    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"; }

    主要看做什么用

    引用 3 楼 yuanreid 的回复:
    这是我刚写好的,测试没有问题。鼠标点击窗口任意位置,在鼠标点击处创建一个Button

    C/C++ code
    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;


    要是事先放了一个Button,我在窗体上点击那,那个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;

  • Filed under: C++ Builder
  • 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的上面,而不在下面……

    收到,谢谢!

  • Filed under: C++ Builder
  • 我在程序里动态创建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楼的提示下问题已解决

  • Filed under: C++ Builder
  • 问题是这样的
    我已经有了一个右键菜单句柄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的方法:

    C/C++ code
    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的方法:

    C/C++ code
    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的帮助里说:

    BatchFile code
    __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意味着这条路行不通)

    C/C++ code
    //你找到的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楼的。=====================================================
    代码如下
    ============================================================

    C/C++ code
    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); }

  • Filed under: C++ Builder
  • 我有dll文件 和头文件,还有 自己生成适合bcb的lib文件,就是会出现调用不了的情况 谁能提供邮箱,我给dll,帮我在bcb下调用成功下

    BCB工程中要添加你生成的那个适合于BCB的LIB库文件,然后别忘了正确的函数声名。

    baidu.com  bcb编写dll终极手册

    如果还是不能调用的话,请发到 behard at tom.com
    不过最好还是自己来记忆深刻一点

    是用implib生成的lib文件吗?

    a-few@netease.com
    发给我看看.记得结贴给分

  • Filed under: C++ Builder
  • 类别

    最新

    标签

    链接


    存档