AGB  ·  Datenschutz  ·  Impressum  







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

ListBox

Ein Thema von value is NULL · begonnen am 6. Jun 2014 · letzter Beitrag vom 8. Jun 2014
Antwort Antwort
value is NULL

Registriert seit: 10. Sep 2010
249 Beiträge
 
#1

AW: ListBox

  Alt 6. Jun 2014, 10:14
@baumina

Sorry ich verstehs echt nicht... Aber wenn ich mir deinen Code ansehe:

Delphi-Quellcode:
procedure TForm1.ListBox1DrawItem
    (Control: TWinControl; Index: Integer;
    Rect: TRect; State: TOwnerDrawState) ;
 var
    myColor: TColor;
    myBrush: TBrush;
 begin
    myBrush := TBrush.Create;
    with (Control as TListBox).Canvas do
    begin
(* das machen wir raus
      if not Odd(Index) then
        myColor := clSilver
      else
        myColor := clYellow;
*)

      // und das machen wir stattdessen rein
      If InDB(Index) then // die Funktion InDB musst dann noch schreiben, diese schaut in der DB nach und gibt True zurück wenn der Item in der DB gefunden wurde
        myColor := clYellow
      else
        myColor := clWhite;
        
      myBrush.Style := bsSolid;
      myBrush.Color := myColor;
      Windows.FillRect(handle, Rect, myBrush.Handle) ;
      Brush.Style := bsClear;
      TextOut(Rect.Left, Rect.Top,
              (Control as TListBox).Items[Index]) ;
      MyBrush.Free;
    end;
 end;
Dann müsste ich mir eine Funktion schreiben die zb Folgendes tut: (ganz grob)
- Datenbank connect
- überprüfen ob user vorhanden (true od. false returnen)
- Disconnect

Das Problem ist aber, das der User zuerst die Liste anlegen muss. Dann gibt es eine Art "Execute" Button und in dieser Prozedur werden dann etliche Datenbankspezifische Dinge
durchgeführt (abfragen, updates, inserts etc.). Wenn es hier ein Problem gibt zB. User nicht vorhanden, Färbe das Item yellow, bei SQL Update Fehler red und bei success green.

Dh. ich bräuchte die Möglichkeit in meiner "SQL-Funktion", sprich wenn ich die Liste abarbeite das Item[x] nachträglich zu ändern.

Sorry falls ich mich blöd stelle. Habe mich vorhin mit OnDrawItem gespielt und der einzige Erfolg war, das ich beim !Hinzufügen! die Farbe ändern kann, jedoch nicht bei einem bestehenden. oder wie gesagt ich bin zu blöd ^^

LG
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.659 Beiträge
 
Delphi 12 Athens
 
#2

AW: ListBox

  Alt 6. Jun 2014, 10:17
http://docwiki.embarcadero.com/Libra...Box.OnDrawItem
Zitat:
Mit einer Ereignisbehandlungsroutine für OnDrawItem können Sie die Einträge von Listenfeldern zeichnen, deren Eigenschaft Style den Wert lbOwnerDrawFixed, lbOwnerDrawVariable oder lbVirtualOwnerDraw hat. OnDrawItem tritt immer dann ein, wenn ein Eintrag im Listenfeld angezeigt werden muss. Dieses Ereignis gibt es nur bei Owner-Draw-Listenfeldern.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: ListBox

  Alt 6. Jun 2014, 10:39
OK, Vorschlag. Führe beim Füllen deiner ListBox eine Liste mit Farben, oder schreibe die Farben in die Objects der der ListboxItems. Am Anfang alle clWhite. Beim Execute-Knopf änderst du dann die Farben anhand des Items auf Rot/Grün/Gelb. Im OnItemDraw nimmst du dann die Farbe aus der Liste oder aus den Objects, wie immer du dich entschieden hast diese mitzuführen.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
value is NULL

Registriert seit: 10. Sep 2010
249 Beiträge
 
#4

AW: ListBox

  Alt 6. Jun 2014, 10:40
Ich komm nicht dahinter... Aber trotzdem danke für die Hilfe
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.740 Beiträge
 
Delphi 6 Enterprise
 
#5

AW: ListBox

  Alt 6. Jun 2014, 11:00
