关于如何解决C++ Builder中DBLookupComboBox不能输入的问题:

原创 2002年07月15日 09:40:00

如何让DBLookupComboBox能够输入,我的办法是做一个组合的控件,在它的下方(当然也可以是上方)加一个小编辑框,我已经完成了代码的80%,我是从TCustomControl继承下来,在我的代码后会有解释我为什么要从这个类继承,而不是从TWinControl继承,请大家先看代码:

.h File

//---------------------------------------------------------------------------

#ifndef KingKingH
#define KingKingH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Controls.hpp>
#include <Classes.hpp>
#include <Forms.hpp>
#include <dsgnintf.hpp>
#include <db.hpp>

//---------------------------------------------------------------------------
class PACKAGE TKingKing : public TCustomControl
{
private:
        TDBLookupComboBox *FLookup;
        TEdit *FEdit;
        TDataSource *FDataSource;
        TDataSource *FListSource;
        AnsiString FListField;
        AnsiString FKeyField;
        AnsiString FDataField;
        int FBaudRate;

protected:
        virtual void __fastcall Paint();
        virtual __fastcall ~TKingKing();
        virtual void __fastcall CreateWnd();
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);
        void __fastcall SetBaudRate(int BaudRate);
        void __fastcall DoMyJob(TObject *Sender,WORD  &Key,TShiftState Shift);

__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};
        __property int BaudRate={read=FBaudRate,write=SetBaudRate};
};
class TDataOfFieldProperty:public TStringProperty
{
    public:
       TPropertyAttributes  __fastcall GetAttributes()
       {
            return TPropertyAttributes()<<paValueList;
       }
       void __fastcall GetValues(TGetStrProc Proc)
       {
            Proc("None");
            TStrings *pList=new TStringList();;
            TKingKing *pDCBX=dynamic_cast<TKingKing*>(GetComponent(0));
            if(pDCBX)
            {
                if(pDCBX->DataSource)
                {
                    TDataSet *pDataSet=pDCBX->DataSource->DataSet;
                    if(pDataSet)
                    {
                        pDataSet->GetFieldNames(pList);
                        for(int i=0;i<pList->Count;i++)
                        {
                            Proc(pList->Strings[i]);
                        }
                    }
                }
            }
        delete pList;
       }

};
//List Field
class TListOfFieldProperty:public TStringProperty
{
    public:
       TPropertyAttributes  __fastcall GetAttributes()
       {
            return TPropertyAttributes()<<paValueList;
       }
       void __fastcall GetValues(TGetStrProc Proc)
       {
            Proc("None");
            TStrings *pList=new TStringList();
            TKingKing *pDCBX=dynamic_cast<TKingKing*>(GetComponent(0));
            if(pDCBX)
            {
                if(pDCBX->ListSource)
                {
                    TDataSet *pDataSet=pDCBX->ListSource->DataSet;
                    if(pDataSet)
                    {
                        pDataSet->GetFieldNames(pList);
                        for(int i=0;i<pList->Count;i++)
                        {
                            Proc(pList->Strings[i]);
                        }
                    }
                }
            }
        delete pList;
       }

};
//KeyField
class TKeyOfFieldProperty:public TStringProperty
{
    public:
       TPropertyAttributes  __fastcall GetAttributes()
       {
            return TPropertyAttributes()<<paValueList;
       }
       void __fastcall GetValues(TGetStrProc Proc)
       {
            Proc("None");
            TStrings *pList=new TStringList();
            TKingKing *pDCBX=dynamic_cast<TKingKing*>(GetComponent(0));
            if(pDCBX)
            {
                if(pDCBX->ListSource)
                {
                    TDataSet *pDataSet=pDCBX->ListSource->DataSet;
                    if(pDataSet)
                    {
                        pDataSet->GetFieldNames(pList);
                        for(int i=0;i<pList->Count;i++)
                        {
                            Proc(pList->Strings[i]);
                        }
                    }
                }
            }
       delete pList;
       }

};
class TBaudRateProperty:public TIntegerProperty     //Announcement:The property is only used to test.
{
    TPropertyAttributes __fastcall GetAttributes()
    {
        return TPropertyAttributes()<<paValueList;
    }
    void __fastcall GetValues(TGetStrProc Proc)
    {
        Proc("9600");
        Proc("14400");
        Proc("28800");
        Proc("57600");
    }
};


//---------------------------------------------------------------------------
#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;
}
TTypeInfo *IntInfo()
{
        TTypeInfo *pTypeInfo=new TTypeInfo;
        pTypeInfo->Kind=tkInteger;
        pTypeInfo->Name="Integer";
        return pTypeInfo;
}


__fastcall TKingKing::TKingKing(TComponent* Owner)
        : TCustomControl(Owner)
{
        FLookup=new TDBLookupComboBox(this);
        FEdit=new TEdit(this);
        FEdit->OnKeyDown=DoMyJob;
        Width = 150;
        Height=46;

}
//---------------------------------------------------------------------------
void __fastcall TKingKing::CreateWnd()
{
        TCustomControl::CreateWnd();
        FLookup->DataSource=DataSource;
        FLookup->ListSource=ListSource;
        FLookup->DataField=DataField;
        FLookup->ListField=ListField;
        FLookup->KeyField=KeyField;


}
//----------------------------------------------------------------------------
void __fastcall TKingKing::DoMyJob(TObject *Sender,WORD &Key,TShiftState Shift)
{
    if(Key==13)
    {
        FLookup->KeyField=FEdit->Text;
       
    }
}
//-------------------------------------------------------------------------

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;
}
void __fastcall TKingKing::SetBaudRate(int BaudRate)
{
        FBaudRate=BaudRate;
}


