同标题!

解决方案 »

  1.   

    放一个ImageList,把位图或图标添加进去,然后在StringGrid的OnDrawCell事件中:
    procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    var
      bm: TBitmap;
    begin
      with StringGrid1.Canvas do
      if (ACol = 1) and (ARow = 1) then begin
        bm := TBitmap.Create;
        ImageList1.GetBitmap(0, bm);
        StringGrid1.Canvas.Draw(Rect.Left, Rect.Top, bm);
        bm.Free;
      end;
    end;
      

  2.   

    来自沪上傅远山的致意([email protected]):
       upstairs,I can't agree with you more!
      

  3.   

    我建议你使用第三方控件,ADV系列的不错。
      

  4.   

    你的意思是不是在需要的时候调用drawcell过程,可是能画上去,但是最小化窗口后画上去的位图就不见了!!
      

  5.   

    wyj1974(迷茫的帅哥) :
    那里有下载呀,我手里没有!
      

  6.   

    我试过了不会有问题呀,最小化后再恢复图还在啊。
    DrawCell不用你去调用的,StringGrid收到要重画的消息自己会调用DrawCell的,你只要在里面判断当前这个cell是不是你要添加图标上去的,是的话就用上面那段代码把图标添加上去。
      

  7.   

    对不齐,我很苯的!能不能把代码贴上来!!麻烦了!!
    比如我想根据不同的文件类型在STRINGGRID每一行的末尾画上一个表示该文件类型的图标,当我切换到另外一个文件夹时,画上去的图标就随着新文件夹中的文件类型而改变!!!
    谢谢!!!!!!!!
      

  8.   

    这个你是不是已经把文件夹里的文件名填到STRINGGRID里面了?
      

  9.   

    你是什么意思??我已经把图标放在IMAGELIST里了,问题是怎么分别对应把它们画上去
      

  10.   

    你已经放到IMAGELIST里了啊,那你往STRINGGRID里填入文件名的顺序要与IMAGELIST里图标的顺序相同,这样上面的代码可以改成这样:
    procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    var
      bm: TBitmap;
    begin
      with StringGrid1.Canvas do
      if ACol = StringGrid1.ColCount-1 then begin  // 在最后一列画图标
        bm := TBitmap.Create;
        ImageList1.GetBitmap(ARow, bm);  // ARow是当前行,也是图标在IMAGELIST里的位置
        StringGrid1.Canvas.Draw(Rect.Left, Rect.Top, bm);
        bm.Free;
      end;
    end;
      

  11.   

    可是文件类型的排列是无序的(和IMAGELIST里的图标顺序不一样),看上面的代码是不是把IMAGELIST里的图标顺序的画下来!
    只有在DRAWCELL中才能画吗??能不能写一个过程来画图标??
      

  12.   

    记住 只有在DrawCell中绘制才是有效的。
      

  13.   

    如果你在运行中需要改变图形或文字内容,可以调用 Invalidate,它会引发DrawCell, 然后在DrawCell中重新绘制。