Hola...
He estado jugueteando con los TListBox y he intentado hacer una cosa, solo una, y me han salido un montón de cosas indeseadas, y me está volviendo loco. Joer, no puede ser que con tan poco código falle tanto... Esto parece el RMCobol87 ;-)
Bueno, empiezo:
TListBox, nombre BASIC_List, Fuente Arial, Style=lbOwnerDrawFixed (he probado también con el variable, pero como no entiendo la diferencia entre ambos, y el resultado es el mismo, como que he pasado de él y lo he dejado así). El código asociado es el siguiente:
Código:
procedure TForm1.BASIC_ListDrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
Str,Str2:string;
f:byte;
ARect:TRect;
Ancho_Letra,Ancho_de_Antes:integer;
begin
f:=0;
Str:=BASIC_List.Items[Index];
//BASIC_List.Canvas.TextRect(Rect, 0, 0, '');
while f<length (Str) do
begin
if (Str[f]<#32) or (Str[f] in [#144..#164]) then
begin
case ord(Str[f]) of
144..164:begin
Ancho_Letra:=BASIC_List.Canvas.TextWidth(Str[f]);
Str2:=copy(Str,0,f);
Ancho_de_Antes:=BASIC_List.Canvas.TextWidth(Str2);
BASIC_List.Canvas.Font.Style:=[fsUnderline,fsItalic];
ARect:=Rect;
ARect.Left:=ARect.Left+Ancho_de_Antes+1;
ARect.Right:=ARect.Right+Ancho_de_Antes+Ancho_Letra+1;
BASIC_List.Canvas.TextRect(aRect, ARect.Left, aRect.Top,
chr(ord(Str[f])-79));
end;
else
begin
//De momento nada
end;
end;
inc (f);
end
else
begin
Ancho_Letra:=BASIC_List.Canvas.TextWidth(Str[f]);
Str2:=copy(Str,0,f);
Ancho_de_Antes:=BASIC_List.Canvas.TextWidth(Str2);
BASIC_List.Canvas.Font.Style:=[];
ARect:=Rect;
ARect.Left:=ARect.Left+Ancho_de_Antes+1;
ARect.Right:=ARect.Right+Ancho_de_Antes+Ancho_Letra+1;
BASIC_List.Canvas.TextRect(aRect, ARect.Left, aRect.Top, Str[f]);
inc(f);
end;
end;
end;
El código en si es una basura, pero es que estoy empezando con el bloque y está todo dejado a saco (demasiado código redundante y demás). El objetivo es el siguiente: con la cadena que haya, hace un bucle letra a letra, y va pintando el caracter que toque diferenciando si es menor que #32 o está en el margen que le pongo. Si está en ese margen el caracter debe salir subrayado (el margen es A..U, pero sumando 79). Si no lo es, debe salir normal. Si es menor de 32, deberá hacer otras cosas, que de momento no he implementado.
Pues bien, el resultado es el que hay en la figura1 (adjunta, espero). Me sale un merder que no veas. Si le pongo una fuente de tamaño fijo (Curier New), sale como la figura2 (adjunta también, espero). Sale ¿perfecto? Pues no. La línea larga de CBBBBBBBBBBBBB... sale en cursiva, pero no en subrayado. Es decir, que en Arial se subraya, pero en Curier no... y las dos fuentes funciona el subrayado (lo he hecho en otros códigos y ha funcionado bien). Lo del poner la cursiva era para ver si es que no me estaba cogiendo ningún estilo, pero vi que no era así...
En los dos casos, además, el texto sale desplazado un caracter a la derecha (debería salir pegado al borde como en todos los TListBox), lo que hace que al mover le ratón, con el botón izquierdo pulsado, arriba y abajo, salga una especie de caja de puntitos en el primer caracter, que es un resto de la barra oscura que sale al pulsar sobre una linea, barra que podeis ver como sale...
Yo flipo. Joer, que el código es bastante sencillo. ¿Cómo puedo cometer tantos errores? Y eso que aun no he empezado a cambiar el color del fondo...
NOTA: No me deja subir JPGs de más de ¿1k? al foro. Os describo un poco el resultado: la figura 1 salen las letras, pero solo unos dos o tres pixels. A continuación y montada sobre la anterior, la letra siguiente. La única letra que se ve entera es la última de la línea. Las demás salen cortadas...
Y en la segunda figura sale bien, pero como digo más arriba lo que debería salir subrayado no sale (sale solo en cursiva), y al principio de la línea sale un resto en forma de C, pero cuadrada, que es un resto de la barra de selección.
De todas formas, si no lo entendeis, decidme donde puedo poner las dos imágenes (46k y 67k).
Saludos del elfo al que le crecen los enanos...
