[gelöst] Zelle in StringGrid fokussieren

Rund um die LCL und andere Komponenten

[gelöst] Zelle in StringGrid fokussieren

Beitragvon gladio » 4. Mär 2019, 20:28 [gelöst] Zelle in StringGrid fokussieren

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 5. Mär 2019, 20:25, insgesamt 1-mal geändert.
gladio
 
Beiträge: 104
Registriert: 21. Jun 2014, 06:15
Wohnort: Insel Rügen
OS, Lazarus, FPC: Win10-32/64 - letzte Lazarus Standard-Edition | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon fliegermichl » 5. Mär 2019, 09:30 Re: Zelle in StringGrid fokussieren

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
 
fliegermichl
Lazarusforum e. V.
 
Beiträge: 367
Registriert: 9. Jun 2011, 09:42

Beitragvon h-elsner » 5. Mär 2019, 10:59 Re: Zelle in StringGrid fokussieren

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.
h-elsner
 
Beiträge: 63
Registriert: 24. Jul 2012, 15:42
Wohnort: Illertissen
OS, Lazarus, FPC: LINUX Mint18.3, Win10, Lazarus 1.8, FPC3.0.4 | 
CPU-Target: 64Bit
Nach oben

Beitragvon h-elsner » 5. Mär 2019, 11:12 Re: Zelle in StringGrid fokussieren

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;
 
h-elsner
 
Beiträge: 63
Registriert: 24. Jul 2012, 15:42
Wohnort: Illertissen
OS, Lazarus, FPC: LINUX Mint18.3, Win10, Lazarus 1.8, FPC3.0.4 | 
CPU-Target: 64Bit
Nach oben

Beitragvon wp_xyz » 5. Mär 2019, 12:52 Re: Zelle in StringGrid fokussieren

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;
wp_xyz
 
Beiträge: 2945
Registriert: 8. Apr 2011, 09:01

Beitragvon gladio » 5. Mär 2019, 20:25 Re: Zelle in StringGrid fokussieren

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.
gladio
 
Beiträge: 104
Registriert: 21. Jun 2014, 06:15
Wohnort: Insel Rügen
OS, Lazarus, FPC: Win10-32/64 - letzte Lazarus Standard-Edition | 
CPU-Target: 32/64Bit
Nach oben

• Themenende •

Zurück zu Komponenten und Packages



Wer ist online?

Mitglieder in diesem Forum: sstvmaster und 6 Gäste

porpoises-institution
accuracy-worried