PDA

Visualizza la versione completa : [DELPHI] Stampa e problemi di spaziatura testo


esposito
10-11-2006, 09:18
Salve, ho un serio problema con la stampa di un semplice documento in Delphi.

Dopo aver dichiarato Printers in Uses, il codice da me utilizzato è il seguente:



procedure TfrmOrdine.btnStampaClick(Sender: TObject);
var
Device : array[0..255] of char;
Driver : array[0..255] of char;
Port : array[0..255] of char;
hDMode : THandle;
PDMode : PDEVMODE;
begin


If Application.MessageBox('Si vuole stampare il documento?', 'Conferma operazione di stampa', MB_YESNO) = 7 Then
begin
Exit;
end;

with Printer do begin
PrinterIndex := PrinterIndex;
GetPrinter(Device, Driver, Port, hDMode);

if hDMode <> 0 then begin
pDMode := GlobalLock(hDMode);
if pDMode <> nil then begin
pDMode.dmFields := pDMode.dmFields or dm_Color;
pDMode.dmColor := DMCOLOR_COLOR;
GlobalUnlock(hDMode);
end;
end;

PrinterIndex := PrinterIndex;
Orientation := poPortrait;

BeginDoc;

Screen.Cursor := crHourGlass;

Canvas.Font.Color := clBlack;
Canvas.Font.Name := 'Verdana';
Canvas.Font.Size := 14;

// Caratteri non in grassetto
Canvas.Font.Style := Canvas.Font.Style - [fsBold];

// Caratteri non sottolineati
Canvas.Font.Style := Canvas.Font.Style - [fsUnderline];

SetTextAlign(printer.canvas.handle, TA_LEFT);

Canvas.TextOut(150, 100, '_________________________________________________ ___________' );
Canvas.TextOut(1000, 400, 'TITOLO DOCUMENTO');
Canvas.TextOut(150, 550, '_________________________________________________ ___________' );

Canvas.Font.Size := 10;

Canvas.TextOut(350, 850, 'Primo rigo' );
Canvas.TextOut(150, 1050, 'Secondo rigo' );

EndDoc;

Screen.Cursor := crDefault;

end;

end;



Il problema è che su alcune macchine (o stampanti) la spaziatura dell'interlinea fra la riga 1 e la riga 2 è tripla rispetto a ciò che si ottiene su altri PC. Devo forse dichiarare l'unità di misura prima di mandare in stampa il documento? Se sì, in che modo si fa?

Grazie in anticipo.

alka
10-11-2006, 13:32
Sono pienamente consapevole che la mia non è una valida risposta alla domanda ma... perché non utilizzare un tool di reporting classico? :)

mondobimbi
10-11-2006, 14:08
ciao,
controlla PageWidth e PageHeight, probabilmente sono differenti a seconda della stampante che utilizzi. TextOut accetta dei pixel e se vuoi che il testo sia scritto in una certa posizione assoluta della pagina A4 devi fare un po' di proporzioni tra PageWidth, PageHeight e la dimensione reale del foglio A4.

se hai bisogno di maggiori informazioni fammelo sapere ho alcune procedure che trasformano una posizione assoluta in mm in una relativa in pixel

ciao
sergio

esposito
10-11-2006, 19:01
Suppongo che un tool di reporting implichi l'utilizzo di controlli aggiuntivi (tipo OCX in VB) e che comunque siano strumenti da acquistare a parte.

Delphi mi piace soprattutto per l'autosufficienza dei suoi eseguibili e, per questo motivo, sono alla ricerca di un'eventuale soluzione del problema basata sull'utilizzo di codice. Del resto, si tratta soltanto della stampa di banale testo su una pagina A4.

Tuttavia, non sapendo se il problema è risolvibile facilmente, non posso escludere definitivamente il ricorso ad un tool di reporting, magari inglobabile nell'eseguibile e che non richieda registrazione nel Registry di Windows.


Originariamente inviato da alka
Sono pienamente consapevole che la mia non è una valida risposta alla domanda ma... perché non utilizzare un tool di reporting classico? :)

