[gelöst] Zelle in StringGrid fokussieren

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
gladio
Beiträge: 217
Registriert: Sa 21. Jun 2014, 06:15
OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
CPU-Target: 64Bit
Wohnort: Rügen

[gelöst] Zelle in StringGrid fokussieren

Beitrag von gladio »

In einem StringGrid werden einige Zellen mit unterschiedlichen Farben gefüllt und in die ein Text eingeschrieben.
Das wird in der Prozedur DrawCell mittels FillRect() und TextOunt() etwa so realisiert

Code: Alles auswählen

brush.color:=StringToColor(Farbe);
...
FillRect(aRect);   //Zelle mit  Farbe  füllen...
...
TextOut(aRect.Left+3,aRect.Top+3, String); //Text in die Zelle schreiben
...
 


Wenn man sich jetzt durch die einzelnen Zellen bewegt, mit Maus oder Pfeiltasten, werden nur die leeren Zellen als fokussierte Zelle hervorgehoben.
Bei den eingefärbten und beschriebenen Zellen wird die aktuell fokussierte Zelle nicht hervorgehoben.

Hat da jemand eine Lösung ?
Zuletzt geändert von gladio am Di 5. Mär 2019, 19:25, insgesamt 1-mal geändert.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Zelle in StringGrid fokussieren

Beitrag von fliegermichl »

Na wenn du die Zelle mit Fillrect füllst, solltest du schon unterscheiden ob sie selektiert ist oder nicht.
Also vor dem Fillrect Canvas.Brush.Color entsprechend setzen.

z.B.

Code: Alles auswählen

 
procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
 aRect: TRect; aState: TGridDrawState);
begin
 if (gdSelected in aState) then
  StringGrid1.Canvas.Brush.Color := clHighLight else StringGrid1.Canvas.Brush.Color := clWindow;
  StringGrid1.Canvas.FillRect(aRect);
  StringGrid1.Canvas.TextOut(aRect.Left + 3, aRect.Top + 3, 'Text');
end
 

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: Zelle in StringGrid fokussieren

Beitrag von h-elsner »

Sehr guter Hinweis. Danke. Werde ich auch gleich so übernehmen. Ich würde es sogar noch auf die Textfarbe erweitern.

Code: Alles auswählen

 
    if (gdSelected in aState) then begin
      StringGrid1.Canvas.Brush.Color:=clHighLight;              {Keep selection}
      StringGrid1.Canvas.Font.Color:=clHighlightText;
    end else begin
      StringGrid1.Canvas.Brush.Color:=clMyNewColor;           {Overwrite color}
 //     StringGrid1.Canvas.Font.Color:=clDefault;
    end;
    StringGrid1.Canvas.FillRect(aRect);
    StringGrid1.Canvas.TextOut(aRect.Left+3, aRect.Top+3,
                               StringGrid1.Cells[aCol, aRow]){Restore text}
 


Gruß HE

Edit: Fällt mir gerade auf, dass man das Setzen auf clDefault gar nicht braucht. Überhaupt braucht man das ganze Konstrukt nicht, wenn man die Hintergrundfarbe nur ändert, wenn die Zelle nicht selected ist. Probiere ich gleich aus.

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: Zelle in StringGrid fokussieren

Beitrag von h-elsner »

Jupp, geht. So kommt man vom Komplizierten zum Einfachen.

Code: Alles auswählen

 
    if not (gdSelected in aState) then begin
      StringGrid1.Canvas.Brush.Color:=MyNewColor;
      StringGrid1.Canvas.FillRect(aRect);
      StringGrid1.Canvas.TextOut(aRect.Left+3, aRect.Top+3,
                                 StringGrid1.Cells[aCol, aRow]);
    end;
 

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Zelle in StringGrid fokussieren

Beitrag von wp_xyz »

Es geht noch einfacher: Anstatt die Zelle komplett selbst neu auszugeben, solltest du das Event OnPrepareCanvas nehmen. Das wird aufgerufen, kurz bevor die Zelle gezeichnet wird, insbesondere, wenn alle Canvas-Properties schon gesetzt sind. Hier hast du dann die Möglichkeit, diese noch für die gleich folgende Ausgabe zu verändern. Die folgende Ausgabe erfolgt wie bisher, halt nur mit dem geänderten Canvas.

Beispiel:

Code: Alles auswählen

procedure TForm1.StringGrid1PrepareCanvas(sender: TObject; aCol, aRow: Integer;
  aState: TGridDrawState);
var
  grid: TStringGrid;
  ts: TTextStyle;
begin
  grid := Sender as TStringGrid;
 
  // Zeile 2 mit gelbem Hintergrund
  if (ARow = 2) and (AState = []) then
    grid.Canvas.Brush.Color := clYellow;
 
  // Spalte 3 zentriert.
  ts := (grid.Canvas.TextStyle);
  if ACol = 3 then
    ts.Alignment := taCenter;
  grid.Canvas.TextStyle := ts;
end;

Benutzeravatar
gladio
Beiträge: 217
Registriert: Sa 21. Jun 2014, 06:15
OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
CPU-Target: 64Bit
Wohnort: Rügen

Re: Zelle in StringGrid fokussieren

Beitrag von gladio »

habe mich erstmal für diese Variante entschieden:

Code: Alles auswählen

if not (gdSelected in aState) then
brush.color:=StringToColor(RObjStatus.Farbe)
else brush.color:=clHighlight;
 

Ist genau das, was ich brauchte.
Danke an alle Beteiligten.

Techno
Beiträge: 18
Registriert: Mo 14. Okt 2019, 10:24
OS, Lazarus, FPC: Windows 10 (L 2.0.10 FPC 3.2.0)
CPU-Target: 64Bit

Re: [gelöst] Zelle in StringGrid fokussieren

Beitrag von Techno »

Auch mir hat es sehr geholfen, vielen Dank!
Grüße,

Techno

Antworten