AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fontfarbe in TStringgrid ändern ;-)

Ein Thema von Roadrunner.1 · begonnen am 3. Mai 2017 · letzter Beitrag vom 5. Mai 2017
Antwort Antwort
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Fontfarbe in TStringgrid ändern ;-)

  Alt 3. Mai 2017, 22:10
Schau dir mal von Bergsoff Das NextGrid an. Ist einfach der Hammer und beherrscht das was du möchtest... Der Umstieg lohnt sich in jedem Fall und die Bedienung ist super simple!
Michael Kübler
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.371 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Fontfarbe in TStringgrid ändern ;-)

  Alt 4. Mai 2017, 06:50
Gestern hatte ich leider keine Zeit mehr, um mir das Problem nochmal genauer anzusehen.

Soweit ich mich erinnern kann, musst du dich immer um das Zeichnen jeder Zelle kümmern. Also nicht nur bei denen, die du anders darstellen willst.
Ich kann es hier im Moment nicht testen (gerade kein Delphi verfügbar), aber wenn du den Source in etwa so änderst, sollte es besser funktionieren:
Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
 State: TGridDrawState);
var
  grdCanv : TCanvas; // Dadurch kürze Schreibweise ohne das "WITH"
  OldColor : TColor;
begin
  grdCanv := StringGrid1.Canvas;
  OldColor := grdCanv.Font.Color;
  if (ACol=4) and (ARow>0) then begin
    grdCanv.Font.Color:=clred;
  end;
  grdCanv.FillRect(Rect);
  grdCanv.Textout(Rect.Left+2,Rect.Top+2, StringGrid1.Cells[ACol,ARow]);
  // Statt Textout ist vielleicht TextRect die bessere Wahl
  grdCanv.Font.Color := OldColor;
end;
Auch wenn das "with" hier nicht das Problem ist, solltest du es vermeiden. Es verursacht immer wieder mal Probleme.
Peter
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.663 Beiträge
 
Delphi 12 Athens
 
#3

AW: Fontfarbe in TStringgrid ändern ;-)

  Alt 4. Mai 2017, 07:30
Soweit ich mich erinnern kann, musst du dich immer um das Zeichnen jeder Zelle kümmern. Also nicht nur bei denen, die du anders darstellen willst.
Um das etwas zu präzisieren: Das wird über das Property DefaultDrawing gesteuert. Ist das true, malt das StringGrid vor dem Event schon mal den Text in die Zelle. Das ist der Übermalen-Effekt, den du schon bemerkt hast. Wenn DefaultDrawing auf False steht, musst du aber eben auch alle Zellen selbst malen. Dabei solltest du allerdings den Inhalt des State-Parameters berücksichtigen.

Weiterhin gibt es zu bedenken, daß ein aktiver Editor in einer Zelle selbst das Malen übernimmt. Da du goAlwaysShowEditor aktiv hast, bleibt der InplaceEditor sichtbar (und auch für die Textdarstellung zuständig) wenn du das Grid verlässt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
733 Beiträge
 
Delphi 12 Athens
 
#4

AW: Fontfarbe in TStringgrid ändern ;-)

  Alt 4. Mai 2017, 08:19
Wie Uwe schon gesagt hat, malt der Inplace-Editor den Text neu, wenn das Grid den Focus verliert. Dabei kannst du die Textfarbe nicht beeinflussen. Das OnDrawCell des Grid ist hier nicht mehr zuständig.

Im OnExit den Text neu zu malen ist auch keine Option, denn das kommt zu früh. Der Inplace-Editor malt später nochmal drüber.

Man muss also eine Möglichkeit finden, den Text verzögert zu malen, nachdem der Inplace-Editor fertig ist.

Deshalb meine Lösung mit einem Timer:

Nimm einem Timer, setze Enabled auf false und Interval auf 10.

Im OnExit des Grid setzt du nur Timer.enabled:=true; Der Timer-Event sieht dann so aus:
Delphi-Quellcode:
procedure TForm1.TimerTimer(Sender: TObject);
var Rect: TRect;
begin
  if (StringGrid1.Col=4) and (StringGrid1.Row>0) then begin
    Rect:=StringGrid1.CellRect(StringGrid1.Col, StringGrid1.Row);
    StringGrid1.Canvas.Font.Color:=clred;
    StringGrid1.Canvas.FillRect(Rect);
    StringGrid1.Canvas.Textout(Rect.Left+2,Rect.Top+2, StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row]);
    Timer.Enabled:=false;
  end;
end;
Nicht besonders schön, funktioniert aber.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.663 Beiträge
 
Delphi 12 Athens
 
#5

AW: Fontfarbe in TStringgrid ändern ;-)

  Alt 4. Mai 2017, 08:22
Man muss also eine Möglichkeit finden, den Text verzögert zu malen, nachdem der Inplace-Editor fertig ist.
... oder man nimmt das goAlwaysShowEditor weg.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Roadrunner.1

Registriert seit: 3. Mai 2009
20 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Fontfarbe in TStringgrid ändern ;-)

  Alt 5. Mai 2017, 08:41
Hallo Zusammen,

erst einmal danke für die inspirierenden Antworten. Also über einen Timer zeitversetzt das Stringgrid zu
übermahlen ist schon ein toller Hack, aber mit Sicherheit nicht im Sinne des Erfinders.

Danke an Uwe, das mit dem "DefaultDrawing" kannte ich so nicht, und verstand ich auch nicht anhand der Online Hilfe so.
Nach Abschalten eben dieses, und alles selber Zeichnen, funktioniert das jetzt fast schon so wie ich es mir vorstellte.
Insbesondere funktioniert jetzt auch das Umschalten von "goAlwaysShowEditor" bei Enter/Exit vom Stringgrid jetzt vernünftig.

Eine Sache hätte ich aber noch, vielleicht gibt es dafür auch eine einfach Lösung. Wenn im Stringgrid der Fokus auf einer "roten"
Zellen steht, und man nun mit TAB die Komponenten durchgeht und wieder zum Stringgrid zurück kommt, dann wird die Zelle schwarz
dargestellt. OK das dürfte wieder der InplaceEditor sein der durch einschalten von "goAlwaysShowEditor" wieder die Zelle malt.
(DrawCell wird genau für diese Zelle nämlich auch nicht aufgerufen).
Aber entgegen dem Navigieren innerhalb des Stringgrids ist der Inhalt der Zelle nicht ausgewählt. Kann man den Auswählen?
Ich hatte es schon mit "InplaceEditor.SelectAll;" probiert (in OnEnter und auch onDrawCell), aber da passiert nichts.

Also als Ergebnis das was man im 3. Bild (EinmalHochRunter) sieht wenn das Stringgrid den Fokus bekommt.
Angehängte Grafiken
Dateityp: jpg Kein Fokus.JPG (9,9 KB, 2x aufgerufen)
Dateityp: jpg Fokus bekommenm.JPG (9,9 KB, 2x aufgerufen)
Dateityp: jpg EinmalHochRunter.JPG (10,9 KB, 2x aufgerufen)
Christian Drenkard
--
mfg.
Christian Drenkard

Geändert von Roadrunner.1 ( 5. Mai 2017 um 08:43 Uhr)
  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 15:15 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