2014-10-14 3 views
0

ListView에 표시 할 데이터가없는 경우 TLabel에 그려야하는 "지금 데이터가 변경되지 않았습니다"메시지를 표시하는 것이 좋습니다. ListView 클라이언트 영역에 TLabel을 그리는 방법은 무엇입니까?ListView 클라이언트 영역에 레이블을 그리는 방법

+1

. 제발 그렇게 할 수 있어요. –

답변

3

TLabel은 필요하지 않습니다.

Vista 이상에서는 ListView를 서브 클래스 화하여 LVN_GETEMPTYMARKUP 알림을 처리 할 수 ​​있습니다.

uses 
    ..., CommCtrl; 

private 
    PrevWndProc: TWndMethod; 

procedure TMyForm.FormCreate(Sender: TObject); 
begin 
    PrevWndProc := ListView.WndProc; 
    ListView.WndProc := ListViewWndProc; 
end; 

procedure TMyForm.ListViewWndProc(var Message: TMessage); 
begin 
    if Message.Msg = CN_NOTIFY then 
    begin 
    if TWMNotifyLV(Message).NMHdr.code = LVN_GETEMPTYMARKUP then 
    begin 
     with PNMLVEmptyMarkup(TWMNotifyLV(Message).NMHdr)^ do 
     begin 
     dwFlags := EMF_CENTERED; 
     StrLCopy(szMarkup, 'My message here', L_MAX_URL_LENGTH); 
     end; 
     Message.Result := 1; 
     Exit; 
    end; 
    end; 
    PrevWndProc(Message); 
end; 

단점은 (당신이에 추가해야합니다 당신은 텍스트가 나타납니다 (이 정당화 왼쪽 또는 중앙 여부 만) 또는 어떻게 포맷 및 동적 텍스트를 변경할 수있는 동안 작은 제어 할 수있다 적어도 하나의 항목을 제거한 다음 제거하여 새 알림을 트리거하십시오).

이전 버전이나 텍스트 위치/형식/동작에 대한 추가 제어가 필요한 경우 대신 ListView의 OnCustomDraw 이벤트를 사용할 수 있습니다. ListView의 Canvas에 이벤트가 제공 한 TRect으로 지정된 영역 내에서 원하는 것을 그릴 수 있습니다. 필요한 경우 ListView_GetHeader()을 사용하여 ListView의 열 머리글이 표시되는지 확인한 다음 GetWindowRect()을 사용하여 머리글의 높이를 가져와 그리기 전에 TRect 위쪽에서 빼낼 수 있습니다. 예를 들어

: 레미는 당신에게 받아 들여질만한 훌륭한 답을 주신

procedure TMyForm.ListViewCustomDraw(Sender: TCustomListView; const ARect: TRect; var DefaultDraw: Boolean); 
var 
    R, Temp: TRect; 
    Wnd: HWND; 
begin 
    if Sender.Items.Count <= 0 then 
    begin 
    R := ARect; 
    Wnd := ListView_GetHeader(Sender.Handle); 
    if Wnd <> 0 then 
    begin 
     GetWindowRect(Wnd, @Temp); 
     R.Top := R.Top + (Temp.Bottom-Temp.Top); 
    end; 
    R.Top := R.Top + 10; 
    DrawText(Sender.Canvas.Handle, 'My message here', -1, @R, DT_CENTER or DT_SINGLELINE); 
    end; 
end; 
+0

감사합니다. 나는 두 번째 방법을 시도했다, 그것은 좋다! GetWindowRect (Wnd, @Temp); GetWindowRect (Wnd, Temp);로 변경해야 DrawText의 매개 변수로. – dltigles

+0

다른 문제가 있습니다. OnCustomDraw 이벤트를 사용하여 "이것은 빈 목록"이라는 텍스트를 그립니다. 나는 listView를 지우는 단추를 만든다. 모든 항목이 지워지면 "This is .."텍스트가 표시됩니다. 그런 다음 새 항목 행을 immedially 추가했지만 텍스트가 정리되지 않았습니다. 따라서 짧은 행과 "이것은 빈 목록입니다"라는 메시지가 동시에 표시됩니다. – dltigles

+0

listview.Repaint를 호출하면 "This is empty list"텍스트가 제거됩니다. – dltigles