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 einfärben einer zeile eines dbgrids (https://www.delphipraxis.net/37840-einfaerben-einer-zeile-eines-dbgrids.html)

stonimahoni 11. Jan 2005 09:11


einfärben einer zeile eines dbgrids
 
hi leute

kann ich ein bdgrid dahingehend überprüfen, dass wenn ein feld in einer spalte nicht leer ist, dann würde ich gerne die ganze ZEILE in der sich dieses feld befindet in einer bestimmten farbe darstellen.

ist das möglich ? weil ich wüsste atm nicht wie ich das umsetze :(



thx

Sharky 11. Jan 2005 09:15

Re: einfärben einer zeile eines dbgrids
 
Hai,

geht ganz einfach ;-)

Delphi-Quellcode:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  with (Sender as TDBGrid) do
  begin
    if (gdSelected in State) then
    begin
      Canvas.Brush.Color := clblue; //Farbe für die Zelle mit dem Focus
    end
    else
    begin
      if (DataSource.DataSet.FieldByName('tag').AsInteger < 0) then
      begin
        Canvas.Brush.Color := clRed;
      end
      else
      begin
        Canvas.Brush.Color := clGreen;
      end;
    end;
    Canvas.FillRect(Rect);
    Canvas.TextOut(Rect.Left + 2, Rect.Top + 1, Column.Field.AsString); //Denn Text in der Zelle ausgeben
  end;
end;
Dieser Code färbt im DBGrid jede Zeile rot wenn in dem Datensatz das Feld "tag" kleiner 0 ist. Ansonsten ist die Zeile grün.
Wenn die Zeile den Fokus besitzt ist sie blau.

stonimahoni 11. Jan 2005 09:38

Re: einfärben einer zeile eines dbgrids
 
danke vielmals sharky

hat bestens funktioniert :)

bis dann

mfg

stoni

