|
Delphi-PRAXiS
Sprachen und Entwicklungsumgebungen
Object-Pascal / Delphi-Language
Delphi DBGrid - font color - selected - Owner Draw
|
Registriert seit: 6. Jul 2010 167 Beiträge Delphi XE3 Professional |
#1
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; |
|
|
| Ansicht |
Zur Linear-Darstellung wechseln |
Zur Hybrid-Darstellung wechseln |
Baum-Darstellung |
ForumregelnEs 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
|
|
| Nützliche Links |
| Heutige Beiträge |
| Sitemap |
| Suchen |
| Code-Library |
| Wer ist online |
| Alle Foren als gelesen markieren |
| Gehe zu... |
| LinkBack |
LinkBack URL |
About LinkBacks |






