起步软件技术论坛-X3

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

【结】[请求] 如何实现类似web邮箱的邮件多选功能?

[复制链接]
 楼主| 发表于 2008-12-31 10:20:41 | 显示全部楼层
邮件库中代码见9楼图片,因为勾选放在第一项,所以代码中是glMail.SelectedNodes[0].Values[0]。

有两个问题:

1. 代码都一样,为何会有9楼的报错呢?

2. 将楼上资源包修改,将勾选列放到第一列上,则操作不正常,勾选第二项时,从最后一项开始,逐个选上后才能选择第二项。

PS: 示例代码和邮件库还有点差别,示例是自己添加的,而邮件库是动态加载的,勾选值有可能是空值。

多选问题.jpg

18.63 KB, 下载次数: 71

回复 支持 反对

使用道具 举报

发表于 2008-12-31 10:57:06 | 显示全部楼层
1、不知道、
2、。勾选是空值,可以自己判断这种状况。我只是做了一个例子,做一个抛砖引玉的功能。
您对我的例子还有什么问题?
回复 支持 反对

使用道具 举报

发表于 2008-12-31 11:08:22 | 显示全部楼层
我改成在第一列了。

temp.rar

7.21 KB, 下载次数: 21

回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-12-31 13:51:56 | 显示全部楼层
对您提供的例子没问题,但在3012版本下的邮件库代码按照下面方法增加Checkbox列、修改代码后还是有9楼的报错。
修改地方如下:

1. 在第一列增加TTreeListCheckColumn 类型的 checkbox 列,新增的Tag 设置为0 ,原有的12个依次增加一个;
2. 修改 GetDefaultWidthByTag 增加一个 0: Result := 50;  原有的依次往下递增一个;
3. 修改 GetDefaultVisibleByTag 增加一个 0: Result := True;  原有的依次往下递增一个;
4. 修改 TMailCenterForm.InitMailIndexItem 代码如下:

  for I := 0 to glMail.ColumnCount - 1 do
    case glMail.Columns[I].Tag of   //这里用Tag来控制说明排序比较好
    { 0: AItem.Strings[I] := lAtta;  //原3012 版本邮件库代码
      1: AItem.Strings[I] := lPriority;
... ...
      //SMP Modify 20060817下面这个是新加上去的 便于处理同庆问题他们要用已读未读排序
      11: if Assigned(lFolderObject) and (lFolderObject.Kind = mtSent) then
      }
      1: AItem.Strings[I] := lAtta;   // 增加checkbox  后修改的代码
      2: AItem.Strings[I] := lPriority;
      3: AItem.Strings[I] := lMailRef.MailInfo.From;
      4: AItem.Strings[I] := lMailRef.MailInfo.Tos;
      5: AItem.Strings[I] := lMailRef.MailInfo.Subject;
      6: AItem.Strings[I] := FormatDateTime('yyyy-mm-dd hh:mm:ss', lMailRef.Time); //lMailRef.MailInfo.Date);
      7: AItem.Strings[I] := FormatDateTime('yyyy-mm-dd hh:mm:ss', lMailRef.Time);
      8: AItem.Strings[I] := intToStr(lMailRef.Size);
      9: AItem.Strings[I] := lAccountID;
      10: AItem.Strings[I] := lMailRef.MailInfo.Cc;
      11: AItem.Strings[I] := lMailRef.MailInfo.HeaderText; //读未读排序

      12: if Assigned(lFolderObject) and (lFolderObject.Kind = mtSent) then
          begin
            with TSendedMailState.Create(lMailRef.MailGUID) do
              if State <> '' then
                AItem.Strings[I] := State
              else
                AItem.Strings[I] := StrUtils.IfThen(((lMailRef.State and msReaded) <> msReaded), '未读', '已读');
          end
          else
            AItem.Strings[I] := StrUtils.IfThen(((lMailRef.State and msReaded) <> msReaded), '未读', '已读');
   end;

5. 增加6楼代码。

邮件库代码.rar

266.23 KB, 下载次数: 21

回复 支持 反对

使用道具 举报

发表于 2008-12-31 14:12:06 | 显示全部楼层
检查9楼哪个对象为空了,调试看看每一变量的情况。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-12-31 14:52:07 | 显示全部楼层
Sender 为空

已经对比两个控件的属性,设置为完全一样还是有报错。

是不是因为您提供的控件的Items Editor 有设置值,而邮件库的是动态生成原因引起的?

多选问题-2.jpg

76.6 KB, 下载次数: 59

回复 支持 反对

使用道具 举报

发表于 2008-12-31 14:57:24 | 显示全部楼层
sender只是发送者,经常是为空的。
我再做一个动态填值的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-12-31 15:06:52 | 显示全部楼层
您能否直接在3012 的邮件库上加一个选择列看看效果,或者看看14楼的邮件包。
回复 支持 反对

使用道具 举报

发表于 2008-12-31 15:09:23 | 显示全部楼层
procedure TMainForm.Button1Click(Sender: TObject);
var
   tmp:TTreelistnode;
   i:integer;
begin
  for i:=0 to 20 do
  begin
      tmp:=glMail.Add;
      tmp.Strings[0]:='false';
      tmp.Strings[1]:=sysutils.IntToStr(i);
  end;
end;

procedure TMainForm.glMailColumn15Change(Sender: TObject);
begin
if  sysutils.SameText(objecthelper.ToString( glMail.SelectedNodes[0].Values[0]),'true' )then
     glMail.SelectedNodes[0].Values[0]:='false'
else
     glMail.SelectedNodes[0].Values[0]:='true';
end;
回复 支持 反对

使用道具 举报

发表于 2008-12-31 15:58:43 | 显示全部楼层
这个是我在3012版本上改的邮件选择。

yj.rar

1.3 MB, 下载次数: 21

回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-29 02:54 , Processed in 0.041090 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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