Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ListView-Eintrag selektieren ohne ListView-Fokus (https://www.delphipraxis.net/75402-listview-eintrag-selektieren-ohne-listview-fokus.html)

Matze 18. Aug 2006 22:55


ListView-Eintrag selektieren ohne ListView-Fokus
 
Hi,

bisschen seltsamer Titel, nur konnte ich das so kurz nicht beschreiben. :stupid:

Die hier relevanten Komponenten sind ein TEdit und eine TListView. Das Edit soll eine Schnellsuche ermöglichen. Ich tippe also etwas in das Edit ein und "live" wird in der ListView in einer bestimmten Spalte nach diesem Suchwort gesucht.
Ich möchte die erste Zeile, die in der Spalte mit dem Suchwort beginnt, während ich ins Edit schreibe, hervorheben.

Ich habe es so versucht, doch sehe ich den selektierten Eintrag nicht, wenn die ListView keinen Fokus besitzt:

Delphi-Quellcode:
procedure TForm1.EditSearchChange(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to ListView1.Items.Count - 1 do
  begin
    if Pos(AnsiUpperCase(EditSearch.Text), ListView1.Items[i].SubItems[0]) = 1 then
    begin
      ListView1.ItemIndex := i;
      ListView1.Items[i].Selected := true;
      break;
    end;
  end;
end;
Und keine Angst, mehr als 200 Einträge werden nicht in der ListView vorkommen, also von der Performance her ist das in Ordnung.

Geht mein Vorhaben irgendwie oder ist das so nicht möglich? Denn beispielsweise im Windows MediaPlayer 10 gibt es ja auch diese Schnellsuche und da geht das irgendwie.

[edit=Sharky] Mfg, Sharky[/edit]

_frank_ 18. Aug 2006 23:02

Re: ListView-Eintrag selektieren ohne ListView-Fokus
 
suchst du TListview.HideSelection:=false;?

Gruß Frank

Matze 18. Aug 2006 23:23

Re: ListView-Eintrag selektieren ohne ListView-Fokus
 
Hallo Frank

Zitat:

Zitat von _frank_
suchst du TListview.HideSelection:=false;?

Ja das ist doch schonmal was, danke.
Wieso stell ich immer nur so primitive Fragen ... :lol:

Der Eintrag ist nun jedoch Grau und nicht Dunkelblau. geht das auch irgendwie, oder muss ich mich mit dem Grau zufrieden geben? Grau ginge auch, nur Blau fände ich schöner.

_frank_ 18. Aug 2006 23:29

Re: ListView-Eintrag selektieren ohne ListView-Fokus
 
also mit dem blau ist das net so einfach... (es sei denn, du gibst dem listview den focus ;) )
du müsstest den eintrag dann selber malen, wenn es überhaupt möglich ist bei deiner delphi-version.
Stichwort OwnerDraw
Gruß Frank

Matze 18. Aug 2006 23:34

Re: ListView-Eintrag selektieren ohne ListView-Fokus
 
Zitat:

Zitat von _frank_
Stichwort OwnerDraw

Ach damit geht das. Da habe ich auch herumgespielt, nur wurde der Inhalt dann nicht mehr korrekt angezeigt. *g* Aber grau ist das auch ok. Ich danke dir. :)

Sharky 20. Aug 2006 08:21

Re: ListView-Eintrag selektieren ohne ListView-Fokus
 
Hai Matze,

ich hatte eben etwas Zeit ;-)

Knalle doch mal aus Spass diesen Code in das OnOwnerDrawItem deines ListViews:
Delphi-Quellcode:
uses
  CommCtrl;

const
  LVHighliterColor: TColor = clAqua;
  LVHighliterColorOnFocused: TColor = clBlue;

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;

Matze 20. Aug 2006 09:06

Re: ListView-Eintrag selektieren ohne ListView-Fokus
 
Hallo Stephan,

herzlichen Dank! Nun weiß ich, wie man so etwas angehen kann. Das funktioniert, wie es sollte. Mein Problem war, dass ich die Schriftfarbe nicht gesetzt habe, denke ich. Ich hatte alles übermalt. :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz