Einzelnen Beitrag anzeigen

NicoleWagner

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

DBGrid - font color - selected - Owner Draw

  Alt 21. Mai 2022, 11:15
Delphi-Version: XE3
Mein Problem ist vermutlich mit einem Mausklick oder einem winzigen Eintrag zu lösen, - doch wo?
Gegeben ist ein TDBGrid (Code als Text unterhalb) und ich färbe es selbst ein (Draw auch unterhalb).
Das funktioniert alles wunderbar und wunschgemäß:
Die Zellen werden nach komplexem Schema bunt gemalt, die Schrift in der richtigen Farbe neu in die Zellen geschrieben....

.... und dann klicke ich eine Zelle an und die Schrift wird "unsichtbar": nämlich weiß auf weißem Grund.
Ich mache zwei Screenshots: einmal von dem DBGrid wie es aussieht und dann mit einer ausgewählten Zelle = "ohne Schrift"

Was ich gerne hätte:
Wenn ich eine Zelle anklicke, dann soll die Schrift - z.B. blau werden.
Wo befehle ich es?
Danke!
Delphi-Quellcode:

  object DBGrid_Trades: TDBGrid
    Left = 3
    Top = 112
    Width = 1272
    Height = 374
    Anchors = [akLeft, akTop, akRight, akBottom]
    Ctl3D = True
    DataSource = DataSource_TradesListen
    ParentCtl3D = False
    PopupMenu = Popup_DBGridTrades
    TabOrder = 1
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'Tahoma'
    TitleFont.Style = []
    OnDrawColumnCell = DBGrid_TradesDrawColumnCell
    Columns = <
      item...
viele>

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

Delphi-Quellcode:
// 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;
Miniaturansicht angehängter Grafiken
delphi-selected.png  
  Mit Zitat antworten Zitat