marser
Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору vavavol Цитата: Не подскажете, как программно выделить часть значения в ячейке, как при IncSearch. | Нужно обработать событие OnCustomDrawCell. Код: procedure TForm1.cxGrid1CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); begin HighlightTextUseCustomDrawCell(VarToStr('Текст, который нужно выделить', Sender, ACanvas, AViewInfo, ADone); end; procedure HighlightTextUseCustomDrawCell(AText: string; Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); var R: TRect; H: Integer; brushColor, fontColor: TColor; procedure InitRect(var ARect: TRect; const l, w: Integer); begin ARect.Left := l; ARect.Top := R.Top + 2; ARect.Right := ARect.Left + w; ARect.Bottom := ARect.Top + H; end; procedure CanvasInitDefault; begin // ACanvas.Font.Style := []; ACanvas.Font.Color := fontColor; ACanvas.Brush.Color := brushColor; end; procedure CanvasInitSelection; begin // ACanvas.Font.Style := [fsBold]; ACanvas.Font.Color := Sender.LookAndFeelPainter.DefaultSelectionTextColor; ACanvas.Brush.Color := Sender.LookAndFeelPainter.DefaultSelectionColor; end; var rt: TRect; P, lT, lSearch, wSearch, wS: Integer; T, sSearch, S: string; begin R := AViewInfo.Bounds; T := AViewInfo.Text; sSearch := AText; P := AnsiPos(AnsiUpperCase(sSearch), AnsiUpperCase(T)); if P < 1 then Exit; ADone := True; fontColor := ACanvas.Font.Color; brushColor := ACanvas.Brush.Color; ACanvas.FillRect(R); H := ACanvas.TextHeight(T); lT := Length(T); lSearch := Length(sSearch); sSearch := Copy(T, P, lSearch); CanvasInitSelection; wSearch := ACanvas.TextWidth(sSearch); if P = 1 then begin if lT = lSearch then ACanvas.TextOut(R.Left + 2, R.Top + 2, T) else begin InitRect(rt, R.Left + 2, wSearch); ACanvas.Canvas.TextRect(rt, rt.Left, rt.Top, sSearch); S := Copy(T, lSearch + 1, lT); CanvasInitDefault; wS := ACanvas.TextWidth(S); InitRect(rt, rt.Right, wS); ACanvas.Canvas.TextRect(rt, rt.Left, rt.Top, S); end; end else begin CanvasInitDefault; S := Copy(T, 1, P - 1); ACanvas.TextOut(R.Left + 2, R.Top + 2, S); wS := ACanvas.TextWidth(S); CanvasInitSelection; InitRect(rt, R.Left + 2 + wS, wSearch); ACanvas.Canvas.TextRect(rt, rt.Left, rt.Top, sSearch); if P + lSearch - 1 < lT then begin S := Copy(T, P + lSearch, lT); CanvasInitDefault; wS := ACanvas.TextWidth(S); InitRect(rt, rt.Right, wS); ACanvas.Canvas.TextRect(rt, rt.Left, rt.Top, S); end; end; end; | Добавлено: Только в новых версиях это не актуально. Есть же FindPanel. | Всего записей: 398 | Зарегистр. 29-03-2007 | Отправлено: 11:15 21-04-2016 | Исправлено: marser, 14:36 21-04-2016 |
|