Nur sinngemäß, da ich gerade kein Delphi offen habe, geht bestimmt auch einfacher:

Delphi-Quellcode:
type
  TLBColor=class
    public
     Color:TColor;
  end;


//Item zur Liste hinzufügen:
procedure TForm1.Button1Click(Sender: TObject);
var t:TLBColor;
begin
  t:=TLBColor.Create;
  t.Color:=clWhite;
  Listbox1.AddItem('foo',t);
end;

//in deiner Prüffunktion
while i < Form1.ListBox1.Count do begin
    userId := sqlst.query('select id from user_ where username = '''+Form1.listbox1.Items[i]+'''');
    //user not found
    if userId = 'then //Change Color of current line - cLYellow
      TLBColor(Listbox1.Items.Objects(i)).Color:=clRed;
    i := i + 1;
end;



procedure TForm1.ListBox1DrawItem
    (Control: TWinControl; Index: Integer;
    Rect: TRect; State: TOwnerDrawState) ;
 var
    myColor: TColor;
    myBrush: TBrush;
 begin
    myBrush := TBrush.Create;
    with (Control as TListBox).Canvas do
    begin
      myColor := TLBColor(Listbox1.Items.Objects(index)).Color;
      myBrush.Style := bsSolid;
      myBrush.Color := myColor;
      Windows.FillRect(handle, Rect, myBrush.Handle) ;
      Brush.Style := bsClear;
      TextOut(Rect.Left, Rect.Top,
              (Control as TListBox).Items[Index]) ;
      MyBrush.Free;
    end;
 end;
Ralph
  Mit Zitat antworten Zitat
value is NULL

Registriert seit: 10. Sep 2010
249 Beiträge
 
#6

AW: ListBox

  Alt 6. Jun 2014, 11:21
Jetzt hab ichs kapiert.... funktioniert!

Danke an alle für die Geduld!
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#7

AW: ListBox

  Alt 6. Jun 2014, 13:13
Für mich klang das so, als würde dieses Event nur aufgerufen, wenn ich ein neues Item hinzufüge zB Listbox1.Items.Add('WasAuchImmer');
Bei OnDrawIten wird jedes Mal gezeichnet wenn es nötig ist. OnMeasureItem wird nur ein mal ausgeführt, z. B. bei deinem Add.

Zum Code. Den muss man nicht so komplex machen wie hier:
Delphi-Quellcode:
procedure TForm1.ListBox1DrawItem
    (Control: TWinControl; Index: Integer;
    Rect: TRect; State: TOwnerDrawState) ;
 var
    myColor: TColor;
    myBrush: TBrush;
 begin
    myBrush := TBrush.Create;
    with (Control as TListBox).Canvas do
    begin
      myColor := TLBColor(Listbox1.Items.Objects(index)).Color;
      myBrush.Style := bsSolid;
      myBrush.Color := myColor;
      Windows.FillRect(handle, Rect, myBrush.Handle) ;
      Brush.Style := bsClear;
      TextOut(Rect.Left, Rect.Top,
              (Control as TListBox).Items[Index]) ;
      MyBrush.Free;
    end;
 end;
Im Grunde reicht es, was Farbe angeht, das:
Delphi-Quellcode:
 begin
    with (Control as TListBox).Canvas do
    begin
      ...
      Brush.Color := myColor;
      ...
    end;
 end;
Zum empfehlen ist sich an die Listbox ein Objekt mit Infox anzuhängen. Kein großer Aufwand, aber bei OnDrawItem kann man sich die nötigen Infos bezüglich Farbe und weitere Formatierung da rausholen.

Im Anhang habe ich ein kleines Beispiel das zeigt wie das mit dem angehängtem Objekt funktioniert und wie man jeden Item individuell einfärben kann:
Angehängte Dateien
Dateityp: zip BeispielFarbigeItems.zip (2,3 KB, 1x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: ListBox

  Alt 6. Jun 2014, 18:26
Für mich klang das so, als würde dieses Event nur aufgerufen, wenn ich ein neues Item hinzufüge zB Listbox1.Items.Add('WasAuchImmer');
OnMeasureItem wird nur ein mal ausgeführt, z. B. bei deinem Add.
Bist du dir da sicher?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  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 22:50 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-2025 by Thomas Breitkreuz