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
STRINGGRID: gefundene Zeile farblich markieren
Re: STRINGGRID: gefundene Zeile farblich markieren
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:
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.
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;
Zuletzt geändert von wp_xyz am Sa 28. Aug 2021, 11:57, insgesamt 2-mal geändert.
- 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
Hi!
In den Options:
goRowSelect auf true
goRangeSelect auf true
Außerdem:
ExtendedSelect auf true
Und dann
Oder welche Reihe Du möchtest.
Winni
In den Options:
goRowSelect auf true
goRangeSelect auf true
Außerdem:
ExtendedSelect auf true
Und dann
Code: Alles auswählen
StringGrid1.Row := 4;
Winni
Re: STRINGGRID: gefundene Zeile farblich markieren
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
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
Re: STRINGGRID: gefundene Zeile farblich markieren
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
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
Re: STRINGGRID: gefundene Zeile farblich markieren
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...