自定义组件 我正在做一个第三方组件:状态栏要求: Panels项不可用 必须有5个分割栏 必须有一个DatsSet属性,同时该DS被激活后,在状态栏的某一分割栏动态 显示其记录数/当前记录数谁有好的例子,如果可行,马上给分 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这个控件应该从TPanel派生比较好一些。1.增加一个TDataLink组件,用于更新数据库的变化,定义一个TDataSource对象,用于建立TDataSet的数据源。2.增加OnDataChange事件的处理函数,并将这个函数交给TDataLink的OnDataChange事件。这个控件中不需要对TDataLink的OnUpdate事件进行处理。3.在新控件的构造函数中添加Panels,并且设置相应的宽度等属性,4.Panels的设置函数应该是SetPanels,并且不调用父类的同名虚拟函数,这样可以屏蔽掉Panels的设置过程,这个没有验证,也许是不要改变Panels的属性编辑器,使其不能被用户更改。大概需要这几个步骤,详细的代码要复杂一些,请参考TDataSource和TDataLink的联机帮助。 第4点应该是……重载SetPanels函数,并不调用父类同名函数…… 其实我已经实现了其它部分关键是当我接收到一个DataSet后用户只需要填写相应的DS而不需要写代码就能够动态显示DS的记录数/当前记录数能不能给出这部分的代码?完整的 呵呵,你的要求太高了,我不会写代码,只会看,我想你是需要使用TDataLink或者在SetDS方法中实现,但是我想使用TDataLink比较好一些,因为当数据库发生改变的时候,你肯定是要更新Panels上的信息,这就需要使用TDataLink组件我这里有一个TDBJpegImage的数据库组件示例,如果需要我可以给你,应该会有帮助。 新年好,你都作完了,还要去干什么,我忘了这是在Delphi版,那个TDBJpegImage是使用C++编写的。我贴在这里给大家共享吧!.h文件//---------------------------------------------------------------------------#ifndef DBJpegImageH#define DBJpegImageH//---------------------------------------------------------------------------#include <SysUtils.hpp>#include <Controls.hpp>#include <Classes.hpp>#include <Forms.hpp>#include <Jpeg.hpp>#include <DBCtrls.hpp>#include <dbtables.hpp>//---------------------------------------------------------------------------class PACKAGE TDBJpegImage : public TCustomControl{ //从TCustomControl派生而来的TDBJpegImageprivate: TFieldDataLink * FDataLink; //用于响应数据库变化和编辑 TJPEGImage * FJpg; //用于存储和读取Jpeg格式的图片protected: void __fastcall DataChanged(TObject *Sender); //反映数据库的改变 void __fastcall UpdateData(TObject *Sender); //更新数据库的数据 AnsiString __fastcall GetDataField(void); //DataField属性的读取函数 TDataSource* __fastcall GetDataSource(void); //DataSource的读取函数 void __fastcall SetDataField(AnsiString Value); //DataField的设置函数 void __fastcall SetDataSource(TDataSource* Value);//DataSource的设置函数 virtual void __fastcall CreateParams(TCreateParams &Params );public: //CreateParams是重载TWinControl的虚拟函数 __fastcall TDBJpegImage(TComponent* Owner); //构造函数 __fastcall ~TDBJpegImage(void); //析构函数 Graphics::TBitmap* FBmp; //用于存储图片的数据 void __fastcall PasteFromCliborad(void); //用于从粘贴板获取图片数据 virtual void __fastcall Paint(void); //绘制控件的函数__published: //数据库必需的属性DataField和DataSource __property AnsiString DataField = {read=GetDataField,write=SetDataField,nodefault}; __property TDataSource* DataSource = {read=GetDataSource,write=SetDataSource,nodefault}; __property Color ; //继承发布父类的属性 __property Constraints ; //同上 __property Ctl3D = {stored=true} ; //同上 __property DragCursor ; //同上 __property DragKind ; //同上 __property DragMode ; //同上 __property Enabled ; //同上 __property Font ; //同上 __property ParentColor ; //同上 __property ParentCtl3D ; //同上 __property ParentFont ; //同上 __property ParentShowHint ; //同上 __property PopupMenu ; //同上 __property TabOrder ; //同上 __property TabStop ; //同上 __property Visible ; //同上 __property OnClick ; //继承发布父类的事件 __property OnContextPopup ; //同上 __property OnDblClick ; //同上 __property OnDragDrop ; //同上 __property OnDragOver ; //同上 __property OnEndDock ; //同上 __property OnEndDrag ; //同上 __property OnEnter ; //同上 __property OnExit ; //同上 __property OnKeyDown ; //同上 __property OnKeyPress ; //同上 __property OnKeyUp ; //同上 __property OnMouseDown ; //同上 __property OnMouseMove ; //同上 __property OnMouseUp ; //同上 __property OnStartDock ; //同上 __property OnStartDrag ; //同上};//---------------------------------------------------------------------------#endif .cpp文件//---------------------------------------------------------------------------#include <vcl.h>#pragma hdrstop#include "DBJpegImage.h"#include <clipbrd.hpp>#pragma package(smart_init)//---------------------------------------------------------------------------static inline void ValidCtrCheck(TDBJpegImage *){ new TDBJpegImage(NULL);}//---------------------------------------------------------------------------__fastcall TDBJpegImage::TDBJpegImage(TComponent* Owner) : TCustomControl(Owner){ ControlStyle = ControlStyle << csOpaque << csReplicatable; if(!NewStyleControls) //设置控件的风格 ControlStyle = ControlStyle << csFramed; FDataLink = new TFieldDataLink; //创建DataLink属性的对象 FDataLink->Control = this; //获取DataLink的控制权 FDataLink->OnDataChange = DataChanged; //设置OnDataChanged事件 FDataLink->OnUpdateData = UpdateData; //设置OnUpdateData事件 FBmp = new Graphics::TBitmap(); //创建内部位图 FJpg = new TJPEGImage(); //创建Jpeg图片对象}void __fastcall TDBJpegImage::CreateParams(TCreateParams &Params ){ //使控件具有边框和3D效果 TCustomControl::CreateParams(Params); if( Ctl3D ) Params.ExStyle = Params.ExStyle | WS_EX_CLIENTEDGE; else Params.Style = Params.Style | WS_BORDER; Params.WindowClass.style = Params.WindowClass.style & !(CS_HREDRAW | CS_VREDRAW);}//---------------------------------------------------------------------------__fastcall TDBJpegImage::~TDBJpegImage(void){ //析构函数 FDataLink->Control = NULL; FDataLink->OnDataChange = NULL; FDataLink->OnUpdateData = NULL; delete FDataLink; //销毁构造函数创建的对象 delete FBmp; delete FJpg;}//---------------------------------------------------------------------------namespace Dbjpegimage{ //注册函数 void __fastcall PACKAGE Register() { TComponentClass classes[1] = {__classid(TDBJpegImage)}; RegisterComponents("MyInterFace", classes, 0); }}//---------------------------------------------------------------------------AnsiString __fastcall TDBJpegImage::GetDataField(void){ //获取DataField属性(将FDataLink的属性映射到TDBJpegImage) return FDataLink->FieldName;}//---------------------------------------------------------------------------TDataSource* __fastcall TDBJpegImage::GetDataSource(void){ //获取DataSource属性(将FDataLink的属性映射到TDBJpegImage) return FDataLink->DataSource;}//---------------------------------------------------------------------------void __fastcall TDBJpegImage::SetDataField(AnsiString Value){ //设置DataField属性(将FDataLink的属性映射到TDBJpegImage) FDataLink->FieldName = Value;}//---------------------------------------------------------------------------void __fastcall TDBJpegImage::SetDataSource(TDataSource* Value){ //设置DataSource属性(将FDataLink的属性映射到TDBJpegImage) FDataLink->DataSource = Value;}//---------------------------------------------------------------------------void __fastcall TDBJpegImage::DataChanged(TObject *Sender){ //当数据库的数据发生变化的时候,将变化情况及时的反映在控件中 TBlobStream *Stream = new TBlobStream((TBlobField*)FDataLink->Field,bmRead); try //创建Blob字段的流,更妥当的方法是在创建流之前确 { //保字段是Blob类型,或者使用try关键字来捕获异常 if( Stream->Size != 0 ) { //字段的长度不为0时,将数据载入到Jpeg对象中 FJpg->LoadFromStream(Stream); FBmp->Assign(FJpg); //将Jpeg数据转换成Bitmap数据到FBmp中 } else //如果数据为空,则清楚内部存储位图(刷成白底) FBmp->Canvas->FillRect(ClientRect); Paint(); //刷新显示 } catch(...) { throw ; //发生异常时将异常抛出 } //在__finally组合语句中销毁Stream更合理一些,因为 delete Stream; //在__finally中,不管是否发生异常,均会销毁Stream }//---------------------------------------------------------------------------void __fastcall TDBJpegImage::UpdateData(TObject *Sender){ //更新被编辑的图片数据到数据库中 TBlobStream *Stream = new TBlobStream((TBlobField*)FDataLink->Field,bmWrite); try //首先创建TBlobStream { FJpg->Assign(FBmp); //从内部位图中获取图形数据 FJpg->Compress(); //压缩Jpeg对象的数据 FJpg->SaveToStream(Stream); //将Jpeg数据写入流 } catch(...) { throw ; //进行异常转发 } delete Stream; //销毁Stream}//---------------------------------------------------------------------------void __fastcall TDBJpegImage::Paint(void){ Canvas->FillRect(ClientRect); //清除控件显示的内容 Canvas->Draw(0,0,FBmp); //将内部位图的数据显示在控件上}void __fastcall TDBJpegImage::PasteFromCliborad(void){ //从剪贴板中获取图形数据 if( FDataLink->Editing ) //只有数据库处于编辑状态才作如下操作 { TClipboard *pCB = Clipboard(); //获取剪贴板 if (pCB->HasFormat(CF_BITMAP)) //检查数据类型 { try { FBmp->Assign(pCB); //获取数据 Paint(); //更新显示内容 UpdateData(this); //并更新数据库 } catch (...) { throw ; //异常转发 } } }} 图片上取活动一块区域????? DELPHI程序中如何判断操作系统多久没有任何操作? 问ScmTreeList.dcu是什么组件? Deiphi恢复数据库出错(数据库正使用,所以不能对数据库排它访问)求助一段SQL SERVER2000 数据库恢复代码!马上给发 函数1 不好意思,请问制作安装程序都需要包含那些文件? 如何将报表组合后打印? d7怎么安装QReport组件?在线等... service 如何做成多线程的???谢谢? ip搜索 Tdxdbgrid是一个什么样的东东,收费吗 在Dll文件中引用OBJ文件,怎样写?
1.增加一个TDataLink组件,用于更新数据库的变化,定义一个TDataSource对象,用于建立TDataSet的数据源。
2.增加OnDataChange事件的处理函数,并将这个函数交给TDataLink的OnDataChange事件。这个控件中不需要对TDataLink的OnUpdate事件进行处理。
3.在新控件的构造函数中添加Panels,并且设置相应的宽度等属性,
4.Panels的设置函数应该是SetPanels,并且不调用父类的同名虚拟函数,这样可以屏蔽掉Panels的设置过程,这个没有验证,也许是不要改变Panels的属性编辑器,使其不能被用户更改。大概需要这几个步骤,详细的代码要复杂一些,请参考TDataSource和TDataLink的联机帮助。
关键是当我接收到一个DataSet后
用户只需要填写相应的DS而不需要
写代码就能够动态显示DS的记录数/当前记录数能不能给出这部分的代码?
完整的
我想你是需要使用TDataLink
或者在SetDS方法中实现,但是我想使用TDataLink比较好一些,因为当数据库发生改变的时候,你肯定是要更新Panels上的信息,这就需要使用TDataLink组件我这里有一个TDBJpegImage的数据库组件示例,如果需要我可以给你,应该会有帮助。
#define DBJpegImageH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Controls.hpp>
#include <Classes.hpp>
#include <Forms.hpp>
#include <Jpeg.hpp>
#include <DBCtrls.hpp>
#include <dbtables.hpp>
//---------------------------------------------------------------------------
class PACKAGE TDBJpegImage : public TCustomControl
{ //从TCustomControl派生而来的TDBJpegImage
private:
TFieldDataLink * FDataLink; //用于响应数据库变化和编辑
TJPEGImage * FJpg; //用于存储和读取Jpeg格式的图片
protected:
void __fastcall DataChanged(TObject *Sender); //反映数据库的改变
void __fastcall UpdateData(TObject *Sender); //更新数据库的数据
AnsiString __fastcall GetDataField(void); //DataField属性的读取函数
TDataSource* __fastcall GetDataSource(void); //DataSource的读取函数
void __fastcall SetDataField(AnsiString Value); //DataField的设置函数
void __fastcall SetDataSource(TDataSource* Value);//DataSource的设置函数
virtual void __fastcall CreateParams(TCreateParams &Params );
public: //CreateParams是重载TWinControl的虚拟函数
__fastcall TDBJpegImage(TComponent* Owner); //构造函数
__fastcall ~TDBJpegImage(void); //析构函数 Graphics::TBitmap* FBmp; //用于存储图片的数据
void __fastcall PasteFromCliborad(void); //用于从粘贴板获取图片数据
virtual void __fastcall Paint(void); //绘制控件的函数
__published: //数据库必需的属性DataField和DataSource
__property AnsiString DataField = {read=GetDataField,write=SetDataField,nodefault};
__property TDataSource* DataSource = {read=GetDataSource,write=SetDataSource,nodefault};
__property Color ; //继承发布父类的属性
__property Constraints ; //同上
__property Ctl3D = {stored=true} ; //同上
__property DragCursor ; //同上
__property DragKind ; //同上
__property DragMode ; //同上
__property Enabled ; //同上
__property Font ; //同上
__property ParentColor ; //同上
__property ParentCtl3D ; //同上
__property ParentFont ; //同上
__property ParentShowHint ; //同上
__property PopupMenu ; //同上
__property TabOrder ; //同上
__property TabStop ; //同上
__property Visible ; //同上
__property OnClick ; //继承发布父类的事件
__property OnContextPopup ; //同上
__property OnDblClick ; //同上
__property OnDragDrop ; //同上
__property OnDragOver ; //同上
__property OnEndDock ; //同上
__property OnEndDrag ; //同上
__property OnEnter ; //同上
__property OnExit ; //同上
__property OnKeyDown ; //同上
__property OnKeyPress ; //同上
__property OnKeyUp ; //同上
__property OnMouseDown ; //同上
__property OnMouseMove ; //同上
__property OnMouseUp ; //同上
__property OnStartDock ; //同上
__property OnStartDrag ; //同上
};
//---------------------------------------------------------------------------
#endif
#pragma hdrstop#include "DBJpegImage.h"
#include <clipbrd.hpp>
#pragma package(smart_init)
//---------------------------------------------------------------------------static inline void ValidCtrCheck(TDBJpegImage *)
{
new TDBJpegImage(NULL);
}
//---------------------------------------------------------------------------
__fastcall TDBJpegImage::TDBJpegImage(TComponent* Owner)
: TCustomControl(Owner)
{
ControlStyle = ControlStyle << csOpaque << csReplicatable;
if(!NewStyleControls) //设置控件的风格
ControlStyle = ControlStyle << csFramed;
FDataLink = new TFieldDataLink; //创建DataLink属性的对象
FDataLink->Control = this; //获取DataLink的控制权
FDataLink->OnDataChange = DataChanged; //设置OnDataChanged事件
FDataLink->OnUpdateData = UpdateData; //设置OnUpdateData事件
FBmp = new Graphics::TBitmap(); //创建内部位图
FJpg = new TJPEGImage(); //创建Jpeg图片对象
}void __fastcall TDBJpegImage::CreateParams(TCreateParams &Params )
{ //使控件具有边框和3D效果
TCustomControl::CreateParams(Params);
if( Ctl3D )
Params.ExStyle = Params.ExStyle | WS_EX_CLIENTEDGE;
else
Params.Style = Params.Style | WS_BORDER;
Params.WindowClass.style = Params.WindowClass.style & !(CS_HREDRAW | CS_VREDRAW);
}//---------------------------------------------------------------------------
__fastcall TDBJpegImage::~TDBJpegImage(void)
{ //析构函数
FDataLink->Control = NULL;
FDataLink->OnDataChange = NULL;
FDataLink->OnUpdateData = NULL;
delete FDataLink; //销毁构造函数创建的对象
delete FBmp;
delete FJpg;
}
//---------------------------------------------------------------------------
namespace Dbjpegimage
{ //注册函数
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TDBJpegImage)};
RegisterComponents("MyInterFace", classes, 0);
}
}
//---------------------------------------------------------------------------
AnsiString __fastcall TDBJpegImage::GetDataField(void)
{ //获取DataField属性(将FDataLink的属性映射到TDBJpegImage)
return FDataLink->FieldName;
}
//---------------------------------------------------------------------------
TDataSource* __fastcall TDBJpegImage::GetDataSource(void)
{ //获取DataSource属性(将FDataLink的属性映射到TDBJpegImage)
return FDataLink->DataSource;
}
//---------------------------------------------------------------------------
void __fastcall TDBJpegImage::SetDataField(AnsiString Value)
{ //设置DataField属性(将FDataLink的属性映射到TDBJpegImage)
FDataLink->FieldName = Value;
}
//---------------------------------------------------------------------------
void __fastcall TDBJpegImage::SetDataSource(TDataSource* Value)
{ //设置DataSource属性(将FDataLink的属性映射到TDBJpegImage)
FDataLink->DataSource = Value;
}
//---------------------------------------------------------------------------
void __fastcall TDBJpegImage::DataChanged(TObject *Sender)
{ //当数据库的数据发生变化的时候,将变化情况及时的反映在控件中
TBlobStream *Stream = new TBlobStream((TBlobField*)FDataLink->Field,bmRead);
try //创建Blob字段的流,更妥当的方法是在创建流之前确
{ //保字段是Blob类型,或者使用try关键字来捕获异常
if( Stream->Size != 0 )
{ //字段的长度不为0时,将数据载入到Jpeg对象中
FJpg->LoadFromStream(Stream);
FBmp->Assign(FJpg); //将Jpeg数据转换成Bitmap数据到FBmp中
}
else //如果数据为空,则清楚内部存储位图(刷成白底)
FBmp->Canvas->FillRect(ClientRect);
Paint(); //刷新显示
}
catch(...)
{
throw ; //发生异常时将异常抛出
} //在__finally组合语句中销毁Stream更合理一些,因为
delete Stream; //在__finally中,不管是否发生异常,均会销毁Stream
}
//---------------------------------------------------------------------------
void __fastcall TDBJpegImage::UpdateData(TObject *Sender)
{ //更新被编辑的图片数据到数据库中
TBlobStream *Stream = new TBlobStream((TBlobField*)FDataLink->Field,bmWrite);
try //首先创建TBlobStream
{
FJpg->Assign(FBmp); //从内部位图中获取图形数据
FJpg->Compress(); //压缩Jpeg对象的数据
FJpg->SaveToStream(Stream); //将Jpeg数据写入流
}
catch(...)
{
throw ; //进行异常转发
}
delete Stream; //销毁Stream
}
//---------------------------------------------------------------------------
void __fastcall TDBJpegImage::Paint(void)
{
Canvas->FillRect(ClientRect); //清除控件显示的内容
Canvas->Draw(0,0,FBmp); //将内部位图的数据显示在控件上
}
void __fastcall TDBJpegImage::PasteFromCliborad(void)
{ //从剪贴板中获取图形数据
if( FDataLink->Editing ) //只有数据库处于编辑状态才作如下操作
{
TClipboard *pCB = Clipboard(); //获取剪贴板
if (pCB->HasFormat(CF_BITMAP)) //检查数据类型
{
try
{
FBmp->Assign(pCB); //获取数据
Paint(); //更新显示内容
UpdateData(this); //并更新数据库
}
catch (...)
{
throw ; //异常转发
}
}
}
}