起步软件技术论坛-X3

 找回密码
 立即注册
搜索
楼主: huixiangtao

【结帖】TFECalendar控件问题**

[复制链接]
发表于 2009-7-7 15:15:28 | 显示全部楼层
在这个function TMAINFORM.GetDateStr(ADate: TDateTime): String;函数里面设置一下断点,看看什么情况下传入的ADate不正确
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-7 15:37:04 | 显示全部楼层
哦,行,我跟踪一下。
不过其实FECalendar1是单击一次,他就稍微移动一点,多单击几次,他就移动了一个表格。
如果我在数据库中把“值班安排表”的数据全部删除,也就是把“1日”下面的人员都删了,再次运行的时候,“1日”就在正确的位置了。
回复 支持 反对

使用道具 举报

发表于 2009-7-7 17:35:13 | 显示全部楼层
只能去掉代码一点点排除看看:

procedure TMainForm.FECalendar1Click(Sender: TObject);
方法中只是执行FECalendar1.Repaint;看看
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-8 11:03:39 | 显示全部楼层
这个问题莫名其妙的又消失了。

还有一问题:FECalendar1.Repaint; 会不会调用TMainForm.FECalendar1DrawCellProperties事件?
回复 支持 反对

使用道具 举报

发表于 2009-7-8 11:05:09 | 显示全部楼层
会的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-8 11:21:37 | 显示全部楼层
现在又出现一个问题:我在ECalendar1的click事件中安排值班人,ECalendar1的click事件代码如下所示。如果某一天已经排班,我再次更改排班的时候,会出现该天的值班人没有显示出来的问题,我把功能窗体关了,然后再打开,该天的值班人才正常显示。
procedure TMainForm.FECalendar1Click(Sender: TObject);
var
  i, j: Integer;
  p: TPoint;
  f: TPBCT;
  s: String;
  kssj:TDateTime;
  zbbh,BM,DBLD,DD:string;
  filter:string;
