• 全部
  • Windows SDK/API
  • 基础类
  • ActiveX
  • 数据库及相关技术
  • 网络及通讯开发
  • VCL组件使用和开发
  • 问答

StringGrid的单元格编辑开始,单元格编辑状态结束

ljwwjh 2003-07-14 02:21:36

StringGrid 表格和其他的三方的表格中都没有单元格编辑开始,单元格编辑状态结束的事件;
因此在编程时非常不方便,我增加了这两个事件,并请请大家帮忙检查一下,另外当表格失去焦点时
编辑结束没有加上必须在程序中处理,希望高手增加上,谢了!

组件代码片段:
<jhStringGrid.h>文件
class PACKAGE TjhStringGrid : public TStringGrid
{
typedef TStringGrid Inherit; //方便直接调用祖先方法常加保存祖先类型的变量
typedef void __fastcall (__closure *celldatachanged)(TObject *Sender,int ACol,int ARow,int state); //定义事件的参数

private:
bool editing ;

celldatachanged oncelleditstart; //单元格进入编辑状态;
celldatachanged oncelleditend; //单元格编辑状态结束


protected:

DYNAMIC void __fastcall MouseDown(Controls::
TMouseButton Button, Classes::TShiftState Shift, int X, int Y); //重载鼠标按下动态函数
virtual bool __fastcall SelectCell(int ACol, int ARow); //重载选中单元格虚函数;
DYNAMIC void __fastcall KeyPress(char &Key); //重载键按下动态函数;

public:
__published:

__property celldatachanged OnCellEditStart={read=oncelleditstart,write=oncelleditstart}; //单元格进入编辑状态;
__property celldatachanged OnCellEditEnd={read=oncelleditend,write=oncelleditend}; //单元格编辑状态结束

};
//---------------------------------------------------------------------------
#endif

<jhstringGrid.cpp>文件

static inline void ValidCtrCheck(TjhStringGrid *)
{
new TjhStringGrid(NULL);
}
//---------------------------------------------------------------------------

__fastcall TjhStringGrid::TjhStringGrid(TComponent* Owner) :TStringGrid(Owner)
{

editing=false; //初始是没有进入编辑状态
}

//------------------------------------------------------------------------------------------------
void __fastcall TjhStringGrid::MouseDown(Controls::TMouseButton Button, Classes::TShiftState Shift, int X, int Y)
{
Inherit::MouseDown(Button, Shift,x, y) ;

if( this->EditorMode && !this->editing) //当鼠标按下,表格允许编辑同时表格处于非编辑态时发出开始编辑事件
{
editing=true;
if (oncelleditstart)
oncelleditstart(this,this->Col,this->Row,0);
}
else
editing=false;
}


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


void __fastcall TjhStringGrid::KeyPress(char &Key)
{
char Akey=Key;
Inherit::KeyPress(Key);
// 编辑开始
if(this->EditorMode&&!editing ) //当有键按下,表格允许编辑同时表格处于非编辑态时发出开始编辑事件
{
editing=true;
if (oncelleditstart)
oncelleditstart(this,this->Col,this->Row,0);
return;
}
//编辑结束
if(Akey==13&& editing) //当是回车键同时表格处于编辑状态时,发出编辑结束事件
{ editing=false;
if(oncelleditend)
oncelleditend(this,this->Col,this->Row,0);
}

}

//--------------------------------------------------
bool __fastcall TjhStringGrid::SelectCell(int ACol, int ARow)
{

bool f=Inherit::SelectCell(ACol,ARow);
if(this->EditorMode&&editing) //当表格处于编辑状态,选择了其他单元格发出编辑结束事件
{
editing=false;
if(oncelleditend)
this->oncelleditend(this,this->Col,this->Row,0);
}
editing=false;

return f;

}
...全文
102 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Lewolf 2003-07-20
也许是因为在退出的时候,已经有一些对象被销毁了,你可以跟踪一下错误是在那一步发生的,看看错误的原因是什么。
回复
ljwwjh 2003-07-19
大家不感兴趣!结贴了.
感谢 Lewolf给的建议!
回复
Lewolf 2003-07-18
typedef TStringGrid Inherit; 是为了兼容Pascal的继承而定义的,在BCB中创建控件,不需要这样作,构造函数是自动调用基类的构造函数,因此不需要Inherit;

需要使用基类的时候,直接使用 TStringGrid 就行了


StartEdit和EndEdit可能在不同的情况下都会触发,不如创建两个虚拟函数,专门用于触发这两个事件,这样允许其派生类在必要的时候更改事件的触发条件。
就如同Click虚拟方法触发OnClick事件一样,在需要的时候调用Click方法就行了。
回复
ljwwjh 2003-07-18
typedef TStringGrid Inherit是为了改变继承不同控件时,便于在修改程序中引用基类的代码,而增加的.
接受Lewolf的下面几条:构造函数是自动调用基类的构造函数,StartEdit和EndEdit改成虚拟函数;
但是用我用你的书中办法将在组件中Onexit事件绑定一个事件,如下:
protected:
TNotifyEvent Fuseexit;
__published:
void__property TNotifyEvent OnExit={read=Fuseexit,write=Fuseexit};

void __fastcall TStringGridEx::useexit(TObject *Sender);
.cpp
Inherit::Onexit=this->useexit;

void __fastcall TStringGridEx::useexit(TObject *Sender)
{

if(this->EditorMode&&editing)
{
editing=false;
if(oncelleditend)
this->oncelleditend(this,this->Col,this->Row,0);
}
editing=false;
if(Fuseexit)
this->Fuseexit(this);

}
在推出程序是有异常产生,问题出在那里,希望Lewolf指正!
谢谢!

回复
ljwwjh 2003-07-17
请大家指点一下,来者都有分!
谢谢了!
回复
ljwwjh 2003-07-17
请大家指点一下,来者都有分!
谢谢了!
回复
solares1 2003-07-16
gz
回复
yydy 2003-07-16
xx
回复
ljwwjh 2003-07-16
up
回复
发帖
C++ Builder
创建于2007-08-02

1.3w+

社区成员

C++ Builder相关内容讨论区
申请成为版主
帖子事件
创建了帖子
2003-07-14 02:21
社区公告
暂无公告