__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(TDataOfFieldProperty));
                 RegisterPropertyEditor(AnsiStringInfo(),__classid(TKingKing),"ListField",__classid(TListOfFieldProperty));
                 RegisterPropertyEditor(AnsiStringInfo(),__classid(TKingKing),"KeyField",__classid(TKeyOfFieldProperty));
                 RegisterPropertyEditor(IntInfo(),__classid(TKingKing),"BaudRate",__classid(TBaudRateProperty));
                 RegisterComponents("AKing", classes, 0);
        }
}
//---------------------------------------------------------------------------

那为什么我不从TWinControl继承,而从TCustomControl继承,我从类的层次来看这个问题:

我对两个组件进行比较发现:TDBLookupComboBox和TDBComboBox发现,首先它们的继承的类层次不同,其中TDBComboBox的继承层次有TCustomComboBox(而这个类是TComboBox的父类),而TDBLookupComboBox的最直接父类就是TCustomControl,这恰恰证明TDBLookupComboBox是放在Paint函数中被画出来的。而我的错误代码是从TWinControl继承下来的,而父类为TWinControl控件的最大特点就是自已能够画出自已,而TCustomControl则需要自已画自已(用Paint方法),据此可以判断TDBLookupComboBox为什么在设计期间就已经有了句柄的理由就是在从TCustomControl继承的过程序,TDBLookupComboBox不仅重载了Paint方法,还重载了CreateWnd方法。而如果你从TWinControl继承,再动态生成一个TDBLookupComboBox就会出现错误提示”该控件没有父窗口“。
我的代码基本上已经完成,唯一的一部分就是编辑框的OnKeyDown中的代码,你可自已根据需要来完成。

 


 

 

delphi相关笔记-与DBlookupcombobox的相关问题

1、在点击删除用户按钮时,要弹出一个删除用户窗口,要使得DBlookupcombobox一开始就显示数据库某字段的相关内容,就必须先赋值,即deleteuser.cbb2.Text:=DM.q_use...
  • hello_myhome
  • hello_myhome
  • 2015年03月24日 09:32
  • 1044

使用c++builder中stringgird控件和设定行名称和列名称的问题

问题:使用c++builder中stringgird控件怎么设定行名称和列名称怎么弄? 回答: 可以一次性的给行列分别赋值:   TStringList *tmpstrlist;   ...
  • niecuiyun1012
  • niecuiyun1012
  • 2015年11月13日 19:01
  • 417

C++ Builder 模拟键盘操作

键盘对于每个操作电脑的人员来说是最熟悉不过的了。键盘上的按键可分为两类: 按下后会在电脑的输入窗口上出现对应字符的按键,如字母键和数字键等,我们称之为字符键;按下后虽然看不到字符但会产生控制作用的按键...
  • C_S_D_N_USER
  • C_S_D_N_USER
  • 2014年08月26日 16:24
  • 2172

C++Builder之Edit和Memo

C++Builder之文本编辑(Edit、Memo) 1、AnsiString中第一个字符的下标为1而不是0; 2、TEdit组件 A、 PasswordChar 属性  密码替代字符。如...
  • ljianhui
  • ljianhui
  • 2012年07月22日 23:48
  • 6861

DBLookupComboBOX组件的使用方法

在许多数据表中,数据是以代码方式存放的,如在班级编码数据表tB03(表5.5)中,系部字段TB0309采用编码方式存放,系部真实名称则存放在系部编码表TB06。使用代码的好处是,用户可在编码表TB06...
  • Tercel99
  • Tercel99
  • 2011年05月08日 19:48
  • 2358

关于C++的问题

关于C++的问题标签(空格分隔): C/C++固定链接:https://www.zybuluo.com/SiberiaBear/note/208237 以下文字中部分代码是我随便写的,难免出错,望...
  • SiberiaBear
  • SiberiaBear
  • 2016年03月07日 20:56
  • 775

C++ Builder 中定时器的应用

今天,碰到一函数,一直在被调用,但一直找不到调用它的地方,跟踪了一下,原来该函数是定时器回调函数,示例程序如下(Timer1Timer是定时器回调函数): //--------------------...
  • stpeace
  • stpeace
  • 2013年10月19日 22:28
  • 5108

C++ 控制台cin无法输入

先看今天的代码,我要先从控制台输入一个整数n,再输入n个字符串。 [cpp] view plaincopyprint? // NO2.cpp //...
  • ZK_J1994
  • ZK_J1994
  • 2017年05月22日 01:03
  • 666

C++中父子类中指针的步长问题

#include using namespace std; class Parent { public: Parent(int a=0) { this->a = a; } virtu...
  • sum_TW
  • sum_TW
  • 2016年10月30日 23:43
  • 787

sublineText里面输入中文解决方法

先安装能在sublime text 2显示中文的字体,有一个非常好的开源字体,叫做“文泉驿字体”,安装如下: sudo apt-get install xfonts-wqy 官方网站:...
  • u012416928
  • u012416928
  • 2014年10月23日 11:15
  • 635
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于如何解决C++ Builder中DBLookupComboBox不能输入的问题:
举报原因:
原因补充:

(最多只允许输入30个字)