esposito
10-11-2006, 19:08
Ciao, perdona la probabile ingenuità della mia domanda (uso Delphi da poco tempo), ma esiste un codice che consenta di stabilire l'unità di misura che si vuole adottare (ad es. millimetri)?

Il mio problema è fare in modo che un millimetro venga interpretato come un millimetro su qualsiasi macchina e mi chiedevo, quindi, se esiste un codice che permetta di dichiarare l'unità di misura che si intende utilizzare nella stampa.

Grazie.


Originariamente inviato da mondobimbi
ciao,
controlla PageWidth e PageHeight, probabilmente sono differenti a seconda della stampante che utilizzi. TextOut accetta dei pixel e se vuoi che il testo sia scritto in una certa posizione assoluta della pagina A4 devi fare un po' di proporzioni tra PageWidth, PageHeight e la dimensione reale del foglio A4.

se hai bisogno di maggiori informazioni fammelo sapere ho alcune procedure che trasformano una posizione assoluta in mm in una relativa in pixel

ciao
sergio

mondobimbi
10-11-2006, 19:37
ti posto una semplice funzione che trasforma i mm lungo la coordinata X in pixel, per il formato A4.
Ne devi fare una anologa per la coordinata Y.



function mmToXPxl(x : integer) : integer;
const
a4_width_po = 210;
a4_width_la = 297;
begin
Printer.PaperSize.PaperName := 'A4';
case Printer.orientation of
poPortrait : result := Printer.PageWidth * x div a4_width_po;
poLandScape : result := Printer.PageWidth * x div a4_width_la;
end;
end;


come vede è abbastanza semplice

ci sentiamo domani

ciao
sergio

esposito
10-11-2006, 20:40
Grazie per l'aiuto.

Ma davvero non esiste in Delphi una funzione che in VB6 richiede una sola riga di codice?



Printer.ScaleMode = vbCentimeters



Originariamente inviato da mondobimbi
ti posto una semplice funzione che trasforma i mm lungo la coordinata X in pixel, per il formato A4.
Ne devi fare una anologa per la coordinata Y.



come vede è abbastanza semplice

ci sentiamo domani

ciao
sergio

alka
10-11-2006, 23:39
Originariamente inviato da esposito
Suppongo che un tool di reporting implichi l'utilizzo di controlli aggiuntivi (tipo OCX in VB) e che comunque siano strumenti da acquistare a parte.
No, non servono controlli tipo OCX, ma controlli VCL.

L'autosufficienza di Delphi è data dalla disponibilità dei sorgenti per i componenti, niente di più.

Non sempre è possibile ottenere tutto senza ricorrere a componenti di terze parti.

Componenti di reporting (es. RAVE Reports, ma ce ne sono altri, come FuzzyReports) sono pienamente e liberamente utilizzabili.

Gestire le problematiche di stampa lavorando direttamente sul "Canvas" della stampante può essere frustrante. :stordita:

esposito
11-11-2006, 13:05
Allora il discorso cambia e si fa interessante.

Quali componenti mi consiglieresti per la reportistica, a livello freeware?


Originariamente inviato da alka
No, non servono controlli tipo OCX, ma controlli VCL.

L'autosufficienza di Delphi è data dalla disponibilità dei sorgenti per i componenti, niente di più.

Non sempre è possibile ottenere tutto senza ricorrere a componenti di terze parti.

Componenti di reporting (es. RAVE Reports, ma ce ne sono altri, come FuzzyReports) sono pienamente e liberamente utilizzabili.

Gestire le problematiche di stampa lavorando direttamente sul "Canvas" della stampante può essere frustrante. :stordita:

alka
11-11-2006, 14:38
Originariamente inviato da esposito
Quali componenti mi consiglieresti per la reportistica, a livello freeware?
Io uso FuzzyReport, ultimamente manutenuto solo dalla comunità di "it.comp.lang.delphi" (il newsgroup) a cui partecipo in modo attivo.

Puoi scaricarlo temporaneamente da qui (http://www2.samatel.com/icld/) (sezione "Download").

Ciao! :ciauz:

Loading