Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ListBox diferente... (https://www.clubdelphi.com/foros/showthread.php?t=19770)

Elfoscuro 25-03-2005 12:47:01

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

roman 25-03-2005 16:15:10

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

Elfoscuro 25-03-2005 22:59:24

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.

cuburu 26-03-2005 07:39:17

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;

Elfoscuro 26-03-2005 09:38:14

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


La franja horaria es GMT +2. Ahora son las 00:01:51.

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