AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Wie ziehe ich eine farbige Linie in einem DBGrid / DrawColumnsCell-Event?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie ziehe ich eine farbige Linie in einem DBGrid / DrawColumnsCell-Event?

Ein Thema von NicoleWagner · begonnen am 25. Nov 2021 · letzter Beitrag vom 26. Nov 2021
 
NicoleWagner

Registriert seit: 6. Jul 2010
167 Beiträge
 
Delphi XE3 Professional
 
#8

AW: Wie ziehe ich eine farbige Linie in einem DBGrid / DrawColumnsCell-Event?

  Alt 25. Nov 2021, 18:41
Danke für Deine Mühe und Geduld!!!


//************************************************** ****************************
implementation
uses .........

Var monat_temp, woche_temp: integer; // benötigt für das Farbschema
farbe: TColor= $00E7F2FF; // fürs Einfärben des Grids
Monatswechsel: Boolean = false;

Wochengewinn: integer = 0;
Monatsgewinn: integer = 0;
myKontostand: integer = 0; // fürs Draw Ereignis

=======================================

// malt die Monateszeilen der Trades je nach Monat bunt und rechnet sie auch, als "Calc"-Ereignis missbraucht
procedure TFrame_Konto.DBGrid_TradesDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);

Var s_cell: string;
d: double;
i: integer;
dat_: TDateTime;
monat_, woche_: integer;
Kapital, Gewinn: integer;


begin
// wird jede Zelle aufgerufen, dabei liegen dieParameter so:
/// Query.RecNo 1 1 1 1 => DataSource_TradesListen.DataSet.RecNo
/// 2 2 2 2
/// column.index 0 1 2 3
/// 0 1 2 3
/// 0 1 2 3
/// columns 0 1 2 3
/// 0 1 2 3
/// 0 1 2 3
/// hier passiert nur das ZEICHNEN, der Inhalt hängt davon nicht ab
/// ACHTUNG Namen der Felder sind case sensitive!
///
///

with (Sender as TDBGrid) do begin


if Column.Field <> nil then s_cell:=Column.Field.AsString; // hier wird einmal alles generell in ein eintragbares String gespeichert
// ganz unten wird dieser String über den neuen Hintergrund geschrieben

// für andere Werte überschreibe ich das String, um es anders zu formatieren.

//________________ diese Block färbt alternierende Zeilen, wenn NICHT nach Datum sortiert wird
if RadioGroup_Sortiere.ItemIndex <> 5 then begin
i:=DataSource_TradesListen.DataSet.RecNo;
if Odd(i) then Canvas.Brush.Color :=$00E7F2FF;
Canvas.FillRect(Rect); // steht das vor dem Block "Schriftfarbe", wird nur hinter-dem-Anfüllen-aufgerufen sichtbar
Canvas.TextOut(Rect.Left + 2, Rect.Top + 1,s_cell); // Text wird neu geschrieben
exit; // Sortierung der Query UNGLEICH Datum, daher macht das Einfärben oder Rechnen keinen Sinn
end;


//__________alles weitere bis hinunter, WENN nach Datum sortiert wird
// die Spalte Datum wird ausgelesen und für diese Zeile verarbeitet
dat_:=DataSource_TradesListen.DataSet.FindField('E ntry_Date').AsDateTime;
monat_ := MonthOf(dat_);
woche_:= WeekOf(dat_);

myKontostand:=DB_Konto.ReadSQL_Kontostand_ausTBGel d(dat_); //findet in tbgeld den Kontostand zu einem bestimmten Datum vom in RadioGroup gewähltem Konto

// _________________jedes neue Monat wird erkannt
if monat_ <> monat_temp then begin
monat_temp:=monat_;
Monatswechsel:=true;
Monatsgewinn:=0;
end;

if Monatswechsel and (DataSource_TradesListen.DataSet.RecNo > 1) then begin // das zeichnet den oberen Rand einer einzelnen Zelle, außer ganz oben
Canvas.Pen.Color := $00243C79; // $005180F5; // Linienfarbe für die Monatstrennung
Canvas.Pen.Width := 5; // Stärke der Linie, erzeugt einen Ballon am Zeilenbeginn
Canvas.MoveTo(Rect.Left,Rect.Top);
Canvas.LineTo(Rect.Right,Rect.Top); // zeichnet eine rote Linie an die Oberkante und damit unter das alte Monat
end;

