Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi einzelne Items in ListBox färben (https://www.delphipraxis.net/33137-einzelne-items-listbox-faerben.html)

Flinto 2. Nov 2004 09:49


einzelne Items in ListBox färben
 
Liste der Anhänge anzeigen (Anzahl: 1)
hallo,
Ich habe in meinem Programm ein Suchfeld, in dem ich ein Wort eingeben kann wonach es dann in der ListBox sucht. Nun würde ich gerne den Linien, in denen das Wort vorhanden ist, einen anderen Hintergrund geben.
Mit dem Canvas habe ich es bis jezt nur geschafft, alle Items zu färben. Ich habe bis jezt schon viele Threads gelesen, bin aber immer noch nicht darauf gekommen.

Hier die zwei Ausschnitte meines Programmes mit der Such Funktion und der OnDraw Item Procedure:


Delphi-Quellcode:
// Mark Items within KeyWord
procedure TFmLog.KeyWordSearchM;
var
  nPos : integer;
  stKey : string;
  nIdx : integer;
begin
  try
    // Disable Update
    SendMessage(FlbOutput.Handle, WM_SETREDRAW, 0, 0);
    // Get Search Text
    stKey := FedSearch.Text;
    // Process all ListBox Items
    for nIdx := (FlbOutput.Items.Count - 1) downto 0 do begin
      // Check Item for Search String
      nPos := Pos(stKey, FlbOutput.Items[nIdx]);
      // Delete Lines without Search Text
      if (nPos <> 0) then
        FlbOutput.Selected[nIdx] := True;
    end;
  finally
    // ReEnable Update & Repaint List
    SendMessage(FlbOutput.Handle, WM_SETREDRAW, 1, 0);
    FlbOutput.Repaint;
  end;
end;

{ *********************************************
  ********************************************* }
procedure TFmLog.OnDrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
  TopDif: Integer; // Gleicht die Höhendifferenz aus
begin
  with (Control as TListbox) do begin
    Canvas.Brush.Color := $00FF7777; //Hintergrundfarbe
    Canvas.Font.Color := clBlack; //Schriftfarbe

    TopDif := (ItemHeight div 2) - (Canvas.TextHeight(#32) div 2);
    Canvas.TextRect(Rect, Rect.Left, Rect.Top + TopDif, Items[Index]);
  end;
end;
[edit=sakura] [delphi]Tags Mfg, sakura[/edit]

shmia 2. Nov 2004 10:27

Re: einzelne Items in ListBox färben
 
Du hast keine Kontrolle darüber, für welchen Item-Index das Event OnDrawItem gefeuert wird.
Du musst die Hintergrundfarbe innerhalb von OnDrawItem abfragen und zur Anwendung bringen.

Delphi-Quellcode:
procedure TFmLog.OnDrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
  TopDif: Integer; // Gleicht die Höhendifferenz aus
begin
  with (Control as TListbox) do begin
    Canvas.Brush.Color := GetBackColor(Items[Index]); // <===
    Canvas.Font.Color := clBlack; //Schriftfarbe

    TopDif := (ItemHeight div 2) - (Canvas.TextHeight(#32) div 2);
    Canvas.TextRect(Rect, Rect.Left, Rect.Top + TopDif, Items[Index]);
  end;
end;

function TFmLog.GetBackColor(const value:string):Tcolor;
begin
   result := clWhite;
   if Pos(FedSearch.Text, value) >= 0 then
      Result := $00FF7777;
end;
Nachdem du das Suchwort geändert hast, musst du die Liste neu zeichen:
Delphi-Quellcode:
FlbOutput.RePaint;


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:49 Uhr.

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