Einzelnen Beitrag anzeigen

Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#1

Selektion hervorheben in Listview ohne Fokus

  Alt 31. Dez 2008, 09:55
sharky stellt hier vor, wie man Einträge in einer Listview selektieren kann, auch wenn diese nicht den Fokus hat.

Eine Einsatzmöglichkeit wäre beispielsweise die "Live-Suche" in einer Listview.


Delphi-Quellcode:
uses
  ..., CommCtrl;
Delphi-Quellcode:
const
  LVHighliterColor: TColor = clAqua;
  LVHighliterColorOnFocused: TColor = clBlue;
Delphi-Quellcode:
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
var
  ColumnRect: TRect;
  TextRect: TRect;
  Drawstate: Cardinal;
  SubitemIndex: Integer;
begin
  Drawstate := 0;
  DefaultDraw := False;
  if TListView(Sender).ViewStyle = vsReport then
  begin
    with (sender as TListView) do
    begin
      if (Item.Selected) then
      begin
        if (Sender.Focused) then
        begin
          Canvas.Pen.Color := LVHighliterColorOnFocused;
          Canvas.Brush.Color := LVHighliterColorOnFocused;
        end
        else
        begin
          Canvas.Pen.Color := LVHighliterColor;
          Canvas.Brush.Color := LVHighliterColor;
        end;
      end
      else
      begin
        Canvas.Pen.Color := clWhite;
        Canvas.Brush.Color := clWhite;
      end;
      ListView_GetItemRect(Handle, Item.Index, ColumnRect, LVIR_BOUNDS);
      Canvas.Rectangle(ColumnRect);
      ListView_GetItemRect(Handle, Item.Index, TextRect, LVIR_LABEL);
      DrawText(Canvas.Handle, Pchar(Item.Caption), Length(Item.Caption),
        TextRect, Drawstate);
      for SubitemIndex := 1 to Columns.Count - 1 do
      begin
        ListView_GetSubItemRect(Handle, Item.Index, SubitemIndex, LVir_Label, @textrect);
        DrawText(Canvas.Handle, Pchar(Item.SubItems[SubitemIndex - 1]),
          Length(Item.SubItems[SubitemIndex - 1]),
          TextRect, Drawstate);
      end;
    end;
  end;
end;
Ein Aufruf könnte z.B. im OnChange eines Edits so aussehen:
Delphi-Quellcode:
procedure TForm1.Edit1Change(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to ListView1.Items.Count - 1 do
  begin
    if Pos(Edit1.Text, ListView1.Items[i].SubItems[0]) = 1 then
    begin
      ListView1.ItemIndex := i;
      break;
    end;
  end;
end;

Anmerkungen:
  • viewStyle muss vsReport sein
  • Es muss jeweils min. 1 SubItem geben (nach dem wird im Bsp.-Code gesucht)
Frederic Kerber
  Mit Zitat antworten Zitat