不容易,终于将在ListBox中改变行的颜色搞清楚。附源代码!
由于业务需要,一个界面上需要摆放三个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。