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