zusatz :
das mit der rot markierten zeile hab ich jetzt probiert mit einzubauen allerdings wird bei deinem code nur die erste zelle dann rot markiert und auch nur eine nicht mehrere bei multiselect :(

wie kann ich denn realisieren dass bei multiselect mehrere ( die ausgewählten ) zeilen komplett markiert werden ??

jensw_2000 11. Jan 2005 21:59

Re: einfärben einer zeile eines dbgrids
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe Sharky's Code noch mal etwas abgeändert damit der den Farbcode aus der SQL Abfrage verwendet (nicht Sharky... der Code :mrgreen: ).

[Gedankenstütze]
SQL-Code:
SELECT Spalte1, Spalte2, 14588515 as 'Farbcode' FROM Table1 
UNION ALL
SELECT Spalte1, Spalte2, 9816060 as 'Farbcode' FROM Table2
[/Gedankenstütze]

Delphi-Quellcode:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  with (Sender as TDBGrid) do
  begin

    // prüfen ob in der Wert im Feld Farbcode <>NULL ist
    // Wenn ja, dann Farbe wählen. Wenn nicht, dann weiß.
    // Die Prüfung ist bei dem o.a. SQL Befehl nicht unbedingt notwendig, da Farbcode nie NULL werden kann
    // aber falls man mal auf reale Spalten zurückgreift muss er rein ...

    if DataSource.DataSet.FieldByName('Farbcode').AsVariant<>NULL then
    begin
      Canvas.Brush.Color := DataSource.DataSet.FieldByName('Farbcode').AsInteger;  // << hier an deine Query anpassen ...
    end
    else begin
      Canvas.Brush.Color := clWhite;
    end;
     
    // Bei selektierten Feldern die Farbe nochmal ändern
    if (gdSelected in state) then
    begin
      Canvas.Brush.Color := clHighlight; //Farbe für die Zelle mit dem Focus
    end;
    // Zeichnen
    Canvas.FillRect(Rect); //Hintergrundfarbe zeichnen
    Canvas.TextOut(Rect.Left + 2, Rect.Top + 1, Column.Field.AsString); //Den Text in der Zelle ausgeben
  end;
end;
Mit dem Multiselect komme ich auch nicht weiter, da 'gdSelected' nur den AKTUELL selektierten Datensatz kennzeichnet (also fast nichts anderes als dgFocused).

Habe dir mal nen Screenshot von meinem Test mit rangehängt ...

Eventuell ist es ja das, was du suchst ...

Ich habe 3 Tabellen via UNION ALL in einer Abfrage zusammengefasst und in jedem SELECT virtuelle Spalte 'Farbcode' mit einem induviduellen Integerwert hinzugefügt.


:hi:

stonimahoni 13. Jan 2005 07:31

Re: einfärben einer zeile eines dbgrids
 
hallo und guten morgen

@ jensw_2000 :
danke für deine antwort aber das bringt mich nicht wirklich weiter
so habe ich das auch schon hinbekommen - auch wenn ich das mit der farbzuweisung ez nicht unbedingt schon bei der select abfragte mache

aber wie gesagt : bei multiselect klappt das noch nicht so und vor allem möchte ich die ganze zeile dann andersfarbig haben und wenns geht auch dann vielleicht - je nach farbe bei auswahl - die schrift nicht in weiss sondern schwarz oder so haben.

werde mal weiter ausprobieren aber bin für vorschläge jeder art offen :P


ich hatte meins bisher so realisiert :

Delphi-Quellcode:
   with (Sender as TDBGrid) do
   begin
     //if (gdSelected in State) then
     //begin
     //   Canvas.Brush.Color := clred; // Farbe für die Zelle mit dem Focus
     //end
     //else
     //begin
      if doubleclick = false then
      begin
         //  Mahnung an Kunde
         if (DataSourceAuftrStat.DataSet.FieldByName('Rep_zurueck_datum').Value <> NULL) then
         begin
           Canvas.Brush.Color := clYellow;
         end;
         //  zweite KD Mahnung
         if (DataSourceAuftrStat.DataSet.FieldByName('Rep_zurueck_datum').Value = NULL) and (DataSourceAuftrStat.DataSet.FieldByName('Kudienst_mahn1').Value <> NULL) then
         begin
            Canvas.Brush.Color := clSkyBlue;
         end;
         //  erste KD Mahnung
         if (DataSourceAuftrStat.DataSet.FieldByName('Rep_zurueck_datum').Value = NULL) and (DataSourceAuftrStat.DataSet.FieldByName('Kudienst_mahn1').Value = NULL)then
         begin
           Canvas.Brush.Color := clMoneyGreen;
         end;
      end;
      Canvas.FillRect(Rect);      //Hintergrundfarbe zeichnen
      Canvas.TextOut(Rect.Left + 2, Rect.Top + 1, Column.Field.AsString); //Den Text in der Zelle ausgeben
      DBGridAuftrStatListe.Enabled := true;
     end;
mfg

stoni

stonimahoni 14. Jan 2005 08:32

Re: einfärben einer zeile eines dbgrids
 
weiss keiner nen rat wie das für multiselect und markieren der ganzen zeile geht ? :(
hab mich da schon durch die ganze delphi praxis suche gelesen aber nichts wirklich passendes gefunden :/

Sharky 14. Jan 2005 08:39

Re: einfärben einer zeile eines dbgrids
 
Zitat:

Zitat von stonimahoni
weiss keiner nen rat wie das für multiselect und markieren der ganzen zeile geht ? ...

Hai,
ergänze meinen Code mal so:
Delphi-Quellcode:
begin
.
.
    if (gdSelected in State) or (SelectedRows.CurrentRowSelected) then // Zeile hat den Fokus oder ist markiert
    begin
      Canvas.Brush.Color := clblue; //Farbe für die Zelle mit dem Focus
    end
.
.

stonimahoni 14. Jan 2005 15:20

Re: einfärben einer zeile eines dbgrids
 
supi
das hat einwandfrei geklappt sharky - danke danke

jetzt is noch das kleien problemchen, dass die erste zeile im dbgrid immer automatisch markiert wird und in deinem bsp dann automatisch blau ist wenn dgalwaysshowselection auf true steht.
steht das auf false sollte die zeile EIGENTLICH die farbe haben, die ich ihr duch den select zugewiesen habe, ABER : sie ist nun komplett weiss ?!

kann ich das so einstellen, dass wenn ich das programm starte, KEINE zeile markiert ist - also bis ich von mir aus eine selectiere/anwähle ?

danke für die hilfe
mfg

stoni

jensw_2000 14. Jan 2005 15:42

Re: einfärben einer zeile eines dbgrids
 
Hi,

nimm anstatt "gdSelected" -> "gdFocused".
Dann wird der aktive Record nur markiert, wenn das Grid den Eingabefocus hat .



:hi:

stonimahoni 14. Jan 2005 16:17

Re: einfärben einer zeile eines dbgrids
 
supi - klappt nun auch soweit :D



danke nochmals an alle ( sharky und jensw_2000 ) :D


mfg

stoni


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