PDA

Ver la Versión Completa : Runtime error relacionado con Canvas


modulay
02-10-2007, 14:28:53
Ando usando un componente visual que emula un lcd alfanumérico,en concreto se llama rasterlabel

http://www.lohninger.com/examples_part3.html

En mi aplicación,actualizo el texto que dicho componente muestra de una forma bastante intensiva,coincidiendo con eventos de ratón producidos sobre otros controles del form.El tema es que todo marcha bien,pero muy de vez en cuando me tira el siguiente error:

http://img250.imageshack.us/my.php?image=canvasab6.jpg

La rutina encargada de actualizar el contenido del componente (del cual hay 4 instancias: clcd1linea1,clcd1linea2,clcd2linea1,clcd2linea2) es esta:

procedure TForm1.actualizaclcd(const linea,pos,dimension: integer; const cad: string);

var
cadlcd1,cadlcd2,cadaux : string;
i : integer;
begin

if linea = 1 then begin
cadlcd1 := Copy(clcd1linea1.text, 0, length(clcd1linea1.Text));
cadlcd2 := Copy(clcd2linea1.text, 0, length(clcd2linea1.Text));
end
else begin
cadlcd1 := Copy(clcd1linea2.text, 0, length(clcd1linea2.Text));
cadlcd2 := Copy(clcd2linea2.text, 0, length(clcd2linea2.Text));
end;

if pos < 28 then begin
if pos + dimension <= 28 then begin // SOLO LCD 1
cadlcd1 := stuffstring(cadlcd1,pos + 1,dimension,cad);
end
else begin // AMBOS LCD
cadaux := copy(cad,28 - pos + 1,dimension - (28 - pos));
cadlcd1 := stuffstring(cadlcd1,pos + 1,28 - pos,cad);
cadlcd2 := stuffstring(cadlcd2,1,dimension - (28 - pos),cadaux);
end;
end
else begin // SOLO LCD 2
cadaux := copy(cad,0,dimension);
cadlcd2 := stuffstring(cadlcd2,pos - 28 + 1,dimension,cadaux);
end;
fcriticalsectionout.Acquire;
try
if linea = 1 then begin
clcd1linea1.Text := cadlcd1;
clcd2linea1.Text := cadlcd2;
end
else begin
clcd1linea2.Text := cadlcd1;
clcd2linea2.Text := cadlcd2; // AQUI ES DONDE ME MARCA EL ERROR
end;
finally
//
end;
fcriticalsectionout.leave;

end;

La parte del semáforo y el "try" la añadí para probar a ver si se solucionaba el tema,pero sigue igual,tanto con esa parte como sin ella.
Si elimino la sentencia donde tira el error,lo tira en la anterior,o sea,el mismo caso pero con otra instancia del mismo componente.
¿A qué puede deberse esto? ¿qué pruebas puedo ir haciendo para intentar acotar el fallo?
El hecho por el que uso este componente es porque necesito visualizar cadenas de texto cuyos caracteres ocupen todos el mismo ancho en pixeles.Si alguien sabe de algún Tlabel, Tedit o alguno similar con esta característica me podría resultar más rentable que buscarle solución directa al problema del rasterlabel.
Gracias mil.
Saludos.

xEsk
03-10-2007, 01:10:31
Quizás sea chorra lo que te digo, pero si lo que quieres es que cada carácter ocupe el mismo espacio, no te seria mas fácil usar una fuente que tenga estas propiedades, la mayoría de fuentes para programar (cómo son la Courer New, etc...), tienen esta característica.

Aqui (http://www.dafont.com) te pongo un sitio de fuentes, y hay fuentes que emulan el "LCD (http://www.dafont.com/theme.php?cat=302&page=1)".

Saludos.

modulay
03-10-2007, 02:19:05
Pues de chorra nada tío,me has dado la solución al problema,y más sencillo imposible.Ni por un momento sospeché que hubiera fuentes que de por sí contaran con esa cualidad.
Probaré con TLabels y echaré un ojo a esas fuentes del link a ver si encuentro alguna molona :)
Gracias man.