我爱builder

C++Builder 程序员博客

如下代码在创建码表时不正确,请高手指点,不胜感谢!

void CRC32::BuildTable32()
{
    int i,j;
    long crc;
    for (i = 0; i < 256; i++)
    {
        crc = i;
        for (j = 0; j < 8; j++)
            {
              if (crc & 1)
                crc = (crc >> 1) ^ 0xEDB88320;
          else
                crc >>= 1;
        }
        TableCRC32[i] = crc;
    }
}

请高人赐教啊!

CRC要确定初始状态和多项式,计算结果也可以取反,所以一个串数值会有不同的CRC结果。

所以你要了解你需要的是什么CRC多项式和初始值,计算结果取不取反。

多谢liskman,问题已解决。

  • Filed under: C++ Builder
  • 我想分析屏幕的图像,想建立一个大型二维数组,用于保存屏幕图像颜色数据。如int aa[1024][768];
    系统提示堆栈OverFlow,不知大家有什么办法建立这样的大型数组?

    创建全局的,或者静态的.

    该回复于2008-08-02 12:36:14被版主删除

    用指针试试。

    楼主的问题出在申请的数组是局部变量是在堆栈中分配,堆栈的空间有限;
    解决办法:  1。用全局变量;2。静态变量 static int aa[1024][768];
              3.动态申请,如new ,  4.堆heap中申请,malloc 等

    #include "alloc.h"  // heap

    typedef
        int AA[768];

    int bb[1024][768];      // 全局
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
          //  int aa[1024][768];  栈中会溢出
          static int aa[1024][768];    // 静态

          AA * cc =new AA[1024];    // 静态区中分配
          AA * dd=(AA *)calloc(1024,768);  // 堆中分配,可以海量

          ShowMessage("test");
    }

  • Filed under: C++ Builder
  • class PACKAGE TNumEdit : public TEdit
    {
    private:
    virtual void __fastcall KeyPress(char &Key);
    protected:
    public:
    __fastcall TNumEdit(TComponent* Owner);
    __published:
    };
    出错信息为:
    [C++ Error] NumEdit.h(14): E2113 Virtual function '_fastcall TNumEdit::KeyPress(char &)' conflicts with base class 'TWinControl'。
    请问该如何解决?谢谢!

    virtual void __fastcall KeyPress(TObject *Sender, char &Key);

    virtual void __fastcall KeyPress(TObject *Sender, char &Key);

    virtual void __fastcall KeyPress(TObject *Sender, char &Key);

    谢谢各位!应该这样就可以了
            DYNAMIC void __fastcall KeyPress(char &Key);

  • Filed under: C++ Builder
  • 在网上找了几篇文章,试过了还是不行
    每次到了 DocumentElement 就没响应了

    晕:
    CoInitializeEx(NULL,COINIT_MULTITHREADED);
    //使用TXMLDocument

    CoUninitialize();

    还是一样没响应啊
    能不能说详细一点,感激不尽。

    以解决 _di_IXMLDocument 代替 TXMLDocument

  • Filed under: C++ Builder
  • 谁给我一段 自动创建ACCESS数据库的代码?  论坛上找了好多了,但就是不行 
    同盟用到哪些控件请说明一下

    不行啊    有没有人给我详细讲一下啊

    怎么不行?

    可以的,呵呵,代码主要是loveshell完成的,它是原作者!

    loveshell的那段代码我测试过的,后面的代码有些改动,你把整个帖子看完,包括后面的回复帖子!

    bool TDM::CreateTempDataBase()
    {//创建一个临时数据库
            Variant  CreateAccess ;
            String dataname="Data\\temp.mdb"
            if(FileExists(dataname))
                    DeleteFile(dataname);
            String dir="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=";
            String connstring=dir+dataname;
            //通过建立ADOX(Microsoft ActiveX(R) Data Objects Extensions)对象进行访问
            CreateAccess=CreateOleObject("ADOX.Catalog");
            try{
                    CreateAccess.OleFunction("Create",connstring.c_str());//创建数据库
                    TADOCommand *comm=new TADOCommand(this);
                    comm->ConnectionString=connstring; //创建数据表
                    comm->CommandText="create table 上报汇总(段别 varchar(3),类型 varchar(10),名称 varchar(25),编号 varchar(15),生产厂家 varchar(20),生产日期 varchar(10),机车号 varchar(15),检修日期 datetime)";
                    comm->Execute();
                    delete comm;

                    return true;
            }
            catch(…){
                    return false;
            }
    }
    //—————————————————————————

    呵呵,最简单的做个模板文件放在那里,用时复制一份。好多程序就是这样做的。

    请问LOVESHELL  conn=conn+DbName;  DBNAME是什么啊,没有定义过啊

    还有那个DataModule1在哪里啊

    那是我自己的代码,你得稍微改一下。DBNAME是你要生成的数据库的路径,DataModule1是放ADOCommand1的地方,代码用到了TADOConnection和TADOCommand两个控件。

    我吧数据库放到资源文件中了,用的时候在拿出来用。。。

    DataModule1是To create a new, empty data module, choose File &brvbarNew &brvbarData Module (or File &brvbarNew &brvbarOther and click the Data Module icon) 这样生成的对吧?  然后再加入到原工程中,  但是编译时还是说DataModule1没有定义过    晕死了 

    注意包含Datamoudle1所在单元的头文件!

    还不行,提示说 "ADOCommand1" is not a member of "TDataModule1"  又是为什么呢?    有点自卑了

    顶!!!!!

    你的ADOCommand1没有放在DataModule1里面.注意,凡是要用到ADO的地方,必须都包含头文件:DataModule1.h

  • Filed under: C++ Builder
  • 自己创建控件,是从TTcpClient继承下来的,不知如何重载OnConnect事件,自加的两个属性是可以了.以下是代码,请高手指点
    class PACKAGE MyTcpClient : public TTcpClient
    {
    private:
    protected:
    public:
            __fastcall MyTcpClient(TComponent* Owner);
            int wwork;
            int wwait;
    __published:
            __property int work = {read=wwork,write=wwork};
            __property int wait = {read=wwait,write=wwait};
    };
    在哪个地方实现代码?

    C/C++ code
    class PACKAGE MyTcpClient : public TTcpClient { private: protected: public: __fastcall MyTcpClient(TComponent* Owner); __property TSocketNotifyEvent OnConnect = {read=FOnConnect, write=FOnConnect}; TSocketNotifyEvent FOnConnect; };

    首先感谢两位的回答,
    to akirya
    class PACKAGE  MyTcpClient : public TTcpClient
    {
    private:
    protected:
    public:
        __fastcall MyTcpClient(TComponent* Owner);
        __property TSocketNotifyEvent OnConnect = {read=FOnConnect, write=FOnConnect};
        TSocketNotifyEvent FOnConnect;    <–这行错误  E2109 Not an allowed type
    };

    把这行移一下就可以了
    class PACKAGE  MyTcpClient : public TTcpClient
    {
    private:
    protected:
        TSocketNotifyEvent FOnConnect;    <–这行移到这里
    public:
        __fastcall MyTcpClient(TComponent* Owner);
        __property TSocketNotifyEvent OnConnect = {read=FOnConnect, write=FOnConnect};
    };
    但是OnConnect的函数实现部分怎么写呀,我不知道
    我是在MyTcpClient.cpp里这样写的,但编译通不过
    void __fastcall MyTcpClient::FOnConnect()
    {
        TTcpClient::Connect();
        //加入自己要写的代码
    }

    TSocketNotifyEvent OnConnect 这不是已经有了么?

    你只需要写一个函数对FOnConnect这个函数指针赋值就能响应了。
    VCL使用的方法是Delphi的。和C++的虚函数有些区别

  • Filed under: C++ Builder
  • 在桌面上显示字幕。。。
    类似于酷狗的歌词显示,不过只是汉字的移动而已。。。

    学习一下
    void __fastcall TForm1::FormPaint(TObject *Sender)
    {
        Canvas->Brush->Color = clWhite;  // 透明色
        Canvas->FillRect(ClientRect);
        Canvas->Font->Height = 76;
        Canvas->Font->Style = TFontStyles() < <fsBold;
        Canvas->TextOut(0,0,"Hello");  // 写字
    }

    引用 1 楼 Waiting4you 的回复:
    Form1的TransparentColor属性设为true;
    TransparentColorValue属性设为要透明的颜色,比如白色。

    Form1的OnPaint事件里写字:

    C/C++ codevoid __fastcall TForm1::FormPaint(TObject *Sender)
    {
        Canvas->Brush->Color = clWhite;  // 透明色
        Canvas->FillRect(ClientRect);
        Canvas->Font->Height = 76;
        Canvas->Font->Style = TFontStyles() < <fsBold;
        Canvas->TextOut(0,0,"Hello");  // 写字…


    高手啊。。什么都会。。为什么设置这个没用。
      TCanvas *pCanvas = Label1->Canvas;

        pCanvas->Brush->Style = bsClear;  // 文字背景透明
        pCanvas->Font->Color = clBlue;

        pCanvas->Font->Handle = CreateFont(
            36,
            72,
            0,
            0,
            FW_DONTCARE,
            FALSE,
            FALSE,
            FALSE,
            GB2312_CHARSET,
            OUT_DEFAULT_PRECIS,
            CLIP_DEFAULT_PRECIS,
            PROOF_QUALITY,//DEFAULT_QUALITY,
            DEFAULT_PITCH &brvbarFF_DONTCARE,
            "宋体"
        );

    要对Label1操作?直接这样就行了:

    C/C++ code
    Label1->Font->Handle = CreateFont( 36, 72, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, GB2312_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH|FF_DONTCARE, "宋体" ); Label1->Font->Color = clBlue; Label1->Transparent = true;

    btw,如果你在这里混久了也"什么都会"了

    好了。。这个贴也可以结了。。

  • Filed under: C++ Builder
  • 我在动态创建MSComm中用了new TMSComm,但运行到MSComm->PortOpen = true时,程序说端口没有打开?
    在网上差了一下,说是需要带许可证创建。请各位大侠不吝执教。  静态创建肯定是没有问题。

    感谢楼上大哥,好长时间没上来了。是控件属性设置的问题。 在刚一创建完毕,不能对PortOpen进行开关属性操作。

  • Filed under: C++ Builder
  • 对c++builder不是很懂 我想完成这个功能
    单击HTML button 来调用ACTIVEX控件里的方法。
    麻烦可以给出个实例吗

    先谢谢了,可以快点么

    麻烦发到我的邮箱 hudfga@163.com 谢谢了 !

    快点恐怕不行,我得下班后回家找找。另外,例子的代码必须发到论坛里,否则这一帖就只能移到茶馆做散分帖了。

    哦 可以

    找了一圈没有找到,明天重帮你写一个吧,你是要ActiveForm的例子还是ActiveX Control的例子?

    妖哥真是乐于助人

    ActiveForm的嘛 谢谢了

    汗 问题解决了

    我来了,今天上午在D版混了,下午睡了会觉。晚上才来的及帮你写例子,不好意思。

    File–>New–>Other–>ActiveX–>Active Form–>New ActiveX Name: ActiveFormX–>Ok

    在ActiveFormX窗体上放置一个Label,命名为lblTest
    在ActiveFormProj1.tlb窗口中,点击左侧树列表中的IActiveFormX–>再点击窗口上部工具栏中的New Property按钮旁边的下拉三角,选Read &brvbar Write增加一个可读写的属性,命名为TestProp–>右侧的窗口中,将Type选择为 VARIANT–>再点击窗口上部工具栏中的刷新按钮(Refresh),这时在ActiveFormImp1.cpp单元中,系统自动生成了get_TestProp和set_TestProp函数的框架。
    在这两个函数中加入一些代码,仅作测试用:

    C/C++ code
    STDMETHODIMP TActiveFormXImpl::get_TestProp(VARIANT* Value) { try { VARIANT v; VariantInit(&v); V_BSTR(&v) = SysAllocString(WideString(m_VclCtl->lblTest->Caption)); V_VT(&v) = VT_BSTR; *Value = v; VariantClear(&v); } catch(Exception &e) { return Error(e.Message.c_str(), IID_IActiveFormX); } return S_OK; }; STDMETHODIMP TActiveFormXImpl::set_TestProp(VARIANT Value) { try { m_VclCtl->lblTest->Caption = String(Value.bstrVal); } catch(Exception &e) { return Error(e.Message.c_str(), IID_IActiveFormX); } return S_OK; };

    填写发布相关的一些选项同:
    Project–>Web Deployment Options–>Project
    Target dir(Full path of the deployed OCX)中填入C:\www
    Target URL(Virtual path of the deployed OCX)中填入http://192.168.2.1 (看你的IIS配置)
    HTML dir(Full path of the deployed HTML file)中填入C:\www

    设置完全编译:
    Project->Options->Compiler中点击Release,
    Project->Options->Packages中取消Builder with runtime packages的对钩
    Project->Options->Linker中取消Use dynamic RTL前的对钩

    现在就可以编译并发布了:
    Project–>Web Deploy
    如果一切正常为,系统会在C:\www目录中生成ActiveFormProj1.ocx和ActiveFormProj1.htm两个文件

    接下来要做的工作还很多,由于涉及到安全问题,需要要给ActiveX签名(如果嫌烦琐,可以降低IE的安全级别,也就是把IE设置中有关ActiveX的选项都设成启用,有一定风险,自己看着办),至于这个签名,网上有一段很著名的教程,搜索"千中元是混蛋"就可以找到(抱歉这看起来象是骂人,可能是作者和他的朋友开玩笑)

    签名完成后,开始加工ActiveFormProj1.htm文件,达到你要的"HTML与ActiveX交互":

    修改ActiveFormProj1.htm内容大致如下:

    HTML code
    <HTML> <H1> C++Builder 6 ActiveX Test Page </H1><p> You should see your C++Builder 6 forms or controls embedded in the form below. <HR><center><P> <OBJECT classid="clsid:33474525-2F29-4569-86AB-0FD47D419991" codebase="http://192.168.2.1/ActiveFormProj1.ocx#version=1,0,1,4" width=350 height=250 align=center hspace=0 vspace=0 id="CrnActiveForm" > </OBJECT> <!– 注意上面的代码中,classid是不同的,codebase中的版本号也是不同的 –> <script language="javascript" type="text/javascript"> function MySetValue(FString) { document.getElementById("CrnActiveForm").TestProp = FString; } function MyGetValue() { var s = document.getElementById("CrnActiveForm").TestProp; document.getElementById("edtGetValue").value = s; } </script> <br /> <input type="text" value="挖卡卡" name="edtNewValue" size="8"> <input type="button" value="设置" name="btnSetValue" onclick="MySetValue(edtNewValue.value)"> <input type="text" value="" id="edtGetValue" size="8" class=clEdit> <input type="button" value="读取" name="btnGetValue" onClick="MyGetValue()"></td> </HTML>

    以上所有代码在BCB 6.0 + IE 6.0中测试通过。

    汗 问题昨天解决了 分还是给 不过你回答的真仔细 不过照上面做的时候要注意你的clsid:33474525-2F29-4569-86AB-0FD47D419991 这是不同的

  • Filed under: C++ Builder
  • 我在线程里建立一个TServerSocket,为什么在Client端连接的时候不能触发OnAccept事件呢。
    代码如下:
    线程的头文件:
    //—————————————————————————

    #ifndef thdSocketH
    #define thdSocketH

    #include <Classes.hpp>
    #include <windows.h>
    #include <dos.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    #include <StrUtils.hpp>
    #include <ScktComp.hpp>
    //—————————————————————————
    class flow : public TThread
    {
    private:
          void __fastcall Execute(void);

    protected:
    __published:
          TServerSocket *SSK;

          void __fastcall SSKClient(TObject *Sender,TCustomWinSocket *Socket);
          void __fastcall SSKAccept(TObject *Sender,TCustomWinSocket *Socket);
    public:
          __fastcall flow();
    };
    //—————————————————————————
    #endif

    线程:
    //—————————————————————————
    #include <vcl.h>
    #pragma hdrstop

    #include <windows.h>
    #include <dos.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    #include <StrUtils.hpp>
    #include "thdSocket.h"
    #include "NetTest.h"
    #include <ScktComp.hpp>

    #pragma package(smart_init)

    //—————————————————————————
    __fastcall flow::flow() : TThread(true)
    {
      FreeOnTerminate=false;
      Resume();
    }
    //—————————————————————————
    void __fastcall flow::Execute()
    {
      SSK=new TServerSocket(Application);
      SSK->OnAccept=SSKAccept;
      SSK->OnClientConnect=SSKClient;
      SSK->Port=1234;
      SSK->Active=true;

    }
    //—————————————————————————
    void __fastcall flow::SSKClient(TObject *Sender,
              TCustomWinSocket *Socket)
    {
      Form1->Caption="333333";
    }
    //—————————————————————————
    void __fastcall flow::SSKAccept(TObject *Sender,TCustomWinSocket *Socket)
    {
      Form1->Caption="333333";
    }
    //—————————————————————————

    在SSKClient和SSKAccept中设置断点,可是运行显示没有执行这行,谁能帮忙解答一下,多谢!

    TMsg MsgRec;

    线程类代码

    C/C++ code
    __fastcall flow::flow(bool bSuspend) : TThread(bSuspend) { SSK=new TServerSocket(0); SSK->OnAccept=SSKAccept; SSK->OnClientConnect=SSKClient; SSK->Port=1234; //SSK->OnClientRead=SSKOnClientRead; SSK->Active=true; } //————————————————————————— void __fastcall flow::Execute() { } //————————————————————————— void __fastcall flow::SSKClient(TObject *Sender, TCustomWinSocket *Socket) { ShowMessage(Socket->RemoteAddress); } //————————————————————————— void __fastcall flow::SSKAccept(TObject *Sender,TCustomWinSocket *Socket) { ShowMessage("ClientAccept"); } //————————————————————————— __fastcall flow:: ~flow() { if(SSK!=0) { if(SSK->Active) SSK->Active=false; delete SSK; } }

    Form1下客户端测试代码

    C/C++ code
    void __fastcall TForm1::Button2Click(TObject *Sender) { ClientSocket1->Active=true; }

    你用我这个测试下,可以响应事件的!

    引用 3 楼 jxw1987628 的回复:
    线程类代码

    C/C++ code

    __fastcall flow::flow(bool bSuspend) : TThread(bSuspend)
    {
      SSK=new TServerSocket(0);
      SSK->OnAccept=SSKAccept;
      SSK->OnClientConnect=SSKClient;
      SSK->Port=1234;
      //SSK->OnClientRead=SSKOnClientRead;
      SSK->Active=true;
    }
    //—————————————————————————
    void __fastcall flow::Execute()
    {

    }
    //———…


    你的都不是在线程当中执行,当然可以影响消息。

    响应消息

    :-)

    我觉得在构造函数里创建控件比较好!

    不好意思,我没有明白楼主的意思

    多谢二位相助,问题解决了,其实两种方法都可以的,兄弟这里谢过了,呵呵!

  • Filed under: C++ Builder
  • 类别

    最新

    标签

    链接


    存档