STRINGGRID: gefundene Zeile farblich markieren

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Antworten
Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

STRINGGRID: gefundene Zeile farblich markieren

Beitrag von Lorca »

Hallo zusammen,

für meine Stringgrid, mit mehreren hundert Einträgen, habe ich eine Suchfunktion implementiert.
Die Zeile des gefundenen Werts wird nach dem auffinden auf SGRID.TOPROW gestellt. Das Funktioniert super.
Die Zeile ist sofort im sichtbaren Bereich. Leider nicht farblich markiert.
Nun möchte ich aber auch die Zeile farblich markieren (also RowSelect ), damit der gefundene Eintrag sofort deutlich erkennbar ist.

In den GRID Optionen habe ich den Wert goRowSelect auf True gesetzt.
Diese Option scheint jedoch nur zu funzen wenn der Anwender auf eine Zeile klickt. Dies ist in der Suchfunktion aber nicht machbar.
Wie kann ich nun die Zeile vom Programm her selektieren?

Kann jemand von euch weiterhelfen?

Viele Grüße
Lorca

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

Re: STRINGGRID: gefundene Zeile farblich markieren

Beitrag von wp_xyz »

Deklariere dir ein dynamisches Array FoundRows, in dem deine Suchroutine den Zeilenindex jeder gefundenen Zeile einträgt. Das Array bleibt leer (FoundRows = nil), wenn nichts gefunden wird.

Dann schreibe einen Handler für das OnPrepareCanvas-Event des StringGrid. Das wird aufgerufen, unmittelbar bevor eine Zelle ausgegeben wird. Frage dort ab, ob die als Parameter übergebene Zeile in dem Array FoundRows enthalten ist und setze in diesem Fall den Brush des StringGrid.Canvas auf die gewünschte Farbe.

Statt eines dynamischen Array könntet du für FoundRows auch eine TIntegerList aus Unit IntegerList des Package LazUtils verwenden, das macht das Einfügen neuer Einträge etwas leichter (List.Add(zeilennummer)). Und du kannst die Liste sortieren und damit schneller prüfen, ob eine gesuchte Zeile in FoundRows vorhanden ist.

Als ungetesteter Code:

Code: Alles auswählen

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid
   private
     FFoundRows: TIntegerList;
   public
     destructor Destroy; override;
     procedure SucheImGrid(SuchText: String; SuchSpalte: Integer);
   end;
   
destructor TForm1.Destroy;
begin
  FFoundRows.Free;
  inherited;
end;
   
procedure TForm1.SucheImGrid(SuchText: String; SuchSpalte: Integer);
var
  r: Integer;
begin
  if FFoundRows = nil then
    FFoundRows := TIntegerList.Create
  else    
    FFoundRows.Clear;
  for r := StringGrid1.FixedRows to StringGrid1.RowCount-1 do
    if StringGrid1.Rows[SuchSpalte, r] = Suchtext then
      FFoundRows.Add(r);

    StringGrid1.Sort;
    if FFoundRows.Count > 0 then
      StringGrid1.TopRow := FFoundRows[0];
    StringGrid1.Invalidate;
end;
   
procedure TForm1.StringGrid1PrepareCanvas(sender: TObject; aCol, aRow: Integer;
  aState: TGridDrawState);
begin
  if (FFoundRows <> nil) and (FFoundRows.IndexOf(ARow) > -1) then
    StringGrid1.Canvas.Brush.Color := clYellow;
end; 
Gegenüber der RowSelect-Methode hast du den Vorteil, dass alle gefundenen Zeilen markiert sind und dass du weiterhin unabhängig von den Fundstellen Zellen im Grid selektieren kannst, um z.B. deren Inhalt in die Zwischenablage zu kopieren.
Zuletzt geändert von wp_xyz am Sa 28. Aug 2021, 11:57, insgesamt 2-mal geändert.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: STRINGGRID: gefundene Zeile farblich markieren

Beitrag von Winni »

Hi!

In den Options:

goRowSelect auf true
goRangeSelect auf true

Außerdem:
ExtendedSelect auf true

Und dann

Code: Alles auswählen

StringGrid1.Row := 4; 
Oder welche Reihe Du möchtest.

Winni

Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

Re: STRINGGRID: gefundene Zeile farblich markieren

Beitrag von Lorca »

Hallo winni, Hallo wp_xyz

danke schön für eure sehr schnelle Hilfe. Ich werde es gleich probieren.
SRY, ich habe vor dem erneuten Editieren, den Kollegen wp_xyz übersehen.
Bitte um Entschuldigung :)

Viele Grüße
Lorca

Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

Re: STRINGGRID: gefundene Zeile farblich markieren

Beitrag von Lorca »

Hallo wp_xyz,

habe es gerade mit Deinem Coding ausprobiert und es funzt wunderbar :)
Selbst unabhängig von den GRID-Options.
Also goRowselect, ...... Das Kernstück liegt wohl in PrepareCanvas



danke dafür :)

Gruß
Lorca

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

Re: STRINGGRID: gefundene Zeile farblich markieren

Beitrag von wp_xyz »

Lorca hat geschrieben:
Sa 28. Aug 2021, 13:54
Das Kernstück liegt wohl in PrepareCanvas
Ja. Delphi hat dieses Event nicht, und so ist es auch bei vielen Lazarus-Programmierern unbekannt. Vielleicht hätte man es besser "OnBeforePaint" nennen sollen, dann hätte man es wohl besser einordnen können. Aber so ist es nicht mehr zu ändern...

Antworten