begin
  Borland.Delphi.Windows.GetCursorPos(p);
  p := FECalendar1.ScreenToClient(p);
  i := FECalendar1.GetXCol(p.X);
  j := FECalendar1.GetYRow(p.Y);
  f := TPBCT.Create(Context);
  try
   f.Date := FECalendar1.GetCellDate(i, j);
  if f.ShowModal=Business.Forms.Controls.mrOk then
  begin
   f.DataSetPBSJJ.First;
      while not f.DataSetPBSJJ.Eof do
      begin
      s:=f.DataSetPBSJJ.FieldByName('ZBRY').AsString;
      BM:=f.DataSetPBSJJ.FieldByName('BM').AsString;
      DBLD:=f.DataSetPBSJJ.FieldByName('DBLD').AsString;
      DD:=ComboBox3.text;
       if ((s<>nil)and (s<>'')) then
       begin
      kssj:=f.Date+DateUtils.TimeOf(f.DataSetPBSJJ.FieldByName('KSSJ').AsDateTime);
      filter:='zbapb_kssj=to_date('''+sysutils.DateTimeToStr(kssj)+''',''yyyy-mm-dd hh24:mi:ss'') and ZBAPB_DD='''+DD +'''';
      DataSetPB.userFilter:= filter;
      DataSetPB.Open;
      if DataSetPB.RecordCount<>0 then
      begin
      zbbh:=DataSetPB.FieldByName('ZBAPB_ZBBH').AsString;
      if JSDialogs.QuestionBox(f.DataSetPBSJJ.FieldByName('xs').AsString+'时间段已经排班,确定要替换之前的值班安排吗?', '排班替换', 1)=IDYES then begin
           Query1.Close;
           Query1.CommandText:='update zbapb set zbapb_dbld='''+DBLD+''' , ZBAPB_ZBRY='''+S+''' , ZBAPB_ZBBM='''+BM+''' where zbapb_zbbh='''+zbbh+'''';
           Query1.Execute;
           DataSetPB.Refresh;
           FECalendar1.Repaint;
          end;
      end else
      begin
        DataSetPB.Append;
        DataSetPB.FieldByName('ZBAPB_ZBRQ').AsDateTime := f.Date;
        DataSetPB.FieldByName('ZBAPB_ZBBM').AsString := f.DataSetPBSJJ.FieldByName('BM').AsString;
        DataSetPB.FieldByName('ZBAPB_ZBRY').AsString := f.DataSetPBSJJ.FieldByName('ZBRY').AsString;
        DataSetPB.FieldByName('ZBAPB_KSSJ').AsDateTime := f.Date+DateUtils.TimeOf(f.DataSetPBSJJ.FieldByName('KSSJ').AsDateTime);
        DataSetPB.FieldByName('ZBAPB_JSSJ').AsDateTime := f.Date+DateUtils.TimeOf(f.DataSetPBSJJ.FieldByName('JSSJ').AsDateTime);
        DataSetPB.FieldByName('ZBAPB_DBLD').AsString := f.DataSetPBSJJ.FieldByName('DBLD').AsString;
        DataSetPB.FieldByName('ZBAPB_DD').AsString := ComboBox3.text;
        DataSetPB.Post;
        DataSetPB.ApplyUpdates;
         end;
      end;// end if ((s<>nil)and (s<>''))
       f.DataSetPBSJJ.Next;
      end;  //end while
     end; // end if f.ShowModal=Business.Forms.Controls.mrOk
finally
    f.Free;
end;
DataSetPB.Refresh;
FECalendar1.Repaint;
end;

procedure TMainForm.FECalendar1DrawCellProperties(Sender: TObject; ADate: Double; AState: TFECalCellStates; var ALabel: string; CellProperties: TFECellProperties);
begin
if (not (TFECalCellState.csCaption in AState)) and (not (TFECalCellState.csNotInMonth in AState)) then
  begin
    CellProperties.CaptionStyle := TFECapStyle.csNone;
    CellProperties.Color := Graphics.clInfoBk;
    CellProperties.Font.Color := Graphics.clGreen;
    CellProperties.Layout := TTextLayout.tlTop;
     ALabel := GetDateStr(ADate);

  end;

end;

function TMAINFORM.GetDateStr(ADate: TDateTime): String;
begin
  Result := SysUtils.IntToStr(DateUtils.DayOf(ADate))+'日';
  DataSetPB.UserFilter:= 'ZBAPB_ZBRQ=to_date('''+SysUtils.DateToStr(ADate)+''',''yyyy-mm-dd'') and ZBAPB_DD='''+ComboBox3.Text+'''';
  DataSetPB.Open;
    while not DataSetPB.Eof do
  begin
    if ((DataSetPB.FieldByName('ZBAPB_ZBRY').AsString<>nil) and (DataSetPB.FieldByName('ZBAPB_ZBRY').AsString<>'')) then
     Result := Result+ #13#10 +OrgSys.OrgSystem.GetPerson(DataSetPB.FieldByName('ZBAPB_ZBRY').AsString).DisplayName;
   if ((DataSetPB.FieldByName('ZBAPB_ZBRY').AsString=nil) or (DataSetPB.FieldByName('ZBAPB_ZBRY').AsString='')) then
     Result := Result+ #13#10 +DataSetPB.FieldByName('ZBAPB_ZBRY').AsString;
    DataSetPB.Next;
  end;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-8 11:30:36 | 显示全部楼层
如下图所示,
第一副图是更改1日的值班人之后显示的。
第二副图是把功能窗体关了,再打开之后正常的状态。

qq3.png

7.32 KB, 下载次数: 80

回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-8 11:32:20 | 显示全部楼层
这是第二副图

qq4.png

7 KB, 下载次数: 75

回复 支持 反对

使用道具 举报

发表于 2009-7-8 11:33:39 | 显示全部楼层
断点设置到function TMAINFORM.GetDateStr(ADate: TDateTime): String;
这里,看看  while not DataSetPB.Eof do中的代码是不是没有走到?数据集跑到最后面去了?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-8 13:24:30 | 显示全部楼层
while not DataSetPB.Eof do 这句倒是正常执行。
其实我怀疑这个限制条件:if (not (TFECalCellState.csCaption in AState)) and (not (TFECalCellState.csNotInMonth in AState))  then
不明白这个限制条件是什么意思?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-19 07:34 , Processed in 0.041215 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表