Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Größten Wert einerDBGrid Zeile farblich hinterlegen (https://www.delphipraxis.net/187139-groessten-wert-einerdbgrid-zeile-farblich-hinterlegen.html)

waldforest 30. Okt 2015 18:04


Größten Wert einerDBGrid Zeile farblich hinterlegen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich habe ein Verständnisproblem mit meiner farblichen Gestaltung.
Ich möchte den größten Wert in einer DBGrid Zeile farblich markieren.
Die Zellen werden auch farblich hinterlegt, aber dummerweise immer eine Zeile tiefer als die eigentliche Zeile. Und außerdem flackernmdie Zellen im Grid.


Code:
procedure TNachbestellung.jvdbgrd_GridDrawColumnCell(
  Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
var
  I, maxfeld, maxwert: Integer;
  str_feld : string ;
begin

    IF (Column.Field.FieldName = 'VK_1_MENGE') or
     (Column.Field.FieldName = 'VK_2_MENGE') or
     (Column.Field.FieldName = 'VK_3_MENGE') or
     (Column.Field.FieldName = 'VK_4_MENGE') or
     (Column.Field.FieldName = 'VK_5_MENGE') or
     (Column.Field.FieldName = 'VK_6_MENGE') then
  begin
    maxfeld := 0;
    maxwert := 0;
    // ermitteln des größten Wertes und festhalten in welchem Datenfeld
    for I := 1 to 6 do
    begin
     str_feld := 'VK_'+IntToStr(i)+'_MENGE';
     if zqry_Best.fieldbyname(str_feld).asinteger > maxwert then
     begin
       maxwert := zqry_Best.fieldbyname(str_feld).asinteger;
       maxfeld := I;
     end;
    end;
    str_feld := 'VK_'+IntToStr(maxfeld)+'_MENGE' ;

    // wenn größtes ermitteltes Datenfeld = dem aktuellen Gridfeld, dann farbig hinterlegen.
    if (Column.Field.FieldName = str_feld) then
      Column.Color := clred
    else
      Column.Color := clWindow;

       jvdbgrd_Grid.Canvas.fillRect( rect );
       jvdbgrd_Grid.DefaultDrawColumnCell(Rect,DataCol,Column,State);
  end;
was mach ich falsch ?

Delbor 30. Okt 2015 18:53

AW: Größter Wert einer Zeile im DBGrid farblich hinterlegen
 
Hi waldforest

Ich würde das grundsätzlich anders lösen - Die Prozedur gehört meiner ersten Reaktion nach nicht in OnDrawCell:

Delphi-Quellcode:
 Type TFeldnamemn = ('VK_1_MENGE','VK_2_MENGE','VK_3_MENGE','VK_4_MENGE','VK_5_MENGE','VK_6_MENGE');

 TBigest = record
   Wert : dein Datentyp;
   ARow: Integer;
   ACol: Integer;
 end;
...
...
private
...
FBigest: TBigest;
...
...

procedure TForm1.jvdbgrd_GridDrawColumnCell;
  Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
var
  I, J: Integer;
  str_feld : string ;
  begin
    for i := 0 to jvdbgrd.row.Count -1 do
    begin
      for j := 0 to jvdbgrd.col.Count -1 do
      begin
        (Nun liest du den Wert der Zelle und belegst Bigest.Wert damit, sofern deren Wert kleiner ist.)
        (Gleichzeitig musst du die Koordinaten der Zelle in Bigest ARow und Bigest ACol speichern.I)
      end;
    end;

  end;
ColorToBigestValueField;
In einer 2. Reaktion kann sie da bleiben. Alles, was tu tn musst, ist, zu prüfen, ob der Spaltentitel in TFeldnamen vorkommt. Wenn ja, wird, wie oben gezeigt, der Wert in den Record geschri

ColorToBigestValueField ist eine Prozedur, die das im Record angegebene Feld des Grid im Nachinein einfärbt. Die habe ich jetzt allerdings nicht entworfen.

Gruss
Delbor

PS:
Zitat:

einer DBGrid Zeile
Ups, da hab ich doch tatsächlich Zelle gelesen, wo Zeile stand - es bräuchte also einne Anpassung. Aber das Prinzip ändert sich nicht

HolgerX 31. Okt 2015 05:16

AW: Größten Wert einerDBGrid Zeile farblich hinterlegen
 
Hmm..

Wenn deine DataSet-Komponente ein CalculatedField unterstützt, kannst Du die Ermittlung des höchsten Wertes, bzw. den Spaltennamen auch VOR der Anzeige im Grid machen (OnCalcField).

Dann währe nur noch

Delphi-Quellcode:
  // wenn größtes ermitteltes Datenfeld = dem aktuellen Gridfeld, dann farbig hinterlegen.
    if (Column.Field.FieldName = zqry_Best.fieldbyname('MaxFieldName').asString) then
      Column.Color := clred
    else
      Column.Color := clWindow;
notwendig.

Dadurch müsste nicht bei jeder Zelle erneut die MaxValue Spalte ermittelt werden.
Sollte ein deutliches SpeedUp bewirken und Du kannst beim Debuggen einfacher prüfen.

waldforest 31. Okt 2015 08:48

AW: Größten Wert einerDBGrid Zeile farblich hinterlegen
 
Hallo,
vielen Dank für die Tipps.
Habe den Fehler gefunden (ungeachtet der Maximalberechnung). Es lag daran dass ich Column.Color anstatt Canvas.Brush.Color genutzt habe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:52 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 by Thomas Breitkreuz