我正在做一个第三方组件:状态栏
要求:
    Panels项不可用
    必须有5个分割栏
    必须有一个DatsSet属性,同时该DS被激活后,在状态栏的某一分割栏动态
    显示其记录数/当前记录数
谁有好的例子,如果可行,马上给分

解决方案 »

  1.   

    这个控件应该从TPanel派生比较好一些。
    1.增加一个TDataLink组件,用于更新数据库的变化,定义一个TDataSource对象,用于建立TDataSet的数据源。
    2.增加OnDataChange事件的处理函数,并将这个函数交给TDataLink的OnDataChange事件。这个控件中不需要对TDataLink的OnUpdate事件进行处理。
    3.在新控件的构造函数中添加Panels,并且设置相应的宽度等属性,
    4.Panels的设置函数应该是SetPanels,并且不调用父类的同名虚拟函数,这样可以屏蔽掉Panels的设置过程,这个没有验证,也许是不要改变Panels的属性编辑器,使其不能被用户更改。大概需要这几个步骤,详细的代码要复杂一些,请参考TDataSource和TDataLink的联机帮助。
      

  2.   

    第4点应该是……重载SetPanels函数,并不调用父类同名函数……
      

  3.   

    其实我已经实现了其它部分
    关键是当我接收到一个DataSet后
    用户只需要填写相应的DS而不需要
    写代码就能够动态显示DS的记录数/当前记录数能不能给出这部分的代码?
    完整的
      

  4.   

    呵呵,你的要求太高了,我不会写代码,只会看,
    我想你是需要使用TDataLink
    或者在SetDS方法中实现,但是我想使用TDataLink比较好一些,因为当数据库发生改变的时候,你肯定是要更新Panels上的信息,这就需要使用TDataLink组件我这里有一个TDBJpegImage的数据库组件示例,如果需要我可以给你,应该会有帮助。
      

  5.   

    新年好,你都作完了,还要去干什么,我忘了这是在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派生而来的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
      

  6.   

    .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 ;                    //异常转发
            }
          }
        }
    }