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.
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.