ListBox的DrawItem事件中能不能用Rect函数呀?(50分)

  • 主题发起人 主题发起人 SanDao
  • 开始时间 开始时间
S

SanDao

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟在ListBox1在其DrawItem事件中用Rect函数时(事件原型如下)
procedure TForm6.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
//注意参数中有Rect: TRect
Begin
Rect(0,0,100,100);//出错语句
end;
////////////////////////////////////////////////////
编译器告知:Missing Operator or Semicolon!(函数名和变量名它难道不分吗?)
诸位不妨试试!为什么呀!(我用的是Delphi6+pack2)
 
设置ListBox的Style为 lbOwnerDrawFixed,然后写如下代码
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin
ListBox1.Canvas.Font.Color := clRed;
ListBox1.Canvas.TextOut(Rect.Left, Rect.Top, ListBox1.Items[Index]);
end;
 
>>yzhshi
很抱歉这两天没来!
我做东东的意图是当我点击LISTBOX框中的ITEM时:
1.我所选的ITEM以上的(包括当前选中的)的颜色被反选(蓝条白字)!
2.所选的ITEM以下的保持原来的白底黑字!

于是我在LISTBOX中的DrawItem事件中写入:
procedure TForm6.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
Current_Index: Integer;
Itemrect: TRect;
begin
Current_Index := Index;
ListBox1.Font.Color := clWhite;
if Current_Index <> -1 then
begin
with ListBox1.Canvas do
begin
ListBox1.Canvas.Refresh;
ListBox1.Canvas.brush.Color := clActiveCaption;
ItemRect := Rect;
TextRect(ItemRect, 0, Current_Index * ListBox1.ItemHeight, ListBox1.items[Current_Index]);
end;
end;
end;
但是当我选中的ITEM以下的ITEM上次曾被选中过的话,我就重新把它画成白底黑字。
这就要我重新选择ITEMRECT的范围!但是在这个事件中只要用RECT函数,就编译出错
(出错信息见上贴,好像和此事件中的RECT参数冲突;在别的事件中正常)
如果实在不行的话,能否用其它变通的方法!(还是想用LISTBOX)

麻烦诸位再帮我看看啊!
 
看这个如何?
//设置 ListBox1.MultiSelect :=True;
procedure TForm1.ListBox1Click(Sender: TObject);
var
i: Integer;
begin
for i := 0 to ListBox1.ItemIndex do
ListBox1.Selected := True;
for i := ListBox1.ItemIndex +1 to ListBox1.Items.Count - 1 do
ListBox1.Selected := False;
end;
 
改成:
begin
Classes.Rect(0,0,100,100);
end;
 
把 procedure TForm6.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);的rect参数名改为arect就可以用rect函数啦
 
没有问题,用RECT()不过这个RECT的大小不能修改的,是CONST类的
 
用w12345678老兄的方法搞定!:》 谢了!给15分
>>yzhshi
这个变通的方法我一开始就试过了,但是我的ListBox还可以把Item进行拖动来改变ListBox
之间Item的顺序。如果把ListBox1.MultiSelect :=True;那么别人在拖动一个Item到另一个
Item上的时候就一下子选了好几项了(只要经过的Item都会被反选,如果把这个解决了
,这也不失为一种好办法)!谢谢!20分
>>kkyy
kkyy的方法也可以!不过不太明白,能否解释一下!为什么呀?编译器怎会这样!
(我是菜...) 谢了!分不够了,给10分不要生气!
>>无忌兄
我用w12345678的方法修改参数名就行了!
看来Rect函数还是好用的啊!(好像确实是和Rect参数名冲突了)
谢谢关注!(下次有问题还要请教啊!)

麻烦大家了! :》(有时忙,没有马上回复,还请见谅!)
 
>>别人在拖动一个Item到另一个Item上的时候就一下子选了好几项了(只要经过的Item都会被反选。
我上面写的代码好像已经解决这个问题了。
你实验一下。
 
后退
顶部