头痛中。。ListView1设置字体颜色后一刷新就变回去了。。。

yych1996 2002-05-10 02:45:57
在做一个项目,用到ListView,从文件中读取记录到ListView中,已把ListView的style设置成 vsReport 了。

要求,每条记录的颜色有该条记录本身的颜色属性决定,完全没有任何预定的格式。
比如,一条记录的颜色属性为 RGB(255,12,96)时,则该条记录的显示颜色就为RGB(255,12,96)。

现在问题来了,现已通过在ListView的OnCustomDrawItem事件中写代码实现了上面所说的功能,可是,当选择这条记录以后,该纪录原来所设定的颜色就消失了,全部恢复成为黑色,或者,将窗口最大化或最小化之后也会发生这种情况,原来每条记录所显示的颜色统统都不见了,,,
头痛阿。。。。。。
请问是不是还有什么属性没有设置清楚?或者不是在OnCustomDrawItem事件中进行处理??各位大哥请帮个忙吧。不胜感激!

ps:
添加记录的代码
TListItem* pItem;
while(i++ < RunPageSize)
{
pItem = ListView1->Items->Add();

pItem->Caption = ADOQuery1->FieldByName("产品")->AsString;
pItem->SubItems->Add(ADOQuery1->FieldByName("版权")->AsString);
pItem->SubItems->Add(ADOQuery1->FieldByName("说明")->AsString);
pItem->SubItems->Add(ADOQuery1->FieldByName("存放")->AsString);
pItem->SubItems->Add(ADOQuery1->FieldByName("时间")->AsString);
ADOQuery1->Next();
}

OnCustomDrawItem事件代码
void __fastcall TForm1::ListView1CustomDrawItem(TCustomListView *Sender,
TListItem *Item, TCustomDrawState State, bool &DefaultDraw)
{
int abc[3];//存放RGB三个值
ConvertRGB(FormatTitle(&(Item->Caption)),abc);//由Caption提取RGB颜色代码存入abc
ListView1->Canvas->Font->Color = (TColor)RGB(abc[0],abc[1],abc[2]);
if(Item->Index%2==0)
{
ListView1->Canvas->Brush->Color = (TColor)RGB(242,242,242);
}
}
...全文
1104 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yych1996 2002-05-10
  • 打赏
  • 举报
回复
成功了,我把一些不可见的属性放在了item->Data里面了。

francohe(小熊)

Item.SubItem[3]中得值为

Item->SubItem->String[2];
francohe 2002-05-10
  • 打赏
  • 举报
回复
plainsong(轻风)
对于你的方法二
请问如何获得Item.SubItems[3]中存放的值?
短歌如风 2002-05-10
  • 打赏
  • 举报
回复
方法一:
将每个Item都不同的私有数据写成一个结构,添加Item时分配一个,设置好值,将指针赋值给Item->Data,在删除Item时释放。这种方法是标准方法,但只能在运行时设置值。
方法二:
把值按一定的格式写到一个字符串中,存放在Item的一个不可见的SubItem中。如我的ListView有四列,会显示Item的Caption和三个SubItem,我就用Item.SubItems[3](第四个)来存放这个数据。用这种方法可以在设计时设置数据。不过要注意,如果后来设计修改了,增加了一列,不要忘了这里也要修改。

____ ____
\ p \ / g /
\ l \_/ n /
\ a o /
\ i s /
\ n /
\_/
yych1996 2002-05-10
  • 打赏
  • 举报
回复
我也是这么想的,我如果用
if(Item->Index%2==0)
ListView1->Canvas->Font->Color = (TColor)RGB(0,0,255);
else
ListView1->Canvas->Font->Color = (TColor)RGB(255,0,255);
就不会发生这种情况了,原因大概是Item->Index是整个ListView里面唯一的,而每次循环都重新分配了int abc[3],我估计是这个问题,

我再想想,解决了马上给分,,

另外,大家是怎么处理这样每个item都有可能是各种不同值得情况?说说思路就可以了?

superaf 2002-05-10
  • 打赏
  • 举报
回复
看看你数组转换后数组是不是被从新赋值了。?
RedProgramer 2002-05-10
  • 打赏
  • 举报
回复
估计是下边语句的问题
ConvertRGB(FormatTitle(&(Item->Caption)),abc);
其取出来的的RGB值有问题;
RedProgramer 2002-05-10
  • 打赏
  • 举报
回复
我试了一下没问题呀,我是这样试的
void __fastcall TForm1::ListView1CustomDrawItem(TCustomListView *Sender,
TListItem *Item, TCustomDrawState State, bool &DefaultDraw)
{
ListView1->Canvas->Font->Color = Item->Caption.ToInt();
ListView1->Canvas->Brush->Color = clGreen;

}
你跟踪一下你的Item->Caption是什么;
yych1996 2002-05-10
  • 打赏
  • 举报
回复
开始就试过了,如果是直接输入数字,比如只有这么一句
ListView1->Canvas->Font->Color = (TColor)RGB(0,0,255);
确实是没有上述的问题,可是我如果换成下面的语句
比如上面程序所述提取出abc[0]的值后写下面的代码
if(abc[0]>100)
ListView1->Canvas->Font->Color = (TColor)RGB(0,0,255);
else
ListView1->Canvas->Font->Color = (TColor)RGB(255,0,255);

当刷新以后所有原来RGB(0,0,255)都被RGB(255,0,255)替代了,为什么??
再问,那么(TColor)RGB(a,b,c)中a,b,c的值应该是什么类型的?int?还是UINT或者其他什么类型?
短歌如风 2002-05-10
  • 打赏
  • 举报
回复

ListView1->Canvas->Font->Color = (TColor)RGB(abc[0],abc[1],abc[2]);
暂时改为
ListView1->Canvas->Font->Color = (TColor)RGB(0,0,255);
然后再试,如果修改以后就正常了,就说明是你的数据的问题;否则,就是你的系统的问题。

____ ____
\ p \ / g /
\ l \_/ n /
\ a o /
\ i s /
\ n /
\_/
短歌如风 2002-05-10
  • 打赏
  • 举报
回复

ListView1->Canvas->Font->Color = (TColor)RGB(abc[0],abc[1],abc[2]);
暂时改为
ListView1->Canvas->Font->Color = (TColor)RGB(0,0,255);
然后再试,如果修改以后就正常了,就说明是你的数据的问题;否则,就是你的系统的问题。


____ ____
\ p \ / g /
\ l \_/ n /
\ a o /
\ i s /
\ n /
\_/
yych1996 2002-05-10
  • 打赏
  • 举报
回复
不会吧,难道没有人遇到这种问题吗???

13,870

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