不容易,终于将在ListBox中改变行的颜色搞清楚。附源代码!

hammer_shi 2002-04-27 04:29:18
由于业务需要,一个界面上需要摆放三个ListBox显示不同状态的号码
,由于界面上还需要摆放一些label和Combobox,因此界面很是难看,
出于下策,我想到在同一个ListBox中将不同号码分成不同的颜色,这样
就只需要一个Listbox了,这样界面就要整齐些。
呵呵,或许人笨,这个程序搞好花了一个上午。好了,把源代码贴上吧,哦,
特别申明贴源代码是为了高手帮我优化一下,新手吗就参考了。

首先在ListBox的OnDrawItem事件内写如下代码:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
//本过程可能执行的次数是你ListBox1行数。
begin
ListBox1.Canvas.FillRect(RECT); //清空一行
IF INDEX<MEMO1.LINES.COUNT-1 THEN
/*根据不同的条件将不同行显示为不同颜色,在我的代码上在界面上加了一个Memo调试,
其中 INDEX=STRTOINT(MEMO1.Lines[INDEX])可以根据意愿改变,系统默认行字体
为黑色,当然你最好是用到index参数,否则不好控制。*/
BEGIN
if INDEX=STRTOINT(MEMO1.Lines[INDEX]) THEN
ListBox1.Canvas.Font.Color:=ClRed;
if INDEX>STRTOINT(MEMO1.Lines[INDEX]) THEN
ListBox1.Canvas.Font.Color:=ClBLUE;
if INDEX<STRTOINT(MEMO1.Lines[INDEX]) THEN
ListBox1.Canvas.Font.Color:=ClGREEN;
END;
LISTBOX1.Canvas.textOut(Rect.Left, Rect.Top, LISTBOX1.Items[Index]);
//显示每行的字体
end;

/*当然要是你的ListBox中开始不存在的数据而需要实时改变怎么办?其实大家可以看到我
每行的颜色也是根据Memo中的参数控制,现在只要改变Memo中的数字就可以改变ListBox中的
颜色,在这里再加了一个Button调试按钮*/

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
ListBox1.Canvas.Refresh;//ListBox画布重画。
//不知道是怎么搞的,虽然我达到结果,但是我却想不出下面代码的缘由
//只是不用下面的代码时ListBox需要手工点击改变颜色的行才能改变颜色,
//呵呵,或许时刷新不及时吧,需要催化.
for i:=0 to Listbox1.Items.Count-1 do
begin
ListBox1.ItemIndex:=i;
end;
end;

哦,忘了,你的ListBox还需要改变Stylew为lbOwnerDrawVariable。

...全文
330 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hammer_shi 2002-04-28
  • 打赏
  • 举报
回复
change?那个的change?
为什么在程序中使用了Refresh却需要手工点击改变颜色的行或者使用
for i:=0 to Listbox1.Items.Count-1 do
begin
ListBox1.ItemIndex:=i;
end;

王集鹄 2002-04-28
  • 打赏
  • 举报
回复
to hammer_shi(凤舞九天):如果你的颜色配置是动态的,就在Change中刷新一次就可以了
Bellamy 2002-04-27
  • 打赏
  • 举报
回复
呵呵,受教!
hammer_shi 2002-04-27
  • 打赏
  • 举报
回复
To: zswang(伴水)(* pascal→c *)
2颗红星的确不同呀,哦,你说要是我实时刷新是不是就是采用我那样的程序呢?
王集鹄 2002-04-27
  • 打赏
  • 举报
回复
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin
with TListBox(Control), TListBox(Control).Canvas do begin
FillRect(Rect);
Font.Color := StringToColor(Items[Index]);
Canvas.TextOut(Rect.Left, Rect.Top, Items[Index]);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ListBox1.Style := lbOwnerDrawVariable;
ListBox1.Clear;
ListBox1.Items.Text :=
'clBlack'#13#10 +
'clMaroon'#13#10 +
'clGreen'#13#10 +
'clOlive'#13#10 +
'clNavy'#13#10 +
'clPurple'#13#10 +
'clTeal'#13#10 +
'clGray'#13#10 +
'clSilver'#13#10 +
'clRed'#13#10 +
'clLime'#13#10 +
'clYellow'#13#10 +
'clBlue'#13#10 +
'clFuchsia'#13#10 +
'clAqua'#13#10 +
'clWhite'#13#10;
end;
王集鹄 2002-04-27
  • 打赏
  • 举报
回复
+1

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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