Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    [DELPHI] Problemi di stampa

    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:

    codice:
    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.
    http://www.espositosoftware.it

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Sono pienamente consapevole che la mia non è una valida risposta alla domanda ma... perché non utilizzare un tool di reporting classico?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

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

  4. #4
    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?
    http://www.espositosoftware.it

  5. #5
    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
    http://www.espositosoftware.it

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

  7. #7
    Grazie per l'aiuto.

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

    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
    http://www.espositosoftware.it

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    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.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #9
    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.
    http://www.espositosoftware.it

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    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 (sezione "Download").

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.