![]() |
Delphi-Version: XE3
DBGrid - font color - selected - Owner Draw
Liste der Anhänge anzeigen (Anzahl: 1)
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; |
AW: DBGrid - font color - selected - Owner Draw
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...
|
AW: DBGrid - font color - selected - Owner Draw
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. |
AW: DBGrid - font color - selected - Owner Draw
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:
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. |
AW: DBGrid - font color - selected - Owner Draw
Danke für Deine Antwort.
"wie" soll ich es berücksichtigen? Worum diese Frage bittet, ist eine Zeile Code. |
AW: DBGrid - font color - selected - Owner Draw
Zitat:
if gdSelected in State dann zeichne etwas so das es funktioniert.. ![]() 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 ![]() 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. |
AW: DBGrid - font color - selected - Owner Draw
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; |
AW: DBGrid - font color - selected - Owner Draw
Zitat:
Daher sind unterschiedliche Ansätze schon hilfreich. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:21 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