Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: Giuani - Maggio 27, 2020, 05:05:56 pm

Titolo: Stampa di una StringGrid
Inserito da: Giuani - Maggio 27, 2020, 05:05:56 pm
Salve a tutti,
Mi trovo a dover stampare il contenuto di una StringGrid, ma non so da dove cominciare.
Ho letto diversi post sul forum, ma non ho capito o non ho saputo capire come fare.
In verità non ho mai usato procedure di stampa con Lazarus.
Senza particolari esigenze mi basterebbe un algoritmo tipo
For I:=1 to N do
Stampa stringa(colonna, riga);
Come fare ?
Grazie dell’attenzione.
Titolo: Re:Stampa di una StringGrid
Inserito da: nomorelogic - Maggio 27, 2020, 06:33:53 pm
ciao Giuani

per qualcosa di semplice puoi iniziare da quì
https://wiki.lazarus.freepascal.org/Using_the_printer (https://wiki.lazarus.freepascal.org/Using_the_printer)
Titolo: Re:Stampa di una StringGrid
Inserito da: Giuani - Maggio 27, 2020, 07:51:23 pm
Chiaro e utile, ora lo studio.
Grazie
Titolo: Re:Stampa di una StringGrid
Inserito da: xinyiman - Maggio 28, 2020, 07:55:03 am
Per stampare con facilità c'è anche il package di lazreport.

Qui trovi un esempio di stampa (di dati presi da un db) ma non dovrebbe essere troppo difficile adattarlo alle tue esigenze. Per esempio metti i dati dentro un BufDataset e poi lo dai in pasto a lazreport come nell'esempio

https://wiki.freepascal.org/LazReport_Tutorial
Titolo: Re:Stampa di una StringGrid
Inserito da: Giuani - Maggio 28, 2020, 06:46:33 pm
Ciao nomorelogic
Ho letto la pagona da te linkata e ho realizzato questa procedura
Che funziona bene:
procedure TForm1.Button4Click(Sender: TObject);
var I:integer;
    STM: TPrinter;
begin
if PrintDialog1.execute then
begin
STM:=Printer;
STM.BeginDoc;
Canvas.Font.Color := clBlack;
STM.Canvas.Font.Size :=10;

STM.Canvas.Font.Size := 10;
Canvas.Font.Color := clBlack;
For I:=1 to 10 do
begin
STM.Canvas.TextOut(500, 150+I*100, StringGrid1.Cells[1,I]);
STM.Canvas.TextOut(1000, 120+I*100, StringGrid1.Cells[2,I]);
end;
STM.EndDoc;
end;
end; 
e ti ringrazio
Ringrazio anche xinyiman per la pagina segnalata, ora studierò anche questa.
Titolo: Re:Stampa di una StringGrid
Inserito da: bonmario - Maggio 29, 2020, 11:09:01 am
Occhio, che ti va bene, perché stai stampando solo poche righe.
Se facessi il ciclo che invece di arrivare fino a 10, arriva fino a 100, con quel codice probabilmente perderesti tutte le righe che non ci stanno sul foglio.
In poche parole, dovresti gestire il salto pagina.

Questa, ad esempio, è una procedura che avevo fatto anni fa', per stampare una TStringList, puoi prendere spunto, per adattare la tua

Codice: [Seleziona]
  procedure StampaStringList(MyList:TStringList; Titolo:String);
  var RigaInStampa, RigaAttuale, Pagina, AltezzaChr, PosY, RigheXPag, IdxLista:Integer;
  begin
    //Imposto l'orientamento della pagina
    case OrientamentoPagina of
      opAutomatico: Printer.Orientation:=DeterminaOrientamento(MyList);
      opVerticale:  Printer.Orientation:=poPortrait;
      opOrizzontale:Printer.Orientation:=poLandscape;
    end;

    Printer.BeginDoc;
    Printer.Title:=Titolo;
    Printer.Canvas.Font.Name:='Courier New';
    Printer.Canvas.Font.Size:=8;



      AltezzaChr:=Printer.Canvas.TextHeight('Gg') + 2;
      RigheXPag:=(Printer.PageHeight - 50) div AltezzaChr;

      Pagina:=0;
      RigaAttuale:=0;

      for IdxLista:=0 to MyList.Count - 1 do begin
        RigaAttuale:=RigaAttuale + 1;
        RigaInStampa:=RigaAttuale - (Pagina * RigheXPag);

        PosY:=RigaInStampa * AltezzaChr;
        Printer.Canvas.TextOut(25, PosY, MyList[IdxLista]);

        //Salto pagina
        if (RigaInStampa = RigheXPag) and (IdxLista <> (MyList.Count - 1)) then begin
          Printer.NewPage;
          Pagina:=Pagina + 1;
        end;
      end;

    Printer.EndDoc;
  end;

Ciao, Mario
Titolo: Re:Stampa di una StringGrid
Inserito da: Giuani - Maggio 30, 2020, 09:32:39 am
Grazie bonmario,
si vero e mi hai proposto una soluzione professionale.
Per superare il limite ho aggiunto qualche linea in modo “artigianal”, utilizzando una variabile che genera NewPage a dato valore.
for ………
LI:=LI+1;
if I=51 then
begin
Printer.NewPage;
LI:=1; 
end;
STM.Canvas.TextOut(WCA, 120+LI*100, StringGrid1.Cells[0,I]); 
…….
End:
il problema e nella condizione di fare una NewPage ad un dato valore di I, ma questo lo so fare bene, na il listato da te postato è ottimo.