Autore Topic: Viaggio dentro PDFWriter  (Letto 669 volte)

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Viaggio dentro PDFWriter
« il: 28 Marzo 2013, 11:09:01 »
Ho ripreso a leggere PdfWriter per capirne il suo funzionamento. La sua conoscenza mi permetterebbe di aggiungere una nuova pagina di esperienza alla mia raccolta di utilizzo di strumenti di gambas base.
Ho capito meglio come impiegare bene l'istruzione INHERITS. Ho potuto constatare come permette, con la semplice chiamata della sottoclasse di interfaccia col programma utente,  di svolgere il lavoro preparato nella classe padre (PdfWriter).
Ho visto però anche che l'istruzione di chiamata della sottoclasse deve essere preceduta dall'istruzione Randomize. Devo ammettere che non ne ho capito la necessità. Mi sono perciò bloccato mentalmente e non riesco a proseguire nello studio senza prima capirne l'utilità. :-\
 :ciao:
:ciao:

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Viaggio dentro PDFWriter
« Risposta #1 il: 28 Marzo 2013, 12:25:16 »
N'dove l'hai notata questa cosa del Randomize?
Non mi ricordo di funzioni che utilizzino logiche random, all'interno di PdfWriter...

Puoi estrapolare il pezzo di codice interessato?

P.S.: bella l'introduzione della discussione, sembra il titolo di un film di fantascienza...  ;D

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Viaggio dentro PDFWriter
« Risposta #2 il: 05 Aprile 2013, 15:58:47 »
Ho cominciato ad approfondire il concetto di definizione di proprietà per potere gestire una nuova sottoclasse riguardante l'impostazione del formato in base ai paramtri impostati precedentemente nel programma chiamante.
Il programma utente, nel mio caso: BolloAutoPT richiama la sottoclasse RepoBolloAuto di PdfWriter con:
Codice: gambas [Seleziona]
view plaincopy to clipboardprint?
With pdf = New RepoBolloAuto("L", "cm", "spec.29.7X10.2")   'accede a PdfWriter  per predisporre il formato di stampa 
     .Open() 
     .AliasNbPages() 
     .Data(CCPost.Text, TotImPag.Text, $ImpLettere, Label5.Text, MeseScad.Text, AnnoScad.Text, MesiValidi.Text, CodRiduz.Text, Targa.Text, CategRimorch.Text, CognNom.Text, CoDFisc.Text, ImpBollo.Text, ImpSanz.Text, ImpMora.Text, ProvResid.Text, ComResid.Text, CapResid.Text, ProvResid.text, $ViaPzzaResid, IndiResid.text, NumIndir.Text) 
     .Output(User.Home & "/BolloAuto", False) 
   End With 

passandole  nella riga 01 i parametri relativi al formato pagina.

Al momento della chiamata il controllo passa all'oggetto RepoBolloAuto la cui prima istruzione è Inherits PdfWriter. Essa prende in carica le proprietà ed i metodi dichiarati come pubblici in PdfWriter. viene perciò eseguito il metodo _new di PdfWriter dentro il quale vengono attivate tutte le impostazioni pertinenti il documento da stampare.

Per lì'impostazione dei parametri relativi al formato pagina, ho avuto consigliato da md9327 di creare la sottoclasse PdfPageFormat con le proprietà Height e Width.

Penso che la nuova sottoclasse debba essere richiamata all'interno della classe padre PdfWriter, coi parametri ricevuti dal programma chiamante, ed esattamente qui:
 
Codice: [Seleziona]
Select Case Lower(form)
  Case "a3"
    $fwPt = 841.89
    $fhPt = 1190.55
  -----bla-----bla-----bla-----
sostituendo la select con la chiamata alla nuova sottoclasse:

Codice: [Seleziona]
PgFrmt = New PdfPageFormat(orientation, unit, form)
  trasferendo pertanto il controllo del formato da impostare nella nuova sottoclasse.
