Newsgroup: it.comp.appl.access
Titolo: Allineamento in basso controlli corpo report

Come da oggetto mi serviva allineare nella classica stampa fattura il
prezzo in basso rispetto alle dimensioni di una descrizione multiriga
in un report, tempo fa qualcuno aveva postato la soluzione che
purtroppo non riesco più a trovare, c'è qualcuno che si ricorda  come
si fa?
esempio
descrizione
multiriga			prezzo 	totale
descrizione due		prezzo totale
descrizione tre
riga1
riga2			prezzototale
Saluti.
Emanuele.

 ha scritto nel messaggio
news:fno8hughed6aviaqa...@4ax.com...

Prova a cercare  il post di  Tonio Tanzi  del  22/12/2001-14:36:28
link in basso forse può servirti.
Saluti Daniele
---
http://groups.google.com/groups?q=group:it.comp.appl.access+author:tonio+aut
hor:tanzi&start=20&hl=it&lr=&ie=UTF-8&oe=UTF8&selm=3C250C53.B447726C%40inwin
d.it
&rnum=26&filter=0
---

---
mi da impossibile recuperare l'articolo
Saluti.
Emanuele.


trovato
Da:Tonio Tanzi (
vi....@inwind.it
)
Search Result 15
Soggetto:Altezza di casella di testo in un report - Soluzione parziale
Newsgroups:it.comp.appl.access
View: (This is the only article in this thread) | Original Format
Data:2001-12-22 14:36:28 PST
Visto che la mia precedente richiesta non ha avuto seguito, fornisco
la
soluzione da me trovata ed aggiungo un altro paio di domandine "facili
facili".
La mia domanda era la seguente:
Ho un report in forma tabulare in cui alcuni campi sono di tipo memo e
possono contenere testo piuttosto lungo. Per questo sono impostati di
tipo espandibile. In conseguenza di ciò, in fase di stampa mi ritrovo
campi di varia altezza (in base alla quantità di testo contenuto) con
un
effetto visivo non molto piacevole.
La domanda è: posso fare in modo che l'altezza di tutti i campi venga
impostata a quella del campo più grande in modo da avere una tabella
ben
allineata?
La soluzione che ho trovato è questa:
Suponiamo di voler ottenere un report del tipo indicato sotto (la
larghezza delle singole colonne è fissa, mentre l'altezza delle
singole
righe cambia in base alla quantità di testo contenuto):
Codice |       Memo1       |           Memo2           |
-------+-------------------+---------------------------|
  C1   |Questo è il testo  |Questo è il testo contenuto|
       |contenuto nel campo|contenuto nel campo "Memo2"|
       |"Memo1" del primo  |del primo record           |
       |record             |                           |
-------+-------------------+---------------------------|
Voglio far sì che tutte le caselle di testo della riga abbiano la
stessa
altezza di quella con altezza maggiore (in questo caso quella
associata
al campo "Memo1").
Creo una sub per l'evento "suFormattazione" del Corpo del report:
 
Private Sub Corpo_Format(Cancel As Integer, FormatCount As Integer)
Dim AltAtt As Long, AltMax As Long
Me.FontName = "Times New Roman"  'Fissano tipo e dimensione del font
Me.FontSize = 11                 'del report a quelle delle textbox
AltMax = 0
If Nz(Codice) <> "" Then
  AltAtt = AltFormattataCampo(Codice)
  If AltAtt > AltMax Then AltMax = AltAtt
End If
If Nz(Memo1) <> "" Then
  AltAtt = AltFormattataCampo(Memo1)
  If AltAtt > AltMax Then AltMax = AltAtt
End If
If Nz(Memo2) <> "" Then
  AltAtt = AltFormattataCampo(Memo2)
  If AltAtt > AltMax Then AltMax = AltAtt
End If
If AltMax > 0 Then
  Codice.Height = AltMax
  Memo1.Height = AltMax
  Memo2.Height = AltMax
