Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-03-2005
Elfoscuro Elfoscuro is offline
Miembro
 
Registrado: Mar 2005
Posts: 59
Poder: 14
Elfoscuro Va por buen camino
ListBox diferente...

Hola. Saludos desde este, mi primer mensaje en el foro...

Vereis, tengo un problema. Necesito hacer un TListBox diferente. Quiero que cuando se meta un carácter concreto en el principio de la cadena de cada item, el resto se muestre de un color u otro. Eso lo tengo solucionado ya, cambiando la property style y cambiando el evento DrawItem. Mi problema es que no se como hacerlo "grabado a fuego" en un componente nuevo. Yo lo he hecho así, pero no funciona:

Código:
unit ZXListBox;
interface
uses
SysUtils, Classes, Controls, StdCtrls, Types, Graphics;
 
type
TZXListBox = class(TListBox)
private
	{ Private declarations }
protected
	{ Protected declarations }
public
	constructor create(AOwner : TComponent); override;
	destructor destroy; override;
	procedure DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
	{ Public declarations }
published
	{ Published declarations }
end;
 
procedure Register;
 
implementation
 
constructor TZXListBox.Create(AOwner : TComponent);
begin
inherited Create(AOwner);
Style:=lbOwnerDrawFixed;
Font.Name:='Courier New';
Font.Size:=8;
end;
 
destructor TZXListBox.Destroy;
begin
inherited destroy;
end;
 
{------------------------------------------------------------}
procedure TZXListBox.DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
Mostrar:String;
 
begin
with (Control as TListBox) do
begin
	if Index>=0 then
		begin
		 if length(Items[Index])>0 then
			 begin
				if Items[index][1]='|' then
					begin
					 Canvas.Font.Color := clBlue;
					 Canvas.Font.Style := [fsItalic,fsBold];
					 Mostrar:=copy(Items[Index],2,length(Items[Index])-1);
					end
				 else
					if Items[index][1]='¬' then
						begin
						 Canvas.Font.Color := clRed;
						 Canvas.Font.Style := [fsBold];
						 Mostrar:=copy(Items[Index],2,length(Items[Index])-1);
						end
					 else
						begin
						 Canvas.Font.Color := clBlack;
						 Canvas.Font.Style := [];
						 Mostrar:=Items[Index];
						end;
			 end
			else
			 begin
				Mostrar:='';
			 end;
		end;
	Canvas.TextRect(Rect, Rect.Left, Rect.Top, Mostrar);
end;
end;
 
procedure Register;
begin
RegisterComponents('XP', [TZXListBox]);
end;
end.
El caso es que se comporta como un TListBox corriente y moliente. Uso Delphi 7. No soy demasiado experto en la creación de componentes, e imagino que lo que he intentado es una faltada, pero es que no se me ocurre nada. Delphi se queja cuando compilo:


[Warning] ZXListBox.pas(17): Method 'DrawItem' hides virtual method of base type 'TCustomListBox'


¿Es posible hacer esto? Yo pienso que si, pero como os he comentado, no soy muy experto en el tema de componentes. Estoy empezando ahora, pero se me escapan ciertas cosas...


Saludos y gracias por adelantado a los que contesten ;-)

El elfo oscuro

Última edición por Elfoscuro fecha: 25-03-2005 a las 12:50:18.
Responder Con Cita
  #2  
Antiguo 25-03-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: May 2003
Ubicación: Ciudad de México
Posts: 20.172
Poder: 10
roman Tiene un aura espectacularroman Tiene un aura espectacular
Cita:
Empezado por Elfoscuro
[Warning] ZXListBox.pas(17): Method 'DrawItem' hides virtual method of base type 'TCustomListBox'
Al igual que con el constructor debes agregar la directiva override a la declaración del método.

// Saludos
Responder Con Cita
  #3  
Antiguo 25-03-2005
Elfoscuro Elfoscuro is offline
Miembro
 
Registrado: Mar 2005
Posts: 59
Poder: 14
Elfoscuro Va por buen camino
Muchas gracias. Ya lo había hecho antes, pero es que me petaba diciendome que la declaración no coincidía con la anterior. Con 'la anterior' se refería a la declaración original del componente. Después de investigar un poco he visto que la declaración tenía una variable Control que sobraba. Una vez la he quitado, he overrideado la procedure y le he eliminado el 'with (Control as TListbox)' del principio ya funciona 100%.

Salludos del elfo.
Responder Con Cita
  #4  
Antiguo 26-03-2005
cuburu cuburu is offline
Miembro
 
Registrado: Mar 2005
Posts: 63
Poder: 14
cuburu Va por buen camino
Question no entiendo que es lo que quieres

si tu problema es que quieres que cada fila te aparezca de un color diferente el texto lo que necesitas es colocar la propiedad Style a lbOwnerDrawFixed y en el evento OnDrawItem poner este codigo

with (Control as TListBox) do
begin
if Odd(Index) then
Canvas.Font.Color := clBlue
else
Canvas.Font.Color := clGreen;

Canvas.Rectangle(Rect);
Canvas.TextOut(Rect.Left, Rect.Top, Items[Index]);
end;
Responder Con Cita
  #5  
Antiguo 26-03-2005
Elfoscuro Elfoscuro is offline
Miembro
 
Registrado: Mar 2005
Posts: 59
Poder: 14
Elfoscuro Va por buen camino
Si, básicamente es lo que quiero. Pero como no quiero tener que acordarme del código en el onDrawItem, decidí hacerlo en un componente derivado de un TListBox, pero que ya tuviera el código insertado. Así no me tengo que preocupar más del asunto. En lugar del TBListBox original uso el mio, que ya hace todo el royo.

En principio remodelar el TListBox es para hacerlo más específico. De momento solo lo voy a usar en una aplicación que estoy haciendo, pero en un futuro pretendo usarlo en otras relacionadas.

Gracias por tu código. Si te fijas, el mio es muy similar. El problema es que si hago un override del DrawItem, no puedo usar 'Control', ya que no está en la declaración original de la procedure. Aparece cuando haces doble click sobre "onDrawItem". De todas formas, no importa, ya que al ser un componente, puedo acceder directamente al canvas sin hacer 'with'.

Y por cierto, un error que me da otro componente al leer desde un fichero:

I/O error 6

He buscado en la ayuda y no lo encuentro. He encontrado el 106... ¿es el mismo? El 6 dice que no estoy leyendo bien (por ejemplo leer un word de un file of byte), pero yo creo que si que leo como toca. Tengo que revisar el código pero ¿se os ocurre porque sale este error normalmente?

Gracias

Saludos del elfo
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


La franja horaria es GMT +2. Ahora son las 21:34:37.


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