i:=Columns.Count; // Columns.Count nimmt er, doch "interner Fehler", er scheint falsch zu zählen.
if (DataCol > 12) // das funktioniert jetzt, doch nur für > 12?! ich lasse das einmal so, weil es nicht lohnt. d.h. die Striche sind lang, doch nicht bis zum Ende
then Monatswechsel:=false;
//_______________________ Ende zur Monaterkennung: Es wird das Monat als Zelle erkannt und die Info bis zum Zeilenfortschritt auf Zelle 12 beibehalten, danach alte Farbe/Dicke


// _________________jede neue Woche wird erkannt

if woche_ <> woche_temp then begin
woche_temp:=woche_;
If farbe = clwhite then farbe := $00E7F2FF // wechselt mit der als neu erkannten Woche
else farbe := clWhite;
Wochengewinn:=0; // Der Wochengeweinn wird zurückgeetzt
end;
Canvas.Brush.Color := farbe; // Hintergrundfarbe wird zugewiesen, bewirkt, dass die Hingrundfarbe orange bleibt, bis zum nächsten Wochenwechsel
//_____________ Ende der Wochenbearbeitung


// überschreibt string für die PL wieder, um die PL besser zu formatieren
if (Column.FieldName='PL') then begin // klappt auch: if (dataCol=1).....
d:=DataSource_TradesListen.DataSet.FindField('PL') .AsFloat;
s_cell:=FloatToStrF(d,ffNumber,5,2);
end;

// adddiert die Tradeergenisse zum Periodenfangskapital, rechnet Performance
if (Column.FieldName='ERGEBNIS') then begin // das ist case sensitive !!!
i:=DataSource_TradesListen.DataSet.FindField('ERGE BNIS').AsInteger;
if i < 0 then Canvas.Font.Color := clRed
else Canvas.Font.Color := clGreen;
myKontostand:= myKontostand + i;
Monatsgewinn:=Monatsgewinn + i;
Wochengewinn:=Wochengewinn + i;
end;

if (Column.FieldName='KAPITAL') then
s_cell:=FloatToStrF(myKontostand,ffNumber,5,2);

if (Column.FieldName='Wochengewinn') then begin
s_cell:=FloatToStrF(Wochengewinn,ffNumber,5,2);
if Wochengewinn < 0 then Canvas.Font.Color := clRed
else Canvas.Font.Color := clGreen;
end;

if (Column.FieldName='WoG_Prozent') then begin
if myKontostand = 0 then d:=0
else d:=(Wochengewinn / myKontostand) * 100;
s_cell:=FloatToStrF(d,ffNumber,5,2) + ' %';
if d < 0 then Canvas.Font.Color := clRed
else Canvas.Font.Color := clGreen;
end;

if (Column.FieldName='Monatsgewinn') then begin
s_cell:=FloatToStrF(Monatsgewinn,ffNumber,5,2);
if Monatsgewinn < 0 then Canvas.Font.Color := clRed
else Canvas.Font.Color := clGreen;
end;

if (Column.FieldName='MoG_Prozent') then begin
if myKontostand = 0 then d:=0
else d:=(Monatsgewinn / myKontostand) * 100;
s_cell:=FloatToStrF(d,ffNumber,5,2) + ' %';
if d < 0 then Canvas.Font.Color := clRed
else Canvas.Font.Color := clGreen;
end;
//__________________ Ende Performancerechnungen


// die übermalte Schrift wird wieder eingetragen
Canvas.FillRect(Rect); // steht das vor dem Block "Schriftfarbe", wird nur hinter-dem-Anfüllen-aufgerufen sichtbar
Canvas.TextOut(Rect.Left + 2, Rect.Top + 1,s_cell); // Text wird neu geschrieben


// ShowMessage(IntTostr(Datacol)+ ' ');


end; // zu (Sender as TDBGrid)

end;
  Mit Zitat antworten Zitat
 


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 02:10 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