C++Builder 程序员博客
22 Aug
如下代码在创建码表时不正确,请高手指点,不胜感谢!
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,问题已解决。
21 Aug
我想分析屏幕的图像,想建立一个大型二维数组,用于保存屏幕图像颜色数据。如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");
}
8 Aug
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);
26 Jul
在网上找了几篇文章,试过了还是不行
每次到了 DocumentElement 就没响应了
晕:
CoInitializeEx(NULL,COINIT_MULTITHREADED);
//使用TXMLDocument
…
CoUninitialize();
还是一样没响应啊
能不能说详细一点,感激不尽。
以解决 _di_IXMLDocument 代替 TXMLDocument
19 Jul
谁给我一段 自动创建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 ¦New ¦Data Module (or File ¦New ¦Other and click the Data Module icon) 这样生成的对吧? 然后再加入到原工程中, 但是编译时还是说DataModule1没有定义过 晕死了
注意包含Datamoudle1所在单元的头文件!
还不行,提示说 "ADOCommand1" is not a member of "TDataModule1" 又是为什么呢? 有点自卑了
顶!!!!!
你的ADOCommand1没有放在DataModule1里面.注意,凡是要用到ADO的地方,必须都包含头文件:DataModule1.h
17 Jul
自己创建控件,是从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};
};
在哪个地方实现代码?
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++的虚函数有些区别
在桌面上显示字幕。。。
类似于酷狗的歌词显示,不过只是汉字的移动而已。。。
学习一下
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"); // 写字
}
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 ¦FF_DONTCARE,
"宋体"
);
要对Label1操作?直接这样就行了:
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,如果你在这里混久了也"什么都会"了
好了。。这个贴也可以结了。。
12 Jul
我在动态创建MSComm中用了new TMSComm,但运行到MSComm->PortOpen = true时,程序说端口没有打开?
在网上差了一下,说是需要带许可证创建。请各位大侠不吝执教。 静态创建肯定是没有问题。
感谢楼上大哥,好长时间没上来了。是控件属性设置的问题。 在刚一创建完毕,不能对PortOpen进行开关属性操作。
8 Jul
对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 ¦ Write增加一个可读写的属性,命名为TestProp–>右侧的窗口中,将Type选择为 VARIANT–>再点击窗口上部工具栏中的刷新按钮(Refresh),这时在ActiveFormImp1.cpp单元中,系统自动生成了get_TestProp和set_TestProp函数的框架。
在这两个函数中加入一些代码,仅作测试用:
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> <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 这是不同的
26 Jun
我在线程里建立一个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;
线程类代码
__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下客户端测试代码
void __fastcall TForm1::Button2Click(TObject *Sender) { ClientSocket1->Active=true; }
你用我这个测试下,可以响应事件的!
响应消息
我觉得在构造函数里创建控件比较好!
不好意思,我没有明白楼主的意思
多谢二位相助,问题解决了,其实两种方法都可以的,兄弟这里谢过了,呵呵!