关于组件制作的问题: 看来c++ builder和Delphi论坛对组件有研究的人比较少。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 问题差不多已被我找到了。因为我对两个组件进行比较发现:TDBLookupComboBox和TDBComboBox发现,首先它们的继承的类层次不同,其中TDBComboBox的继承层次有TCustomComboBox(而这个类是TComboBox的父类),而TDBLookupComboBox的最直接父类就是TCustomControl,这恰恰证明TDBLookupComboBox是放在Paint函数中被画出来的。而我的错误代码是从TWinControl继承下来的,而父类为TWinControl控件的最大特点就是自已能够画出自已,而TCustomControl则需要自已画自已(用Paint方法),据此可以判断TDBLookupComboBox为什么在设计期间就已经有了句柄的理由就是在从TCustomControl继承的过程序,TDBLookupComboBox不仅重载了Paint方法,还重载了CreateWnd方法。而如果你从TWinControl继承,再动态生成一个TDBLookupComboBox就会出现错误提示”该控件没有父窗口“。欢迎各位网友参与讨论。 我将我的代码贴如下://---------------------------------------------------------------------------#ifndef KingKingH#define KingKingH//---------------------------------------------------------------------------#include <SysUtils.hpp>#include <Controls.hpp>#include <Classes.hpp>#include <Forms.hpp>#include <dsgnintf.hpp>//---------------------------------------------------------------------------class PACKAGE TKingKing : public TCustomControl{private: TDBLookupComboBox *FLookup; TEdit *FEdit; TDataSource *FDataSource; TDataSource *FListSource; AnsiString FListField; AnsiString FKeyField; AnsiString FDataField;protected: virtual void __fastcall Paint(); virtual __fastcall ~TKingKing();public: __fastcall TKingKing(TComponent* Owner); void __fastcall SetDataSource(TDataSource *DataSource); void __fastcall SetListSource(TDataSource *DataSource); void __fastcall SetKeyField(AnsiString Field); void __fastcall SetDataField(AnsiString Field); void __fastcall SetListField(AnsiString Field);__published: __property TDataSource* DataSource={read=FDataSource,write=SetDataSource}; __property TDataSource *ListSource={read=FListSource,write=SetListSource}; __property AnsiString KeyField={read=FKeyField,write=SetKeyField}; __property AnsiString ListField={read=FListField,write=SetListField}; __property AnsiString DataField={read=FDataField,write=SetDataField};};//DataField PropertyEditorclass TDataFieldProperty:public TStringProperty{public: TPropertyAttributes __fastcall GetAttributes() { return TPropertyAttributes()<<paValueList; } void __fastcall GetValues(TGetStrProc Proc) { Proc("None"); TDataSet *pDataSet; TKingKing *pDCBX=dynamic_cast<TKingKing*>(GetComponent(0)); if(pDCBX) { if(pDCBX->DataSource) { pDataSet=pDCBX->DataSource->DataSet; if(pDataSet) { TStrings *pList=new TStringList(); pDataSet->GetFieldNames(pList); for(int i=0;i<pList->Count;i++) { Proc(pList->Strings[i]); } delete pList; } } } }};//ListField PropertyEditorclass TListFieldProperty:public TStringProperty{public: TPropertyAttributes __fastcall GetAttributes() { return TPropertyAttributes()<<paValueList; } void __fastcall GetValues(TGetStrProc Proc) { Proc("None"); TDataSet *pDataSet; TKingKing *pDCBX=dynamic_cast<TKingKing*>(GetComponent(0)); if(pDCBX) { if(pDCBX->ListSource) { pDataSet=pDCBX->ListSource->DataSet; if(pDataSet) { TStrings *pList=new TStringList(); pDataSet->GetFieldNames(pList); for(int i=0;i<pList->Count;i++) { Proc(pList->Strings[i]); } delete pList; } } } }};//KeyField PropertyEditorclass TKeyFieldProperty:public TStringProperty{public: TPropertyAttributes __fastcall GetAttributes() { return TPropertyAttributes()<<paValueList; } void __fastcall GetValues(TGetStrProc Proc) { Proc("None"); TDataSet *pDataSet; TKingKing *pDCBX=dynamic_cast<TKingKing*>(GetComponent(0)); if(pDCBX) { if(pDCBX->ListSource) { pDataSet=pDCBX->ListSource->DataSet; if(pDataSet) { TStrings *pList=new TStringList(); pDataSet->GetFieldNames(pList); for(int i=0;i<pList->Count;i++) { Proc(pList->Strings[i]); } delete pList; } } } }};//---------------------------------------------------------------------------#endif.cpp File//---------------------------------------------------------------------------#include <vcl.h>#pragma hdrstop#include "KingKing.h"#pragma package(smart_init)//---------------------------------------------------------------------------// ValidCtrCheck is used to assure that the components created do not have// any pure virtual functions.//static inline void ValidCtrCheck(TKingKing *){ new TKingKing(NULL);}//---------------------------------------------------------------------------TTypeInfo *AnsiStringInfo(){ TTypeInfo *pTypeInfo=new TTypeInfo; pTypeInfo->Kind=tkLString; pTypeInfo->Name="AnsiString"; return pTypeInfo;}__fastcall TKingKing::TKingKing(TComponent* Owner) : TCustomControl(Owner){ FLookup=new TDBLookupComboBox(this); FEdit=new TEdit(this); Width = 150; Height=46;}//---------------------------------------------------------------------------void __fastcall TKingKing::Paint(){ Width = 150; Height=46; FLookup->Parent=this; FLookup->Left=0; FLookup->Top=0; FLookup->Width=145; FLookup->Height=21; FEdit->Parent=this; FEdit->Left=0; FEdit->Top=FLookup->Height; FEdit->Width=80; FEdit->Height=21;}void __fastcall TKingKing::SetDataSource(TDataSource *DataSource){ FDataSource=DataSource;}//--------------------------------------------------------------------------void __fastcall TKingKing::SetListSource(TDataSource *DataSource){ FListSource=DataSource;}//--------------------------------------------------------------------------void __fastcall TKingKing::SetKeyField(AnsiString Field){ FKeyField=Field;}void __fastcall TKingKing::SetListField(AnsiString Field){ FListField=Field;}void __fastcall TKingKing::SetDataField(AnsiString Field){ FDataField=Field;}__fastcall TKingKing::~TKingKing(){ if(FLookup) { delete FLookup; } if(FEdit) { delete FEdit; } }namespace Kingking{ void __fastcall PACKAGE Register() { TComponentClass classes[1] = {__classid(TKingKing)}; RegisterPropertyEditor(AnsiStringInfo(),__classid(TKingKing),"DataField",__classid(TDataFieldProperty)); RegisterPropertyEditor(AnsiStringInfo(),__classid(TKingKing),"ListField",__classid(TListFieldProperty)); RegisterPropertyEditor(AnsiStringInfo(),__classid(TKingKing),"KeyField",__classid(TKeyFieldProperty)); RegisterComponents("AKing", classes, 0); }}//--------------------------------------------------------------------------- OK,很不错,应该从TCustomControl中继承。 注入DLL程式到程序,如何加载 vmware环境下安装了win2003,请问 关于文本转换为BYTE数组的问题,请大家帮忙修改代码 如何隐藏一个类名为tool_class32的窗口? 提个问题!很简单!顶也有分 开发的容器控件,如何限定容器中允许添加的子控件类型? 老是看到倒分贴,郁闷 100分!RichEdit控件如何设置上下标? xpmenu!help(我很急) 如何编程操作互联网上的SQLSERVER数据库 求救,那位老大有关于贷款软件的源码,单机版的,高分求救! 如何实现对象观察器中的下拉框?
欢迎各位网友参与讨论。
//---------------------------------------------------------------------------#ifndef KingKingH
#define KingKingH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Controls.hpp>
#include <Classes.hpp>
#include <Forms.hpp>
#include <dsgnintf.hpp>
//---------------------------------------------------------------------------
class PACKAGE TKingKing : public TCustomControl
{
private:
TDBLookupComboBox *FLookup;
TEdit *FEdit;
TDataSource *FDataSource;
TDataSource *FListSource;
AnsiString FListField;
AnsiString FKeyField;
AnsiString FDataField;protected:
virtual void __fastcall Paint();
virtual __fastcall ~TKingKing();
public:
__fastcall TKingKing(TComponent* Owner);
void __fastcall SetDataSource(TDataSource *DataSource);
void __fastcall SetListSource(TDataSource *DataSource);
void __fastcall SetKeyField(AnsiString Field);
void __fastcall SetDataField(AnsiString Field);
void __fastcall SetListField(AnsiString Field);__published:
__property TDataSource* DataSource={read=FDataSource,write=SetDataSource};
__property TDataSource *ListSource={read=FListSource,write=SetListSource};
__property AnsiString KeyField={read=FKeyField,write=SetKeyField};
__property AnsiString ListField={read=FListField,write=SetListField};
__property AnsiString DataField={read=FDataField,write=SetDataField};
};
//DataField PropertyEditor
class TDataFieldProperty:public TStringProperty
{
public:
TPropertyAttributes __fastcall GetAttributes()
{
return TPropertyAttributes()<<paValueList;
}
void __fastcall GetValues(TGetStrProc Proc)
{
Proc("None");
TDataSet *pDataSet;
TKingKing *pDCBX=dynamic_cast<TKingKing*>(GetComponent(0));
if(pDCBX)
{ if(pDCBX->DataSource)
{
pDataSet=pDCBX->DataSource->DataSet;
if(pDataSet)
{
TStrings *pList=new TStringList();
pDataSet->GetFieldNames(pList); for(int i=0;i<pList->Count;i++)
{
Proc(pList->Strings[i]);
}
delete pList;
}
}
}
}
};
//ListField PropertyEditor
class TListFieldProperty:public TStringProperty
{
public:
TPropertyAttributes __fastcall GetAttributes()
{
return TPropertyAttributes()<<paValueList;
}
void __fastcall GetValues(TGetStrProc Proc)
{
Proc("None");
TDataSet *pDataSet;
TKingKing *pDCBX=dynamic_cast<TKingKing*>(GetComponent(0));
if(pDCBX)
{ if(pDCBX->ListSource)
{
pDataSet=pDCBX->ListSource->DataSet;
if(pDataSet)
{
TStrings *pList=new TStringList();
pDataSet->GetFieldNames(pList);
for(int i=0;i<pList->Count;i++)
{
Proc(pList->Strings[i]);
}
delete pList;
}
}
}
}
};
//KeyField PropertyEditor
class TKeyFieldProperty:public TStringProperty
{
public:
TPropertyAttributes __fastcall GetAttributes()
{
return TPropertyAttributes()<<paValueList;
}
void __fastcall GetValues(TGetStrProc Proc)
{
Proc("None");
TDataSet *pDataSet;
TKingKing *pDCBX=dynamic_cast<TKingKing*>(GetComponent(0));
if(pDCBX)
{ if(pDCBX->ListSource)
{
pDataSet=pDCBX->ListSource->DataSet;
if(pDataSet)
{
TStrings *pList=new TStringList();
pDataSet->GetFieldNames(pList);
for(int i=0;i<pList->Count;i++)
{
Proc(pList->Strings[i]);
}
delete pList;
}
}
}
}
};//---------------------------------------------------------------------------
#endif
.cpp File
//---------------------------------------------------------------------------#include <vcl.h>
#pragma hdrstop#include "KingKing.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//static inline void ValidCtrCheck(TKingKing *)
{
new TKingKing(NULL);
}
//---------------------------------------------------------------------------
TTypeInfo *AnsiStringInfo()
{
TTypeInfo *pTypeInfo=new TTypeInfo;
pTypeInfo->Kind=tkLString;
pTypeInfo->Name="AnsiString";
return pTypeInfo;
}__fastcall TKingKing::TKingKing(TComponent* Owner)
: TCustomControl(Owner)
{
FLookup=new TDBLookupComboBox(this);
FEdit=new TEdit(this);
Width = 150;
Height=46;}
//---------------------------------------------------------------------------
void __fastcall TKingKing::Paint()
{ Width = 150;
Height=46;
FLookup->Parent=this;
FLookup->Left=0;
FLookup->Top=0;
FLookup->Width=145;
FLookup->Height=21; FEdit->Parent=this;
FEdit->Left=0;
FEdit->Top=FLookup->Height;
FEdit->Width=80;
FEdit->Height=21;
}
void __fastcall TKingKing::SetDataSource(TDataSource *DataSource)
{
FDataSource=DataSource;
}
//--------------------------------------------------------------------------
void __fastcall TKingKing::SetListSource(TDataSource *DataSource)
{
FListSource=DataSource;
}
//--------------------------------------------------------------------------
void __fastcall TKingKing::SetKeyField(AnsiString Field)
{
FKeyField=Field;
}
void __fastcall TKingKing::SetListField(AnsiString Field)
{
FListField=Field;
}
void __fastcall TKingKing::SetDataField(AnsiString Field)
{
FDataField=Field;
}__fastcall TKingKing::~TKingKing()
{
if(FLookup)
{
delete FLookup;
}
if(FEdit)
{
delete FEdit;
}
}
namespace Kingking
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TKingKing)};
RegisterPropertyEditor(AnsiStringInfo(),__classid(TKingKing),"DataField",__classid(TDataFieldProperty));
RegisterPropertyEditor(AnsiStringInfo(),__classid(TKingKing),"ListField",__classid(TListFieldProperty));
RegisterPropertyEditor(AnsiStringInfo(),__classid(TKingKing),"KeyField",__classid(TKeyFieldProperty));
RegisterComponents("AKing", classes, 0);
}
}
//---------------------------------------------------------------------------