Есть ли способ выполнить текстовый поиск в string grid
с помощью диалогового окна поиска? Мне нужно найти текст и выделить его фон, как обычно, когда текст найден.
Спасибо!
Есть ли способ выполнить текстовый поиск в string grid
с помощью диалогового окна поиска? Мне нужно найти текст и выделить его фон, как обычно, когда текст найден.
Спасибо!
Как это:
procedure TForm1.FormClick(Sender: TObject);
begin
FindDialog1.Execute(Handle)
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FindDialog1.Options := [frDown, frHideWholeWord, frHideUpDown];
end;
procedure TForm1.FindDialog1Find(Sender: TObject);
var
CurX, CurY, GridWidth, GridHeight: integer;
X, Y: integer;
TargetText: string;
CellText: string;
i: integer;
GridRect: TGridRect;
begin
CurX := StringGrid1.Selection.Left + 1;
CurY := StringGrid1.Selection.Top;
GridWidth := StringGrid1.ColCount;
GridHeight := StringGrid1.RowCount;
Y := CurY;
X := CurX;
if frMatchCase in FindDialog1.Options then
TargetText := FindDialog1.FindText
else
TargetText := AnsiLowerCase(FindDialog1.FindText);
while Y < GridHeight do
begin
while X < GridWidth do
begin
if frMatchCase in FindDialog1.Options then
CellText := StringGrid1.Cells[X, Y]
else
CellText := AnsiLowerCase(StringGrid1.Cells[X, Y]);
i := Pos(TargetText, CellText) ;
if i > 0 then
begin
GridRect.Left := X;
GridRect.Right := X;
GridRect.Top := Y;
GridRect.Bottom := Y;
StringGrid1.Selection := GridRect;
Exit;
end;
inc(X);
end;
inc(Y);
X := StringGrid1.FixedCols;
end;
end;
Этот код можно легко расширить для поддержки поиска в обратном направлении («вверх»), и вы также можете реализовать функцию «совпадение всего слова».
Возможно, вы хотите выделить только соответствующий текст, а не всю ячейку? Тогда сделайте
if i > 0 then
begin
GridRect.Left := X;
GridRect.Right := X;
GridRect.Top := Y;
GridRect.Bottom := Y;
StringGrid1.Selection := GridRect;
GetParentForm(StringGrid1).SetFocus;
StringGrid1.SetFocus;
StringGrid1.EditorMode := true;
TCustomEdit(StringGrid1.Components[0]).SelStart := i - 1;
TCustomEdit(StringGrid1.Components[0]).SelLength := length(TargetText);
Exit;
end;
вместо. Но это отнимет фокус у диалогового окна поиска, и поэтому пользователь не сможет нажать клавишу «Return», чтобы выбрать следующее совпадение, что может раздражать.
goto
в коде. В производственном коде, где вы много перебирали сетки, вы вполне можете написать несколько перечислителей, которые сглаживают сетку, чтобы вы могли пройти по ней с помощью цикла for in
.
- person David Heffernan; 10.08.2011
TEdit
без рамки) и располагается над ячейкой. Поскольку этот элемент управления редактором является дочерним элементом сетки строк, а также единственным дочерним элементом (по крайней мере, первым), вы можете получить к нему доступ через массив Components
.
- person Andreas Rejbrand; 10.08.2011
goEditing in Options
, и редактор должен быть создан. (Это автоматически, так как мой код выше делает EditorMode := true
.) Если вы не хотите, чтобы ячейки редактировались, вам нужно будет выполнить пользовательское рисование, чтобы выбрать (выделить) только искомый текст, а не всю ячейку. .
- person Andreas Rejbrand; 10.08.2011
Exit;
вместо goto TheEnd;
?
- person nurettin; 29.06.2018
goto
в то время, когда у меня был код после метки. Но потом я удалил этот код. Я обновлю ответ.
- person Andreas Rejbrand; 29.06.2018