AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Größten Wert einerDBGrid Zeile farblich hinterlegen
Thema durchsuchen
Ansicht
Themen-Optionen

Größten Wert einerDBGrid Zeile farblich hinterlegen

Ein Thema von waldforest · begonnen am 30. Okt 2015 · letzter Beitrag vom 31. Okt 2015
Antwort Antwort
waldforest

Registriert seit: 8. Mai 2005
366 Beiträge
 
Delphi XE3 Enterprise
 
#1

Größten Wert einerDBGrid Zeile farblich hinterlegen

  Alt 30. Okt 2015, 18:04
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 ?
Miniaturansicht angehängter Grafiken
dbgridfarbe.jpg  
mfg wf

Geändert von waldforest (30. Okt 2015 um 18:24 Uhr)
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 30. Okt 2015, 18:53
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
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor (30. Okt 2015 um 18:59 Uhr)
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
972 Beiträge
 
Delphi 6 Professional
 
#3

AW: Größten Wert einerDBGrid Zeile farblich hinterlegen

  Alt 31. Okt 2015, 05:16
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.
  Mit Zitat antworten Zitat
waldforest

Registriert seit: 8. Mai 2005
366 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: Größten Wert einerDBGrid Zeile farblich hinterlegen

  Alt 31. Okt 2015, 08:48
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.
mfg wf
  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:55 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