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 Listbox Refresh-Problem (https://www.delphipraxis.net/13259-listbox-refresh-problem.html)

andianon 15. Dez 2003 08:50


Listbox Refresh-Problem
 
Ich möchte abhängig von dem Zustand eines Objektes, die Zeilenfarbe der Listbox festlegen. Klappt auch über die OnDrawItem-Methode ganz gut. Wenn jetzt eine Zeile selektiert wird, wird diese mit der Schriftfarbe weiß dargestellt. Wählt man eine andere Zeile, wird die vorher gewählte zwar per Source wieder auf die eigentliche Farbe gesetzt, aber es erfolgt kein Refresh auf dem Screen, d.h., jede gewählte Zeile bleibt solange weiß, bis sie z.B. einmal aus dem sichtbaren Bereich heraus- und wieder hereingescrollt wurde.

Hilfe!!!

Delphi-Quellcode:
procedure TfGrundrisse.clbBehOrteDrawItem(Control: TWinControl;
  Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
  behort : TAdmBehandlungsort;
  gsSet : TGueltigStati;
begin
  // Behandlungsortobjekt in der aktuellen Zeile ermitteln
  try
    behort := TAdmBehandlungsort(clbBehOrte.Items.Objects[Index]);
  except
    behort := nil;
  end;
  if Assigned(behort) then begin
    // Wenn die Zeile disabled ist,...
    if not clbBehOrte.ItemEnabled[Index] then
      clbBehOrte.Canvas.Font.Color := clGrayText
    // Wenn die Zeile enabled ist,...
    else begin
      // GueltigStati für den BehOrt ermitteln
      gsSet := self.sHaus.AdmHausstruktur.GetGueltigStati4BehOrt(behort.ID);
      // Wenn der Behandlungsort abgelaufen ist,...
      if gsSet = [gsAbgelaufen] then
        clbBehOrte.Canvas.Font.Color := clRed
      else begin
        // Wenn die darzustellende Zeile die ausgewählte ist,...
        if clbBehOrte.ItemIndex = Index then
          clbBehOrte.Canvas.Font.Color := clHighlightText
        else
          clbBehOrte.Canvas.Font.Color := clWindowText;
      end;
    end;
    clbBehOrte.Canvas.TextOut(Rect.Left, Rect.Top, behort.ID);
  end;
end;

X-Dragon 15. Dez 2003 09:13

Re: Listbox Refresh-Problem
 
Hab gerade nicht die Möglichkeit das auszuprobieren, aber eigentlich müsste ein einfaches "DeineListbox.Repaint;" doch ausreichen.

andianon 15. Dez 2003 09:17

Re: Listbox Refresh-Problem
 
Das Problem ist, dass durch Repaint usw. auch wieder OnDrawItem aufgerufen wird und da beißt sich der Hund dann in den Schwanz.

X-Dragon 15. Dez 2003 09:36

Re: Listbox Refresh-Problem
 
Zitat:

Zitat von andianon
Das Problem ist, dass durch Repaint usw. auch wieder OnDrawItem aufgerufen wird und da beißt sich der Hund dann in den Schwanz.

Ah stimmt da war der Haken. Wenn ich jetzt in der Firma wäre könnte ich dir da bestimmt weiter helfen (hab gerade Urlaub), denn dort hab ich einem Projekt etwas ähnliches eingebaut.

andianon 15. Dez 2003 09:42

Re: Listbox Refresh-Problem
 
Ich habe mir jetzt erstmal damit beholfen, dass ich in der OnClick-Methode, die ich bisher nicht eh nicht benötige, jetzt ein "ListBox.Invalidate", eingebaut habe, aber schön ist was anderes.

OLLI_T 15. Dez 2003 09:51

Re: Listbox Refresh-Problem
 
HYHO!

Nehmen wir mal an, Du willst einen total mit Graffity besprühten Brückenpfeiler neu bemalen. Was machst Du dann vorher? :mrgreen:

Delphi-Quellcode:
procedure TForm1.LBDrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  if (odFocused in State) Or (odSelected in State) then Begin
    LB.Canvas.Brush.Color := clHighlight;
    LB.Canvas.Font.Color := clHighlightText
  End else Begin
    LB.Canvas.Brush.Color := clWindow;
    LB.Canvas.Font.Color := clWindowText;
  End;
  LB.Canvas.FillRect(Rect);
  LB.Canvas.TextOut(Rect.Left, Rect.Top,LB.Items[Index]);
end;
Viele Grüsse

OLLI

andianon 15. Dez 2003 10:02

Re: Listbox Refresh-Problem
 
Danke, das funzt!


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:50 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