Q&A

  • TListview -> SubItem의 글자를 깜박이게 하고 싶습니다.
TListView를 사용하고 있습니다.  (ViewStyle 는 vsReport 입니다.)

여러 업체에서 DB로 데이터를 업데이트 하는데요.

그걸 본사에서 확인할 때 그 값을 리스트뷰로 뿌려줍니다.

그런데 특정 업체에서 특정 컬럼의 값을 아직 업데이트를 하지 않았다면 입력대기 라는 글자가 나타나도록 했습니다.

TListView에 특정 컬럼의 값이 입력대기 라면 깜박이게 하고 싶습니다. 가능하다면 폰트색깔도 번갈아가면서 말이죠.

이에 대한 자료를 조회해보니 없더라구요 ㅠ.ㅠ

가르침을 주십시오.

델마당에 글을 올렸더니 답변이 없으시더라구요 ㅠ.ㅠ

이곳 저곳에다가 질문만 늘어놓는거 같아서 될수있으면 한델 / 델마당 한군데만 올릴려고 노력은 하는데
답변이 없다보니 답답해서 여기도 올립니다.

죄송합니다
4  COMMENTS
  • Profile
    최용일 2009.01.14 23:54
    타이머를 이용해서 리스트뷰의 아이템을 다시 그리도록 해주세요.
    물론 OwnerDraw로 깜박일 아이템에 대해서도 직접 그려주셔야 하구요...
  • Profile
    장성호 2009.01.15 00:16
    Timer를 이용해서 리스트뷰 아이템을 repaint하면 전체를 다시 그려줘야하니까 비효율적일것 같습니다.


    timer를 이용하데 그냥 timer이벤트 핸들러에서 해당 아이템만 그렸다 / 지웠다 반복하면 될것같습니다.

    OwnerDraw를 이용하지 않구요..


    단 OwnerDraw 를 이용하지 않고 다시 그리려는 아이템의 정확한 영역을 알아오는것이 관건인것 같습니다.

    하지만 너무 간단합니다.

    이미 TListItem의 DisplayRect 이라는 함수가 제공되고 있으니까요

    다음과 같이 간단히 listview의 첫번째 아이템 caption을 그렸다 지웠다를 해보았습니다.

    <!--CodeS-->

    procedure TForm1.Timer1Timer(Sender: TObject);
    var
    item: TListItem;
    rc: TRect;
    begin
    //
    item:=ListView1.Items.Item[0];
    rc:=item.DisplayRect(drBounds);
    rc.Right:=rc.Left+ListView1.Columns.Items[0].Width;
    if ListView1.Tag>0 then
    begin
    ListView1.Canvas.TextRect(rc,rc.Left+4,rc.Top,'아이템1');
    ListView1.Tag:=0;
    end
    else begin

    ListView1.Tag:=1;
    ListView1.Canvas.Pen.Style:=psClear;
    ListView1.Canvas.Rectangle(rc.Left,rc.Top,rc.Right,rc.Bottom);
    ListView1.Canvas.Pen.Style:=psSolid;
    end;
    end;

    <!--CodeE-->

    그럼..
  • Profile
    최용일 2009.01.15 00:32
    좋은 방법이네요...

    한가지 추가...

    CommCtrl에 있는 ListView_Update함수나 LVM_UPDATE메세지를 날리면 전체가 아니라 원하는 아이템만 업데이트하는것도 가능합니다.
  • Profile
    아르스 2009.01.15 22:29
    으...

    용일님이나 성호님의 답변을 보면서 늘 느끼는거지만

    밥벌어 먹기도 살기 힘든판에 라는 허울좋은 핑계로 좀더 깊게 좀더 포괄적으로 공부하고 연구하지 않은 채
    보낸 세월이 한심하네요 ㅠㅠ

    답변 및 참고글... 늘 감사하게 생각하고 있습니다.