// 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_);
if DataSource_TradesListen.DataSet.RecNo = 1
then
myKontostand:=DB_Konto.ReadSQL_Kontostand_ausTBGeld(dat_);
//findet in tbgeld den Kontostand zu einem bestimmten Datum vom in RadioGroup gewähltem Konto
// Problem, dass einige Einträge pro Tag vorhanden sein können
// _________________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;
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.
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, 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;
// 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;
Monatsgewinn:=Monatsgewinn + i;
Wochengewinn:=Wochengewinn + i;
end;
if (Column.FieldName='
KAPITAL')
then // das rechnet jetzt falsch
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
end;
// zu (Sender as TDBGrid)
end;