End If
End Sub
In pratica la sub "Corpo_Format" controlla per ogni textbox qual è
l'altezza che deve avere in base al testo in essa contenuto (funzione
"AltFormattataCampo"), quindi imposta l'altezza di tutt'e tre le text
box a quella maggiore (Codice.Height = AltMax ecc.)
La funzione "AltFormattataCampo" (riportata sotto) riceve come
parametro
una text box ("Campo") e restituisce l'altezza che essa (la textbox)
deve avere tenendo conto della sua larghezza (fissa) della quantità di
testo in essa contenuto e del tipo e dimensione del font utilizzato.
Private Function AltFormattataCampo(Campo As Control) As Long
Dim i As Integer, PosFineParola As Integer, strParola, strForm,
strCampo
strForm = ""
strCampo = Nz(Campo.Value)
PosFineParola = 1
While PosFineParola > 0
  PosFineParola = InStr(strCampo, " ")
  If PosFineParola = 0 Then
    strParola = strCampo
  Else
    strParola = Left(strCampo, PosFineParola)
    strCampo = Mid(strCampo, PosFineParola + 1)
  End If
  If Me.TextWidth(strForm & strParola) >= Campo.Width Then
    strForm = strForm & vbNewLine & strParola
  Else
    strForm = strForm & strParola
  End If
Wend
AltFormattataCampo = Me.TextHeight(strForm)
End Function
Analisi della funzione:
Variabili:
- "strCampo" contiene il testo del campo passato come parametro;
- "strForm" conterrà (a fine routine) il testo del campo formattato in
modo che ogni volta che si raggiunge la fine della textbox si vada a
capo (word wrap)
- "strParola" contiene la parola in esame in un dato momento
Algoritmo (descrittivo):
Dopo aver copiato il contenuto del campo in strCampo si effettua un
ciclo while in cui si prende una parola da strCampo (strParola =
Left(strCampo, PosFineParola)) eliminandola da esso (strCampo =
Mid(strCampo, PosFineParola + 1)); si controlla se tale parola,
accodata
a strForm, rende quest'ultima più larga della textbox (If
Me.TextWidth(strForm & strParola) >= Campo.Width); se sì la si accoda
a
strForm dopo aver aggiunto un carattere di a capo (strForm = strForm &
vbNewLine & strParola) altrimenti la si accoda e basta.
Al termine del ciclo while strForm contiene una stringa formattata
suddivisa in righe la cui larghezza non supera mai quella della
textbox
che la contiene (IN PRATICA QUESTO E' CIO' CHE FA IL MODULO DI REPORT
DI
ACCESS QUANDO FORMATTA IL CONTENUTO DI UN CAMPO).
A questo punto la funzione restituisce l'altezza di strForm che
coinciderà (più o meno) con quella della textbox formattata da Access
in
fase di report.
Osservazione:
L'altezza calcolata con questo metodo è un po' inferiore a quella
fissata da Access per la text box per cui l'allineamento tra le varie
textbox dlla riga non è perfetto. Io ho aggirato questo problema
impostando una dimensione del font superiore a quella effettivamente
usata per le text box (11 punti anziché 10).
Fine delle spiegazioni - Ora due domandine:
1) Questa soluzione funziona bene per un report a se stante, ma se
questo report è usato come sottoreport di un altro (come purtroppo
succede a me) la cosa non funziona più come deve. Infatti in
quest'ultimo caso tutte le righe prendono la dimensione di quella di
altezza maggiore con il risultato di lasciare spazio vuoto tra una
riga
e l'altra. Qualcuno sa spiegarmi perché?
2) Ho dovuto usare la funzione "AltFormattataCampo" perché non ho
trovato nessun evento gestibile nel report (ne' a livello di report
intero ne' a livello di sezione) che mi consenta di avere già
l'altezza
formattata delle text box. L'unico che consente questo è l'evento
"suStampa", ma a questo punto non è più possibile modificare l'altezza
delle textbox. Qualcuno sa come fare?
Saluti.
Emanuele.

 Fine delle spiegazioni - Ora due domandine:
Ne aggiungo un'altra:
Ho provato il codice su un report fattura; ho notato che il codice contenuto
in Corpo_Format viene eseguito due volte per ogni riga. Esempio: ho una
fattura con tre righe, Corpo_Format viene eseguito una prima volta per la
prima riga, una seconda volta per la seconda riga e una terza per la terza
riga, poi ricomincia con la prima riga fino alla terza ed esce... Perchč?
Cosa fa la seconda volta che passa?
--
Matteo Palmieri - Cybercreations
www.cybercreations.it