(29)uniGUI for C++ builder下UniCalendarPanel的功能与试用

                                                                                    (中行雷威2018.11.28)

(同一个世界,同一个梦想,交流学习C++Builder XE10,传承c++builder的魅力!欢迎各地朋友加入我的QQ群484979943,进群密码“BCB”,同时也请将该群号广为宣传,希望能够广集各方高手,共同进步。如需下载开发工具及源代码请加入我的QQ群。)

【阅读倡议】

1、有问题请留言;

2、没问题请点赞;

3、看连载请加群;

4、下源码请加群;

【开发工具】

1、C++Builder10.2.3 tokyo

2、FMSoft_uniGUI_Complete_Professional_1.50.0.1481(正版)

3、本案例资源下载https://download.csdn.net/download/dlboy2018/10814495

4、也可访问我的QQ文件共享:A02-源代码  下载

本人主笔的国内第一本uniGUI教学案例代码已诞生,分为cbuilder和delphi两个版本,买代码送手册,需要的朋友可以加入我的QQ技术交流群484979943、860634510、299497712给我(群主)留言。资料简介:https://blog.csdn.net/dlboy2018/article/details/88923832

 

背景:

      脑子不好,每天都要有大量工作去做,没有个日程计划还真不行,为此,研究了一下unigui的UniCalendarPanel控件儿,不负众望,这个控件还不错!本人基于c++builder开发实现,全网首发。

一、新建项目

1、在D:\testCalendarPanel下创建一个项目,将其Include Path和Library Path都增加C:\Program Files (x86)\FMSoft\Framework\uniGUI\win32(我的unigui安装后编译的输出目录)

2、在project->options里将c++Linker-》Link with Dynamic RTL 设为false,将Packages->runtime Packages的Link with runtime packages设为false.

3、将MainModule的EnableSynchronous设置为true,将ServerModule的AutoCoInitialize属性设置为true

 

4、创建两个子窗口

UniFormEventAdd添加事件

UniFormEventEdit编辑事件(含删除)

5、MainForm包含UniFormEventAdd和UniFormEventEdit和UniMainModule,UniFormEventAdd包含MainForm和UniMainModule,UniFormEventEdit包含MainForm和UniMainModule

二、代码

1、UniMainModule.h

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

#ifndef MainModuleH
#define MainModuleH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <UniGUIMainModule.hpp>
//---------------------------------------------------------------------------
class TUniMainModule : public TUniGUIMainModule
{
__published:    // IDE-managed Components
private:    // User declarations

public:        // User declarations
    TDateTime eStartDate,eEndDate;//开始事件和结束事件
    bool eIsAllDay;//是否整天
    int eEventId,eCalendarId;//事件id和颜色id,前者不需要指定自动生成
    String eTitle,eNotes,eReminder,eDescription,eUrl;//eTitle事件的提示缩写,其它选择使用
    String clickFlag;//点击那个按钮的标识

    __fastcall TUniMainModule(TComponent* Owner, TComponent* AUniApplication);
};
//---------------------------------------------------------------------------
TUniMainModule *UniMainModule(void);
//---------------------------------------------------------------------------
#endif

2、Main.cpp

