AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Listbox Refresh-Problem

Ein Thema von andianon · begonnen am 15. Dez 2003 · letzter Beitrag vom 15. Dez 2003
Antwort Antwort
andianon

Registriert seit: 2. Dez 2003
Ort: Wechselnd
28 Beiträge
 
Delphi 5 Enterprise
 
#1

Listbox Refresh-Problem

  Alt 15. Dez 2003, 09:50
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;
  Mit Zitat antworten Zitat
Benutzerbild von X-Dragon
X-Dragon

Registriert seit: 14. Jan 2003
Ort: Schortens
289 Beiträge
 
Delphi 6 Enterprise
 
#2

Re: Listbox Refresh-Problem

  Alt 15. Dez 2003, 10:13
Hab gerade nicht die Möglichkeit das auszuprobieren, aber eigentlich müsste ein einfaches "DeineListbox.Repaint;" doch ausreichen.
  Mit Zitat antworten Zitat
andianon

Registriert seit: 2. Dez 2003
Ort: Wechselnd
28 Beiträge
 
Delphi 5 Enterprise
 
#3

Re: Listbox Refresh-Problem

  Alt 15. Dez 2003, 10:17
Das Problem ist, dass durch Repaint usw. auch wieder OnDrawItem aufgerufen wird und da beißt sich der Hund dann in den Schwanz.
  Mit Zitat antworten Zitat
Benutzerbild von X-Dragon
X-Dragon

Registriert seit: 14. Jan 2003
Ort: Schortens
289 Beiträge
 
Delphi 6 Enterprise
 
#4

Re: Listbox Refresh-Problem

  Alt 15. Dez 2003, 10:36
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.
  Mit Zitat antworten Zitat
andianon

Registriert seit: 2. Dez 2003
Ort: Wechselnd
28 Beiträge
 
Delphi 5 Enterprise
 
#5

Re: Listbox Refresh-Problem

  Alt 15. Dez 2003, 10:42
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.
  Mit Zitat antworten Zitat
OLLI_T

Registriert seit: 13. Okt 2003
Ort: Nähe Wetzlar / Hessen
143 Beiträge
 
Delphi 5 Enterprise
 
#6

Re: Listbox Refresh-Problem

  Alt 15. Dez 2003, 10:51
HYHO!

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

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
No Pain No Gain!
  Mit Zitat antworten Zitat
andianon

Registriert seit: 2. Dez 2003
Ort: Wechselnd
28 Beiträge
 
Delphi 5 Enterprise
 
#7

Re: Listbox Refresh-Problem

  Alt 15. Dez 2003, 11:02
Danke, das funzt!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:18 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