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:
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:
Select Case Lower(form)
Case "a3"
$fwPt = 841.89
$fhPt = 1190.55
-----bla-----bla-----bla-----
sostituendo la select con la chiamata alla nuova sottoclasse:
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:
Grazie a questa discussione (http://www.gambas-it.org/smf/index.php?topic=2616.msg27640#msg27640), 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:
' 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:
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:
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:
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...):
'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