// 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;
begin
// wird jede Zelle aufgerufen, dabei liegen dieParameter so:
/// IBQuery_Alltag.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) and (RadioGroup_sortieren2.ItemIndex <> 0) 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('Entry_Date').AsDateTime;
monat_ := MonthOf(dat_);
woche_:= WeekOf(dat_);
// _________________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.Pen.Style := psSolid;
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;
if (DataCol > 12) // das funktioniert jetzt, doch nur für > 12?! Leider ja, obwohl 28 Spalten da, wird nur bis 13 gezählt.
then Monatswechsel:=false; // Wegen eines internen Fehlers in der Query wird DataCol und FieldCount und ColumnCourt leider
// nicht nur fehelrhaft gezählt, es kommt auch zu Zugriffen nach nil. 17.8.2023 unklar, ob das in Delphi so war oder Lazarus, eher Delphi
if woche_ <> woche_temp then begin
woche_temp:=woche_;
If ListBoxZeilenFarbe = clwhite then ListBoxZeilenFarbe := ListBoxZeilenFarbe // wechselt mit der als neu erkannten Woche
else ListBoxZeilenFarbe := clWhite;
Wochengewinn:=0; // Der Wochengeweinn wird zurückgeetzt
end;
Canvas.Brush.Color := ListBoxZeilenFarbe; // 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, die interne Breite bleibt leider bei der vollen Länge
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;
if (DataCol = 1) then // 1 ist willküflich, damit nicht jede Zelle wieder gerechnet wird
myKontostand:=DB_Konto.AddiereKapitalUGeschlossenPos; // liest nur den LETZTEN Kontostand, nicht jenen, des richtigen Datums, den speichere ich nicht
// adddiert die Tradeergenisse zum Periodenfangskapital, rechnet Performance
if (Column.FieldName='ERGEBNIS') then begin // das ist case sensitive !!!
i:=DataSource_TradesListen.DataSet.FindField('ERGEBNIS').AsInteger;
if i < 0 then Canvas.Font.Color := clRed
else Canvas.Font.Color := clGreen;
// myKontostand:= myKontostand + i; 18.8.2023 da ich die Kontostände nicht nach Datum speichere, habe ich die Zahl "Kontostand an einem Tag" nicht
Monatsgewinn:=Monatsgewinn + i;
Wochengewinn:=Wochengewinn + i;
end;
if (Column.FieldName='KAPITAL') then // schreibt die Var myKontostand ins Feld
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
if (gdSelected in State) then Canvas.Font.Color:= clBlue; // die angeklickte Zelle bekommt blaue Schrift
// 30.1.2023 jetzt ist sie weiß, doch uU nicht "selected
if (gdFocused in State) then Canvas.Font.Color:= clBlue; // probere es mal so und auch blau
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
end; // zu (Sender as TDBGrid)
end;