PDA

Ver la Versión Completa : Problema con TPrinterWin


jhonalone
29-10-2016, 20:49:26
Hola compañeros de fatigas.
Digo de fatigas, porque yo estoy muy fatigado ya, vosotros quizás no.
Os cuento.
Tengo un procedimiento hecho en .... no sé, Delphi7, Delphi10...
Intento reutilizarlo para un nuevo programa multiplataforma en FMX.
Pero nunca he imprimido nada con FMX, y me está resultando imposible. Por éso os pido ayuda.
El procedimiento es este:

function IH(N:integer):integer;
var
I:real;
begin
I:=GetDeviceCaps(Printer.Handle,Physicalwidth)/2481;

IH:=Round(i*N);

end;

function IV(N:integer):integer;
var
I:real;
begin
I:=GetDeviceCaps(Printer.Handle,PhysicalHeight)/3507;

IV:=Round(i*N);

end;
procedure THojaDeRes.EditaHojaResp;
VAR
XX,xy,pagina,linea,lon_1parte_contidio,lon_1parte_observa:INTEGER;
p:PRegistro;

PROCEDURE CABECERA;
BEGIN
pagina:=pagina+1;
with Printer.canvas
do begin
rectangle(IH(0),IV(300),ih(Printer.PageWidth-15),iv(2700));
MoveTo(ih(0),iv(400));
LineTo(ih(Printer.PageWidth-15),iv(400));
MOveTo(ih(120),iv(300));
LineTo(ih(120),iv(2700));
MOveTo(ih(240),iv(300));
LineTo(ih(240),iv(2700));
MOveTo(ih(360),iv(300));
LineTo(ih(360),iv(2700));
MOveTo(ih(580),iv(300));
LineTo(ih(580),iv(2700));
MOveTo(ih(975),iv(300));
LineTo(ih(975),iv(2700));
MOveTo(ih(1505),iv(300));
LineTo(ih(1505),iv(2700));
MOveTo(ih(1595),iv(300));
LineTo(ih(1595),iv(2700));
MOveTo(ih(1685),iv(300));
LineTo(ih(1685),iv(2700));
MOveTo(ih(1805),iv(300));
LineTo(ih(1805),iv(2700));
Font:=Pica.Font;
TextOut(ih(390),iv(0),'Nombre: Clave: '{+clave});
Font:=Doble.Font;
TextOut(ih(750),iv(130),'Hoja de Respuestas');
Font:=Picanegra.Font;
TextOut(ih(38),iv(325),'NL');
TextOut(ih(133),iv(325),'T.R.');
TextOut(ih(245),iv(325),'Nº P');
TextOut(ih(365),iv(325),'Local+CE');
TextOut(ih(585),iv(325),'Determ+CF Par');
TextOut(ih(980),iv(325),'Contenidos+C.Idiogr.');
TextOut(ih(1513),iv(325),'Pop');
TextOut(ih(1627),iv(325),'Z');
TextOut(ih(1705),iv(325),'PNF');
TextOut(ih(1810),iv(325),'Punt. Espec.+Observ.');

Font:=Pica.Font;
TextOut(ih(2200),iv(2750),'Pág:'+inttostr(pagina));
end;
linea:=9;
END;

Estoy teniendo todos los problemas del mundo para adaptarlo.

Primero con GetDeviceCaps, pero esto está resuelto con la unidad WinApi.Windows

Después con el rectángulo, que creo que está resuelto con este código, pero no lo he podido probar todavía:


PROCEDURE CABECERA;
var
MyRect:TrectF;
BEGIN
pagina:=pagina+1;


with Printer.canvas
do begin

MyRect.Create(IH(0),IV(300),ih(Printer.PageWidth-15),iv(2700));
DrawRect(MyRect, 0, 0, AllCorners, 100);
//MoveTo(ih(0),iv(400));

Después creo que no se puede utilizar la función //MoveTo(ih(0),iv(400));

Y ya me he quedado atascado al intentar cambiar el Canvas.Font. Pues el compilador me dice que el Canvas.Font de TPrinterWin es una variable "read-only" y no se le puede asignar un valor.

¡Ah! Se me olvidaba comentaros que tampoco reconoce la función TextOut(ih(38),iv(325),'NL');

Llevo dos días enteros buscando y probando y no consigo resolverlo.

Agradezco cualquier información. Seguro que necesito aprender mucho todavía. Pero esto me corre un poco de prisa y no tengo tiempo.

Gracias de antemano.

jhonalone
29-10-2016, 21:37:43
Bueno.
¡Un Pasito más!

El tema de los font es que no se pueden asignar de golpe, o sea .....font := .....font.
Hay que hacerlo detalladamente, así (no he probado, pero lo compila):

Font.Size := Form1.Pica.Font.Size;
Font.Family := Form1.Pica.Font.Family;
Font.Style := Form1.Pica.Font.Style;

Sigo investigando mientras espero vuestra ayuda.
Saludos.