Essendo questo il mio primo intervento con l'utilizzo di istruzioni sulla dichiarazione ed impiego di proprità con funzioni di Read/write su una classe di pubblico utilizzo, la mia condizione di apprendista in prova ed a rischio di bocciatura   ;D  richiede cautela. Aspetto di ricevere da chi ... può un piccolo cenno di pollice su o, ahimé,    :'(  pollice giù.     :D

Se ho capito, potrò addentrarmi nella codifica della nuova sottoclasse.
  :ciao:
:ciao:

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Viaggio dentro PDFWriter
« Risposta #3 il: 08 Aprile 2013, 15:26:04 »
Grazie a questa discussione, ho potuto proseguire costruttivamente il mio studio sulle proprietà e, dopo avere cominciato la modifica in un mio programma di prova della Classe PffWriter, ho cominciato ad ottenere i primi risultati positivi di quanto  capito e appreso. Le modifiche apportate fino ad ora sono:
Codice: gambas [Seleziona]
' Classe PdfWriter
Public Sub _new(Optional orientation As String = "P", Optional unit As String = "mm", Optional form As String = "A4")
-------- bla -------- bla -------- bla --------
 'Page format
'-------------------------------------- modifica mia del 8-apr-2013 ----------------------------------------------------------------------------
  PgFormat = New PdfWriterPageFormat(form, unit, $k)
  With PgFormat
    $w = .Width / $k
    $h = .Height / $k
  End With
'------------------------------------------------------------------------------------------------------------------
' Gambas class file

' Gambas class file'------------------------------------ Classe "PdfPageFormat" ------------------------------------------------------------------------------------------------
Static Public A3 As Object
Static Public A4 As Object
Static Public A5 As Object
Static Public ALegal As Object
Static Public ASpec As Object

Static Public Sub _init()
'  A3 = FoglioA3(297, 420)     ' misura in mm.
'  A4 = FoglioA4(210, 297)     ' misura in mm.
'  A5 = FoglioA5(148, 210)     ' misura in mm.
'  ALegal = FoglioLegal(215.9, 355.60)     ' misura in mm.
'  ASpec = FoglioSpec((width, height))     ' misura definita nel programma utente
'  A4 = <QuestoOggetto> ( < dimensione >, < dimensione > )
End

Property Height As Float
Property Width As Float

Private $height As Float
Private $width As Float

Static Public Function _call(Optional width As Float = 0.0, Optional height As Float = 0.0) As Object
Dim objA3 As Object = New FoglioA4(width, height)
Dim objA4 As Object = New FoglioA4(width, height)
Dim objA5 As Object = New FoglioA4(width, height)
Dim objLegal As Object = New FoglioLegal(width, height)
Dim objSpec As Object = New FoglioLegal(width, height)
'  Return obj
End

'Public Sub _new(Optional width As Float = 0.0, Optional height As Float = 0.0)
Public Sub _new(form As String, unit As String, $k As String)
Dim $fwPt As Float 'current dimensions of page in points
Dim $fhPt As Float 'current dimensions of page in points
'Dim $k As String
Dim i As Integer
'Dim ifwPt As Float
'Dim ifhPt As Float

  Select Case form
           Case "a3"
            $fwPt = 841.89
            $fhPt = 1190.55
          Case "a4"
            $fwPt = 595.28
            $fhPt = 841.89
          Case "a5"
            $fwPt = 420.94
            $fhPt = 595.28
          Case "letter"
            $fwPt = 612
            $fhPt = 792
          Case "legal"
            $fwPt = 612
            $fhPt = 1008
          Default
            If Len(form) > 5 And Len(form) <= 16 
              Select Case Lower(unit)
                       Case "cm", "mm"
                          If Left(Lower(form), 5) = "spec." Then
                              i = InStr(Lower(form), "x")
                              If i <> 0 Then
                                  $fwPt = Round($k * (CFloat(Mid(form, 6, i - 6))), -2)
                                  $fhPt = Round($k * (CFloat(Right(form, Len(form) - i))), -2)
                              Else
                                Error.Raise("Unknown page format: " & form)
                              Endif
                          Else
                            Error.Raise("Unknown page format: " & form)
                          Endif
                       Case Else
              End Select
            Else
              Error.Raise("Unknown page format: " & form)
            Endif
  End Select
  $height = $fhPt
  $width = $fwPt
End

Private Sub Height_Write(value As Float)
  $height = value
End

Private Function Height_Read() As Float
  Return $height
End

Private Sub Width_Write(value As Float)
  $width = value
End

Private Function Width_Read() As Float
  Return $width
End

Com'è visibile dal codice riportato sopra, ci sono ancora aggiustamenti da apportare, tuttavia ho lanciato il programma contenente nel passo di chiamata di PdfWriter i parametri seguenti:
Codice: [Seleziona]
With pdf = New RepoBolloAuto("L", "cm", "spec.29.7X10.2")   'accede a PdfWriter  per predisporre il formato di stampa
      .Open()
      .AliasNbPages()
      .Data(CCPost.Text, TotImPag.Text, $ImpLettere, Label5.Text, MeseScad.Text, AnnoScad.Text, MesiValidi.Text, CodRiduz.Text, Targa.Text, CategRimorch.Text, CognNom.Text, CoDFisc.Text, ImpBollo.Text, ImpSanz.Text, ImpMora.Text, ProvResid.Text, ComResid.Text, CapResid.Text, ProvResid.text, $ViaPzzaResid, IndiResid.text, NumIndir.Text)
      .Output(User.Home & "/BolloAuto", False)
    End With
Ebbene, ho ottenuto il seguente risultato intermedio:
Citazione
PgFormat.Width= '841.89'       corrispondente a cm.29.7
PgFormat.Height= '289.13'                 corrispondente a cm.10.2
I valori prodotti da PdfWriter sono il risultato della conversione di cm. in pt, secondo il normale comportamento di PdfWriter.

Se, come penso, sono sulla buona strada, proseguirò con le ulteriori modifiche.  :D
 :ciao:
:ciao:

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Viaggio dentro PDFWriter
« Risposta #4 il: 09 Aprile 2013, 13:04:12 »
O mi ero spiegato male io, oppure abbiamo fatto un pò di confusione.

L'idea di una classe apposita, come contenitore di valori predefiniti per le dimensioni della pagina di stampa, serviva appunto per poter passare con un solo parametro questi dati alla classe PdfWriter.
Da quanto da te riportato, mi sembra inutile crearne una all'interno di PdfWriter, quando in effetti gli passi già come parametro stringa i valori w/h da utilizzare.
La mia idea iniziale era in realtà quella di definire una semplice classe PdfPageSize, contenente due proprietà "w" e "h" per i valori di larghezza/altezza del foglio di stampa. Una volta definita questa classe generica, si poteva crearne ulteriori derivate, statiche, con cui definire formati già conosciuti (es. PdfPageA4 con i rispetti valori già predisposti per il formato A4). Magari la stessa classe PdfPageSize, come proprietà e metodi di utility aggiuntivi, poteva fornire anche i valori in mm/px/in ecc.
Una volta definita questa classe, si poteva passarla come parametro a PdfWriter, che si impostava direttamente i valori prelevandoli dalla classe PdfPageSize.

Vediamo di fare un esempio concreto, visto che con le sole parole ho creato confusione.

Defininiamo la classe PdfPageSize (il nome è un esempio, può chiamarsi come si desidera...):
Codice: [Seleziona]
'Class PdfPageSize

Property W As Float
Property H As Float
Property Width As Float
Property Height As Float

Private $w As Float
Private $h As Float

Public Sub _new(w As Float, h As Float)
  $w = w
  $h = h
End

Public Sub W_Write(Value As Float)
  $w = Value
End

Public Function W_Read() As Float
  Return $w
End

Public Sub Width_Write(Value As Float)
  Me.W = Value
End

Public Function Width_Read() As Float
  Return Me.W
End

Public Sub H_Write(Value As Float)
  $h = Value
End

Public Function H_Read() As Float
  Return $h
End

Public Sub Height_Write(Value As Float)
  Me.H = Value
End

Public Function Height_Read() As Float
  Return Me.H
End

Public Function GetWidthMM() As Float
  Return Millimetri($w)
End

Public Function GetWidthInches() As Float
  Return Inches($w)
End
...
...
...

Indi per cui, sarà necessario: o implementare una classe derivata (Inherit) da PdfWriter, implementando opportunamente il costruttore in modo che possa accettare la classe PdfPageSize in input, oppure modificare direttamente il costruttore di PdfWriter

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Viaggio dentro PDFWriter
« Risposta #5 il: 09 Aprile 2013, 14:43:05 »
O mi ero spiegato male io, oppure abbiamo fatto un pò di confusione.
Certamente entrare nell'idea di chi ha già analizzato il problema è impossibile. Ciascuna entità umana può affrontare un problema e risolverlo soltanto misurandosi con la propria visione del progetto e con le proprie conoscenze. Mi rendo conto che seguire il tuo ragionamento non mi è assolutamente facile, nè tanto meno posso chiederti di indicarmi passo passo come fare, perchè ti farei perdere tempo, più di quanto ne impiegheresti tu ad apportare le modifiche in prima persona.
Perciò, non avendo capito dove intervenire e come, mi pare opportuno rinunciare all'impresa. Farò le modifiche che mi occorrono esclusivamente nel mio programma per permetterne al più presto la funzionalità pratica, lasciando che sia tu, o chi abbia idee altrettanto chiare, ad apportare le dovute modifiche al PdfWriter ufficiale.  :-\

Grazie comunque per quanto hai cercato di farmi apprendere.
 :(

:ciao:

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Viaggio dentro PDFWriter
« Risposta #6 il: 09 Aprile 2013, 15:20:53 »
Come detto, appena ho un pochino di tempo, vedrò di rimetterci le mani...

Mi dispiace di non esser riuscito a spiegarmi...  :-\