AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi DBGrid - font color - selected - Owner Draw
Thema durchsuchen
Ansicht
Themen-Optionen

DBGrid - font color - selected - Owner Draw

Ein Thema von NicoleWagner · begonnen am 21. Mai 2022 · letzter Beitrag vom 21. Mai 2022
Antwort Antwort
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
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
704 Beiträge
 
Delphi 12 Athens
 
#2

AW: DBGrid - font color - selected - Owner Draw

  Alt 21. Mai 2022, 12:03
Ich hab mir den Kode nicht im Detail angeschaut (da muß mal dringend refactored werden, viel zu unübersichtlich), aber Du scheinst den State parameter komplett zu ignorieren...
Peter Below
  Mit Zitat antworten Zitat
NicoleWagner

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

AW: DBGrid - font color - selected - Owner Draw

  Alt 21. Mai 2022, 12:33
Danke für Deine Antwort: Wie genau kann ich das wo genau ändern?
Wenn es Dir zu unübersichtlich ist, dann bitte scrolle hinunter in die letzten 2 Zeilen, dort "passiert" die Schrift.
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#4

AW: DBGrid - font color - selected - Owner Draw

  Alt 21. Mai 2022, 12:37
Vorweg hab keine Ahnung vom DBGrid aber rein logisch..
Ist das Event OnDrawColumnCell mit deiner procedure DBGrid_TradesDrawColumnCell verbunden? Ok sehe es gerade "OnDrawColumnCell = DBGrid_TradesDrawColumnCell"
Wenn ja reicht dann im Click Event des jeweiligen Cell nicht einfach ein redraw?
Dann sollte doch DBGrid_TradesDrawColumnCell wieder aufgerufen werden oder nicht?

Zitat:
Danke für Deine Antwort: Wie genau kann ich das wo genau ändern?
Nun ja über state prüft man doch ob etwas selektiert ist oder nicht.
Das solltest du einfach mit berücksichtigen.

Funkt dir hier das Theme dazwischen? Eventuell wäre ein deaktivieren der Themes für das Ownerdraw Grid sinnvoll.

Geändert von venice2 (21. Mai 2022 um 12:53 Uhr)
  Mit Zitat antworten Zitat
NicoleWagner

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

AW: DBGrid - font color - selected - Owner Draw

  Alt 21. Mai 2022, 12:55
Danke für Deine Antwort.
"wie" soll ich es berücksichtigen?
Worum diese Frage bittet, ist eine Zeile Code.
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#6

AW: DBGrid - font color - selected - Owner Draw

  Alt 21. Mai 2022, 13:04
Danke für Deine Antwort.
"wie" soll ich es berücksichtigen?
Worum diese Frage bittet, ist eine Zeile Code.
Hmm...
if gdSelected in State dann zeichne etwas so das es funktioniert.. siehe

Wie schon betont es kann sein das Windows dazwischen funkt..
Wenn ich Tooltips Überzeichnen will muß ich die Theme dafür deaktivieren da es ansonsten nicht funktioniert. Als Beispiel.
Eventuell trifft das auch auf ein Grid zu!

EDIT:
Schau auch mal auf DefaultDrawing

Vielleicht hilft aber auch ein einfaches
Canvas.Refresh nach Canvas.TextOut

Aber wie schon gesagt hab keine Ahnung vom DBGrid.. das sind nur Tips-Hilfestellungen kann man annehmen oder auch nicht.

Geändert von venice2 (21. Mai 2022 um 13:31 Uhr)
  Mit Zitat antworten Zitat
NicoleWagner

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

AW: DBGrid - font color - selected - Owner Draw

  Alt 21. Mai 2022, 16:37
Danke für alle Antworten!

Sie halfen mir die Lösung zu finden. Sie lautet:


Delphi-Quellcode:
with (Sender as TDBGrid) do begin
.....

 if (gdSelected in State) then /// färbt die Schrift der selektierten Zelle blau
     Canvas.Font.Color:= clBlue;

.....

end;

Geändert von NicoleWagner (21. Mai 2022 um 16:41 Uhr)
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#8

AW: DBGrid - font color - selected - Owner Draw

  Alt 21. Mai 2022, 16:41
Danke für alle Antworten!

Sie halfen mir die Lösung zu finden. Sie lautet:


Delphi-Quellcode:
with (Sender as TDBGrid) do begin
.....

 if (gdSelected in State) then
     Canvas.Font.Color:= clBlue;

.....

end;
jo manchmal steht man einfach auf den schlauch.
Daher sind unterschiedliche Ansätze schon hilfreich.
  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 23:15 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