Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-01-2017
LuKa$ LuKa$ is offline
Registrado
NULL
 
Registrado: nov 2016
Posts: 4
Poder: 0
LuKa$ Va por buen camino
Pintar fila de Listview

Hola,en un boton tengo el siguiente código :

Código Delphi [-]
  
procedure TForm1.Button2Click(Sender: TObject);
for i := 0 to ListView1.Items.Count - 1 do
  begin
    if ListView1.Items[i].Subitems[0] = Edit1.Text then // Comparo si son iguales 
    begin
      ListView1.color =clRed; ????      // --> Pinto la linea del listview de la fila encontrada    
    end;
  end;
end;

mi duda es como puedo pintar la fila encontrada.

Gracias.
Responder Con Cita
  #2  
Antiguo 18-01-2017
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Voy a asumir bastantes cosas ya que no das muchos detalles

El codigo que te propongo funciona para el ListView de la Vcl. No he cambiado ninguna propiedad de las que vienen por defecto al soltar el componente TListView en el form. Todas las cambio en el evento FormCreate del Form para que quede bien claro

Para que te funcione el codigo necesitas un TListView llamado ListView1 y un TEdit llamado Edit1. El Edit le indica al ListView que debe "repintarse" cuando se presiona ENTER, obviamente con el foco sobre el Edit. De eso se encarga el evento OnKeyDown del TEdit

Cuando el ListView recibe la orden de pintarse, el evento CustomDrawItem se dispara y te permite realizar "ajustes" sobre el item que actualmente se esta pintando. Podes consultar las propiedades del Item que recibio el evento en los argumentos del evento (el parametro Item). Tambien tenes un parametro State que indica en que "fase" del pintado esta el TListView actualmente. Esto lo explica mejor la documentacion que yo

Es un evento un poco "raro" porque en este el parametro Sender no es TObject como siempre, es un TCustomListView, que nos viene muy bien porque necesitamos el Canvas para poder realizar el pintado personalizado

Hay muchos mas eventos de pintado. Algunos requieren que actives la propiedad OwnerDraw del TListView para que se disparen. Esto implica que uno mismo debe hacerse cargo del pintado completo del Listview, en todos sus posibles estados. Es un trabajo algo pesado pero tenes flexibilidad absoluta

Sin mas, el codigo

Código Delphi [-]
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if Key = VK_RETURN then
    ListView1.Repaint;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
  Col: TListColumn;
  Item: TListItem;
begin
  // inicializo el TListView con 2 columnas y 10 items
  ListView1.ViewStyle := TViewStyle.vsReport;
  for I := 1 to 2 do
  begin
    Col := ListView1.Columns.Add;
    Col.Caption := 'Columna ' + I.ToString;
    Col.Width := 150;
  end;

  for I := 1 to 10 do
  begin
    Item := ListView1.Items.Add;
    Item.Caption := 'Item ' + I.ToString;
    Item.SubItems.Add('Item ' + I.ToString);
  end;
end;

procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState;
  var DefaultDraw: Boolean);
begin
  // encontrado
  if Edit1.Text = Item.Caption then
    Sender.Canvas.Brush.Color := clRed;
end;
Responder Con Cita
  #3  
Antiguo 19-01-2017
LuKa$ LuKa$ is offline
Registrado
NULL
 
Registrado: nov 2016
Posts: 4
Poder: 0
LuKa$ Va por buen camino
Hola,gracias tu ejemplo me ayudado pinta la fila ingresado texto en Edit1 pero cuando ingreso otro texto la fila que estaba pintada pierde el color.lo que necesito es a medida que voy ingresando (va comparando con la fila con la caja de texto) quede pintada la filas encontradas.como podria hacer esa parte.gracias.


imagen gif:
gifyu.com/images/GIF78a8c.gif

Código Delphi [-]
var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = vk_return then
    ListView1.Repaint;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: integer;
  col: tlistcolumn;
  Item: TListItem;
begin
  ListView1.ViewStyle := TViewStyle.vsReport;
  for i := 1 to 2 do
  begin
    col := ListView1.Columns.Add;
    col.Caption := 'column' + i.ToString;
    col.Width := 150;
  end;
  for i := 1 to 10 do
  begin
    Item := ListView1.items.Add;
    Item.Caption := 'n' + i.ToString;
    Item.SubItems.Add('item' + i.ToString);
  end;
end;

procedure TForm1.ListView1AdvancedCustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage;
  var DefaultDraw: Boolean);
begin

  if Edit1.Text = Item.SubItems[0] then
    Sender.Canvas.Brush.Color := clred;
end;
Responder Con Cita
  #4  
Antiguo 19-01-2017
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Tendrias que ir almacenando en alguna otra estructura las filas que fuiste encontrando. En el evento del pintado deberias pintar todas las filas que esten dentro de esa estructura

En pseudocodigo:

Código Delphi [-]
procedure TForm1.ListView1AdvancedCustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage;
  var DefaultDraw: Boolean);
begin
  if ItemEnEstructuraAdicional(Item) then
    PintarItemConUnColor;
end;

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = VK_RETURN then
  begin
    AgregarItemEnEstructuraAdicional(Edit1.Text);
    ListView1.Repaint;
  end;
end;

Como estructura adicional podrias usar una lista, un diccionario, un arbol binario.. el que mas comodo te resulte. La idea es la misma, en esa estructura adicional tenes que poder asociar un elemento del TListView (por ejemplo, el Indice) con el texto que vas ingresando en el Edit
Responder Con Cita
  #5  
Antiguo 20-01-2017
LuKa$ LuKa$ is offline
Registrado
NULL
 
Registrado: nov 2016
Posts: 4
Poder: 0
LuKa$ Va por buen camino
gracias,implementaré como lo mencionas.
Responder Con Cita
Respuesta



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
Pintar filas de un Listview Coco_jac Varios 4 14-07-2006 15:46:18
Como pintar la fila de un DBGrid Gustavo Gowdak OOP 2 04-05-2006 21:34:04
Pintar toda una fila de un DBGrid Luciano M. Varios 4 02-05-2006 22:30:24
Pintar Fila del DBGrid Palmiro Conexión con bases de datos 2 05-04-2006 23:25:51
Pintar Fila por medio en ub DBGrid josem OOP 3 01-01-2005 20:54:52


La franja horaria es GMT +2. Ahora son las 09:23:33.


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