Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros temas > Trucos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Los mejores trucos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-07-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.834
Poder: 9
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Vcl/FMX: Resaltar texto parcialmente

Hola a todos

Este truco sirve cuando por ejemplo mostramos datos en un Grid y queremos resaltar parte del texto (color, negrita, etc). Esta muy bueno cuando hacemos una busqueda parcial, y queda resaltado que parte del string es la que coincide con la busqueda.

El efecto buscado seria, si busco Juan que me resalte asi:

Juan
Juan Carlos
Pedro Juan
AlgoJuanOtraCosa

El codigo en realidad es obra de ecfisa, lo interesante es que el algoritmo es aplicable facilmente a casi cualquier clase, porque todo se basa en codigo RTL para manipulacion de strings, y luego el pintado es usando TCanvas. Es cierto que hay algunas pequeñas diferencias entre el manejo de Canvas Vcl y el de FMX

Si yo no he entendido mal, lo que hace Daniel es ir dibujando con el canvas de a "trocitos" el string, dividiendo el mismo en tres partes.

En el codigo que voy a usar de ejemplo, simplemente voy a resaltar usando negrita para la parte que coincide y normal para el resto

El codigo para Vcl lo pueden encontrar en el hilo original

Para FMX, las pruebas las hice con un componente TStringGrid. Es necesario que tengamos TStringGrid.DefaultDrawing a False

Luego simplemente metemos un hook para el evento TStringGrid.OnDrawColumnCell

Solo hay unas cosas mas que se deben notar:
  • SearchString es una propiedad de lectura/funcion que devuelve un string. Vendria a ser el string por el cual estamos buscando
  • IsColumnTextHighlightable es una funcion que como se puede ver, devuelve un Boolean que indica si la columna que recibe el evento debe implementar el pintado por defecto o el pintado custom
  • He renombrado algunas variables del codigo original de ecfisa, ya que a mi me confunde mucho los nombres cortos y simples como a, b, c
  • El procedimiento anidado DrawText esta en la version para FMX porque el metodo TCanvas.FillText es bastante "aburrido", ya que requiere de varios parametros que son siempre los mismos. Lo unico que me interesa variar son el Bounds y el Text. La forma mas purista de resolverlo es con un ayudante de clase (class helper) para TCanvas

Código Delphi [-]
procedure TForm1.OnCreate(Sender: TObject);
begin
  StringGrid1.DefaultDrawing := False;
end;

procedure TForm1.StringGrid1DrawColumnCell(Sender: TObject; const Canvas: TCanvas;
  const Column: TColumn; const [Ref] Bounds: TRectF; const Row: Integer; const [Ref] Value: TValue;
  const State: TGridDrawStates);

  procedure DrawText(Bounds: TRectF; const LeftDelta: Single; const Text: string);
  begin
    Bounds := RectF(LeftDelta, Bounds.Top, Bounds.Right, Bounds.Bottom);
    Canvas.FillText(Bounds, Text, False, 1, [], TTextAlign.Leading);
  end;
var
  Handled: Boolean;
  StringLeft, StringMiddle, StringRight, CellStringValue: string;
  p: Integer;
  LeftBoundDelta: Single;
  FontStyles: TFontStyles;
begin
  Handled := False;
  try
    if not IsColumnTextHighlightable(Column) then
      Exit;

    CellStringValue := Value.AsString;

    if not AnsiStartsText(SearchString, CellStringValue) then
      Exit;

    p := AnsiPos(AnsiUpperCase(SearchString), AnsiUpperCase(CellStringValue));
    if p <> 0 then
    begin
      StringLeft := Copy(CellStringValue, 1, p - 1);
      StringMiddle := Copy(CellStringValue, p, Length(SearchString));
      StringRight := Copy(CellStringValue, p + Length(SearchString), MaxInt);

      Canvas.Font.Assign(StringGrid1.TextSettings.Font);
      Canvas.Fill.Color := TAlphaColorRec.Black;
      FontStyles := StringGrid1.TextSettings.Font.Style;

      LeftBoundDelta := Bounds.Left + 2;
      Canvas.Font.Style := FontStyles;
      DrawText(Bounds, LeftBoundDelta, StringLeft);

      LeftBoundDelta := LeftBoundDelta + Canvas.TextWidth(StringLeft);
      Canvas.Font.Style := [TFontStyle.fsBold];
      DrawText(Bounds, LeftBoundDelta, StringMiddle);

      LeftBoundDelta := LeftBoundDelta + Canvas.TextWidth(StringMiddle);
      Canvas.Font.Style := FontStyles;
      DrawText(Bounds, LeftBoundDelta, StringRight);
      Handled := True;
    end;
  finally
    if not Handled then
      StringGrid1.DefaultDrawColumnCell(Canvas, Column, Bounds, Row, Value, State);
  end;
end;

Efecto conseguido en un TGrid FMX:



Efecto conseguido en un TDBGrid Vcl

Responder Con Cita
  #2  
Antiguo 28-07-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is online now
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 27.685
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Responder Con Cita
  #3  
Antiguo 28-07-2016
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 12.559
Poder: 27
dec Va camino a la famadec Va camino a la fama
Hola,

¡Muchas gracias por compartirlo Agustín!
__________________
David Esperalta
www.davidesperalta.com
Responder Con Cita
  #4  
Antiguo 28-07-2016
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 9.872
Poder: 27
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Agustín.

Muchas gracias por el aporte

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
ClientDatasets, filtros y "LIKE" que filtra parcialmente, como se le da la gana Walterio Providers 2 17-04-2012 16:06:49
Resaltar En Negrita Una Texto De Una Linea De Un Tmemo ingmichel Internet 1 28-11-2009 13:34:53
Como poner en un hint texto parcialmente en negrita JF Sebastian Varios 2 17-01-2007 17:14:07
Locate no buscar parcialmente, por que? URBANO Conexión con bases de datos 13 14-10-2005 21:14:22
resaltar lineas cesarjbf OOP 4 28-09-2003 17:44:10


La franja horaria es GMT +2. Ahora son las 14:01:05.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi