Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Runtime error relacionado con Canvas (https://www.clubdelphi.com/foros/showthread.php?t=48701)

modulay 02-10-2007 14:28:53

Runtime error relacionado con Canvas
 
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:

Código Delphi [-]
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 te pongo un sitio de fuentes, y hay fuentes que emulan el "LCD".

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.


La franja horaria es GMT +2. Ahora son las 09:02:59.

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