void __fastcall TMainForm::UniCalendarPanel1DayClick(TUniCalendarPanel *Sender, TDateTime ADate,
          bool Allday)
{
//添加事件
/*如果使用了RangeSelect事件,则不能使用DayClick事件,否则将两次激活事件*/
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::UniCalendarPanel1EventClick(TUniCalendarPanel *Sender,
          int AEventId, TUniCalendarEvent *AEvent)
{
//事件编辑
UniMainModule()->clickFlag="n";//按钮点击标志初始化

UniMainModule()->eCalendarId=AEvent->CalendarId;
UniMainModule()->eEventId=AEventId;
UniMainModule()->eStartDate=AEvent->StartDate;
UniMainModule()->eEndDate=AEvent->EndDate;
UniMainModule()->eIsAllDay=AEvent->IsAllDay;
UniMainModule()->eTitle=AEvent->Title.SubString(5,AEvent->Title.Length()-4);
UniMainModule()->eNotes=AEvent->Notes;
UniMainModule()->eDescription=AEvent->Description;
UniMainModule()->eReminder=AEvent->Reminder;
UniMainModule()->eUrl=AEvent->Url;

TUniFormEventEdit *formEventEdit=new TUniFormEventEdit(UniApplication);
formEventEdit->ShowModal();

if(UniMainModule()->clickFlag=="e")//按了编辑按钮
    {
    AEvent->EventId=UniMainModule()->eEventId;//更改event信息
    AEvent->CalendarId=UniMainModule()->eCalendarId;
    AEvent->Title=UniMainModule()->eTitle;
    AEvent->Notes=UniMainModule()->eNotes;
    AEvent->Description=UniMainModule()->eDescription;
    AEvent->Reminder=UniMainModule()->eReminder;
    AEvent->StartDate=UniMainModule()->eStartDate;
    AEvent->EndDate=UniMainModule()->eEndDate;
    AEvent->IsAllDay=UniMainModule()->eIsAllDay;
    AEvent->Url=UniMainModule()->eUrl;

    }
else if(UniMainModule()->clickFlag=="d") //按了删除按钮
    {
    AEvent->Free(); //释放event
    }

}
//---------------------------------------------------------------------------

void __fastcall TMainForm::UniCalendarPanel1RangeSelect(TUniCalendarPanel *Sender,
          TDateTime AStartDate, TDateTime AEndDate)
{
//添加时间段事件
/*如果使用RangeSelect事件,则不能使用DayClick事件,否则将两次激活事件*/
UniMainModule()->eStartDate=AStartDate;
UniMainModule()->eEndDate=AEndDate;

TUniFormEventAdd *formEventAdd=new TUniFormEventAdd(UniApplication);
formEventAdd->ShowModal();
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::UniTabSheet1BeforeFirstActivate(TObject *Sender, bool &AllowActivate)

{

//初始化日历增加几个事件
TUniCalendarEvent *e;
//随机生成几个事件
e=UniCalendarPanel1->Events->Add();
e->CalendarId=1;//事件颜色编号,系统默认带几个
e->Title="Title1";//事件提示,日历盘显示的内容
e->Notes="Notes1";//可能是扩展信息项
e->Description="Desc1";//可能是扩展信息项
e->Url="Url1";//可能是扩展信息项
e->Reminder="Reminder1";//可能是扩展信息项
e->StartDate=Date()-5;//事件开始时间
e->EndDate=Date()-4;//事件结束时间
e->IsAllDay=true;//单日时如果是true则为色带,否则是文字,多日时应该无效.

e=UniCalendarPanel1->Events->Add();
e->CalendarId=2;
e->Title="Title2";
e->Notes="Notes2";
e->Description="Desc2";
e->Url="Url2";
e->Reminder="Reminder2";
e->StartDate=Date()-5;
e->EndDate=Date()-3;
e->IsAllDay=false;

e=UniCalendarPanel1->Events->Add();
e->CalendarId=3;
e->Title="Title3";
e->Notes="Notes3";
e->Description="Desc3";
e->Url="Url3";
e->Reminder="Reminder3";
e->StartDate=Date()+1.1;
e->EndDate=Date()+1.5;
e->IsAllDay=false;

e=UniCalendarPanel1->Events->Add();
e->CalendarId=4;
e->Title="Title4";
e->Notes="Notes4";
e->Description="Desc4";
e->Url="Url4";
e->Reminder="Reminder4";
e->StartDate=Date();
e->EndDate=Date()+4;
e->IsAllDay=true;

}
//---------------------------------------------------------------------------
3、UniEventAdd.cpp

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "UnitEventAdd.h"
#include "MainModule.h"
#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "DBAccess"
#pragma link "MemDS"
#pragma link "Uni"
#pragma link "uniBitBtn"
#pragma link "uniButton"
#pragma link "uniCheckBox"
#pragma link "uniDateTimePicker"
#pragma link "uniEdit"
#pragma link "uniGUIBaseClasses"
#pragma link "uniGUIClasses"
#pragma link "uniLabel"
#pragma link "uniMemo"
#pragma link "uniPageControl"
#pragma link "uniPanel"
#pragma link "uniRadioGroup"
#pragma resource "*.dfm"
//---------------------------------------------------------------------------
__fastcall TUniFormEventAdd::TUniFormEventAdd(TComponent* Owner)
        : TUniForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TUniFormEventAdd::UniBitBtn1Click(TObject *Sender)
{
//添加
TUniCalendarEvent *e;

if(UniEdit1->Text.IsEmpty())
    {
    ShowMessageN("日程主题不能为空!");
    UniEdit1->SetFocus();
    return;
    }
if(UniMemo1->Text.Length()>500)
    {
    ShowMessageN("日程描述限制500个字!");
    UniMemo1->SetFocus();
    return;
    }
if(!UniCheckBox1->Checked && UniDateTimePicker1->DateTime>=UniDateTimePicker2->DateTime)
    {
    ShowMessageN("开始时间不能大于等于结束时间!");
    return;
    }

e=MainForm()->UniCalendarPanel1->Events->Add();

e->CalendarId=UniRadioGroup2->ItemIndex+1;//色调
e->Description=UniRadioGroup1->Items->Strings[UniRadioGroup1->ItemIndex];
e->Title="["+e->Description+"]"+UniEdit1->Text;
e->Notes=UniMemo1->Text;
e->Url=FormatDateTime("yyyyMMdd hh:nn:ss",Now());//我是一个多用户系统,用事件+用户号来标识事件
e->Reminder="";
e->StartDate=UniDateTimePicker1->DateTime;
e->EndDate=UniDateTimePicker2->DateTime;
if(UniCheckBox1->Checked)
    e->IsAllDay=true;
else
    e->IsAllDay=false;


this->Close();

}
//---------------------------------------------------------------------------
void __fastcall TUniFormEventAdd::UniFormBeforeShow(TObject *Sender)
{
UniDateTimePicker1->DateTime=UniMainModule()->eStartDate;
UniDateTimePicker2->DateTime=UniMainModule()->eEndDate;

UniEdit1->Text="";
UniMemo1->Text="";

UniEdit1->SetFocus();
}
//---------------------------------------------------------------------------

4、UniEventEdit.cpp

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "UnitEventEdit.h"
#include "MainModule.h"
#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "uniBitBtn"
#pragma link "uniButton"
#pragma link "uniCheckBox"
#pragma link "uniDateTimePicker"
#pragma link "uniEdit"
#pragma link "uniGUIBaseClasses"
#pragma link "uniGUIClasses"
#pragma link "uniLabel"
#pragma link "uniMemo"
#pragma link "uniPageControl"
#pragma link "uniPanel"
#pragma link "uniRadioGroup"
#pragma link "DBAccess"
#pragma link "MemDS"
#pragma link "Uni"
#pragma resource "*.dfm"
//---------------------------------------------------------------------------
__fastcall TUniFormEventEdit::TUniFormEventEdit(TComponent* Owner)
        : TUniForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TUniFormEventEdit::UniFormBeforeShow(TObject *Sender)
{
UniDateTimePicker1->DateTime=UniMainModule()->eStartDate;
UniDateTimePicker2->DateTime=UniMainModule()->eEndDate;
if(UniMainModule()->eIsAllDay)
    UniCheckBox1->Checked=true;
else
    UniCheckBox1->Checked=false;
UniEdit1->Text=UniMainModule()->eTitle;
UniMemo1->Text=UniMainModule()->eNotes;
for (int i = 0; i < UniRadioGroup1->Items->Count ; i++)
    {
    if(UniRadioGroup1->Items->Strings[i]==UniMainModule()->eDescription)
        {
        UniRadioGroup1->ItemIndex=i;
        break;
        }

    }
UniRadioGroup2->ItemIndex=UniMainModule()->eCalendarId-1;
//
UniEdit1->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TUniFormEventEdit::UniBitBtn3Click(TObject *Sender)
{
//删除
UniMainModule()->clickFlag="d";
this->Close();
}
//---------------------------------------------------------------------------

void __fastcall TUniFormEventEdit::UniBitBtn1Click(TObject *Sender)
{
//修改
if(UniEdit1->Text.IsEmpty())
    {
    ShowMessageN("日程主题不能为空!");
    UniEdit1->SetFocus();
    return;
    }
if(UniMemo1->Text.Length()>500)
    {
    ShowMessageN("日程描述限制500个字!");
    UniMemo1->SetFocus();
    return;
    }
if(!UniCheckBox1->Checked && UniDateTimePicker1->DateTime>=UniDateTimePicker2->DateTime)
    {
    ShowMessageN("开始时间不能大于等于结束时间!");
    return;
    }
UniMainModule()->eCalendarId=UniRadioGroup2->ItemIndex+1;

UniMainModule()->eDescription=UniRadioGroup1->Items->Strings[UniRadioGroup1->ItemIndex];
UniMainModule()->eTitle="["+UniMainModule()->eDescription+"]"+UniEdit1->Text;
UniMainModule()->eNotes=UniMemo1->Text;
//UniMainModule()->eUrl=FormatDateTime("yyyyMMdd hh:nn:ss",Now());
UniMainModule()->eReminder="";
UniMainModule()->eStartDate=UniDateTimePicker1->DateTime;
UniMainModule()->eEndDate=UniDateTimePicker2->DateTime;
if(UniCheckBox1->Checked)
    UniMainModule()->eIsAllDay=true;
else
    UniMainModule()->eIsAllDay=false;


UniMainModule()->clickFlag="e";
this->Close();
}
//---------------------------------------------------------------------------
三、运行效果

四、不解之惑

1、事件删除

UniCalendarPanel->Events->Delete(n);

本以为Delete能够删除eventId为n的事件,但是经过测试n=0时能有时候能删除点击的事件,但是偶尔不能,当n=2时点击节点,结果能够删除序号为2的事件(第一个为0),不稳定,很怪异,不知道是不是bug,后来用Event->free解决删除问题。

2、属性问题

Notes,Description,Reminder,Url都不知道是干嘛用的,猜想是扩展留用的吧。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值