📄 newcalendar.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "NewCalendar.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(TNewCalendar *)
{
new TNewCalendar(NULL);
}
//---------------------------------------------------------------------------
__fastcall TNewCalendar::TNewCalendar(TComponent* Owner)
: TCalendar(Owner)
{
FReadOnly = true; //新增加的代码用于设置ReadOnly的初始值
FDataLink = new TFieldDataLink(); //创建数据连接对象实例
FDataLink->Control = this; //该对象实例属于当前控件
FDataLink->OnDataChange = DataChange; // 指定方法到OnDataChange事件
}
__fastcall TNewCalendar::~TNewCalendar()
{
FDataLink->Control = NULL; //解除数据连接对象的所属关系
FDataLink->OnUpdateData = NULL; //先将所有数据更新
FDataLink->OnDataChange = NULL;
delete FDataLink; //然后删除该对象
}
//---------------------------------------------------------------------------
namespace Newcalendar
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TNewCalendar)};
RegisterComponents("Samples", classes, 0);
}
}
//---------------------------------------------------------------------------
bool __fastcall TNewCalendar::SelectCell(long ACol, long ARow)
{
if (!FUpdating && FReadOnly)
return false; //如果ReadOnly为False并且不可更新,使用户不可选择时间单元
return TCalendar::SelectCell(ACol, ARow);
}
//-------------------------------------------------------------------------------------------------
void __fastcall TNewCalendar::UpdateCalendar()
{
FUpdating=true; //每次更新之前先将更新标志设为True,允许更新
try //获取可能出现的异常
{
TCalendar::UpdateCalendar();// 使用基类的UpdateCalendar方法更新
}
catch(...) //捕获异常后
{
FUpdating = false; //将更新标志设为False,不允许更新
throw; //弹出异常
}
FUpdating = false; // 完成更新后将更新标志重新设置为False
}
//-------------------------------------------------------------------------------------------------
AnsiString __fastcall TNewCalendar::GetDataField()
{
return FDataLink->FieldName; //返回数据连接类的字段名
}
//-------------------------------------------------------------------------------------------------
//GetDataSource方法的定义-----------------------------------------------------------------
TDataSource *__fastcall TNewCalendar::GetDataSource()
{
return FDataLink->DataSource; //返回数据连接类的数据源
}
//SetDataField方法的定义---------------------------------------------------------------
void __fastcall TNewCalendar::SetDataField(AnsiString Value)
{
FDataLink->FieldName = Value; 将参数值指定给数据连接类的字段名
}
//-------------------------------------------------------------------------------------------------
//SetDataSource方法的定义------------------------------------------------------------------
void __fastcall TNewCalendar::SetDataSource(TDataSource *Value)
{
if(Value != NULL) //如果传递的数据源不空
Value->FreeNotification(this); //确保传递的数据源在释放之前被通知
FDataLink->DataSource = Value; //将参数指定到数据连接类的数据源
}
//-------------------------------------------------------------------------------------------------
void __fastcall TNewCalendar::DataChange( TObject* Sender)
{
if (FDataLink->Field == NULL) // 如果没有指定任何字段
CalendarDate = 0; //不设置任何数据
else
CalendarDate = FDataLink->Field->AsDateTime; // 否则,设置新的日期数据
}
//------------------------------------------------------
void __fastcall TNewCalendar::MouseDown(TMouseButton Button, TShiftState Shift,int X, int Y)
{
TMouseEvent MyMouseDown; // 申明一个鼠标事件类型的变量
if (!FReadOnly && FDataLink->Edit()) // 如果数据字段可以编辑
TCalendar::MouseDown(Button, Shift, X, Y);//调用基类的MouseDown方法
else //否则
{
MyMouseDown = OnMouseDown; // 指定为当前控件的OnMouseDown事件
if (MyMouseDown != NULL) //如果得到了一个事件
MyMouseDown(this, Button, Shift, X, Y); //执行MyMouseDown事件句柄
}
}
//-----------------------------------------------------------------------------
void __fastcall TDBCalendar::KeyDown(unsigned short &Key, TShiftState Shift)
{
TKeyEvent MyKeyDown; // 申明事件类型的变量
Set<unsigned short,0,8> keySet;
keySet = keySet << VK_UP << VK_DOWN << VK_LEFT // 指定虚拟键集合
<< VK_RIGHT << VK_END << VK_HOME << VK_PRIOR << VK_NEXT;
if (!FReadOnly && (keySet.Contains(Key)) && FDataLink->Edit() )
// 如果控件不是只读的并且是定义的键集合中的键值,字段处于可编辑模式
{
TCustomGrid::KeyDown(Key, Shift); // 调用基类的KeyDown方法
}
else
{
MyKeyDown = OnKeyDown; //指定OnKeyDown事件
if (MyKeyDown != NULL) MyKeyDown(this,Key,Shift); // 执行OnKeyDown事件句柄中的代码
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -