Mensaje    Asunto: ayuda con TextWidth del canvas Responder citando

O me estoy volviendo loco, o ya lo estoy, pero este código tiene un error que no pillo.

Tengo que imprimir desde win unos recibos desde un programa msdos. La configuración debe ser la que controla el msdos.
He pensado en averiguar que tamaño de letra cabe en una linea impresa con un tipo de letra no proporcional.
El problema esta en que no mide bien los pixeles que ocupa las letras, puesto que me salen menos de las que debería.

el código es:
Código:
//tamaño en puntos a 300ppp
ancho=Printer()->PageWidth;
largo=Printer()->PageHeight;

//**** calculos para averiguar lineas por pulgada
// A4 21cm x 29.7cm
//   8.2pul x 11.7pul
//     6 lineas x pul= 70 lineas
// recibo 24 lineas-> 4 pul -> 10,16cm

linea=largo/(11.7*6); // cuanto mide de alto una linea

// cargar grafico para pruebas
Graphics::TBitmap *proba = new Graphics::TBitmap();
proba->Height=largo;
proba->Width=ancho;

// abrir fichero msdos con configuracion recibo 
  sprintf(string,"%ssreci.gen",origen.c_str());
  fp=fopen(string,"r+b");
  fread(&string,42,1,fp);
  fread(&situ,sizeof(situ),1,fp);
  fread(&manual,sizeof(manual),1,fp);
  fclose(fp);
  finali=80; // tipo standar 10cp
  if(situ[30][1]==1) finali=96; // tipo 12cp
  if(situ[30][1]==2) finali=137; // tipo comprimida 17cp

// recortar el grafics a las lineas
proba->Height=(situ[20][0]*linea);

proba->LoadFromFile("recibo.bmp"); // recibo escaneado a 300ppp

//probado con varias fuentes no proporcinales
proba->Canvas->Font->Name=fuentes->"terminal";
//cargo en temp los caracteres a imprimir por linea
setmem(&temp,sizeof(temp),'M');
temp[finali]=0;

// ajuste de tipo de letra: NO VA BIEN
for(x=1;;x++){
        proba->Canvas->Font->Size=x;
        fuente=proba->Canvas->TextWidth(temp);
        if(fuente>(ancho-10)){x--; break;}
        }
// para ver donde salen las 'Ms'
temp[60]='0';temp[61]='1';temp[62]='2'; temp[63]='3';temp[64]='4';temp[65]='5';
proba->Canvas->TextOutA(0,0,temp);

// ajustar la Image en pantalla escalada. la original tiene 737x321
Image1->Height=proba->Height*Image1->Width/ancho;
if(Image1->Height>321)
                   Image1->Width=ancho*Image1->Height/proba->Height;
Image1->Stretch=true;
Image1->Picture->Assign(proba);


¿algo he hecho mal? Suelen aparecer al final de la linea "MM012" con lo que faltan como 20 caracteres

Gracias
Saludos, Bosoft.