Autore Topic: GridView con header, allineamento testo header?  (Letto 4470 volte)

Offline jeawrong

  • Gamberetto
  • *
  • Post: 3
    • Mostra profilo
    • http://jealab.altervista.org/index.html
GridView con header, allineamento testo header?
« il: 29 Marzo 2009, 23:29:18 »
Salve ragazzi,
premetto che uso Gambas da pochi giorni, da ieri cerco di centrare il testo nell'header di una GridView, senza riuscirci e senza trovare informazioni al riguardo (dovrebbe essere qualcosa di banale, ma non riesco a capire come fare).
Qualche esperto in materia conosce la soluzione?

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: GridView con header, allineamento testo header?
« Risposta #1 il: 30 Marzo 2009, 02:19:27 »
Al momento la soluzione non esiste...

La classe GridView attualmente possiede solo la proprietà di modificare l'aspetto delle colonne dati, ma non quello dell'header.

Per modificare la colonna, si può agire sull'oggetto ritornato dalla proprietà Current o sull'array degli elementi ritornati dalla properità Columns.
L'oggetto in questo non può essere istanziato (e quindi non creato, perchè statico), ma possiede alcune proprietà utili allo scopo.

Riguardo l'header, puoi solo decidere se mostrarlo o meno, e vuoi visualizzare la riga in alto, o la colonna laterale (per intenderci quella con indicato il numero di riga), o entrambe. Altre possibilità non sono implementate.

Immagino che questo limita un pochino la possibilità di rendere più gradevole e personalizzato l'aspetto della griglia, e ti dò anche ragione ma, credo che per questa feature tocca aspettare ancora...

Offline jeawrong

  • Gamberetto
  • *
  • Post: 3
    • Mostra profilo
    • http://jealab.altervista.org/index.html
Re: GridView con header, allineamento testo header?
« Risposta #2 il: 30 Marzo 2009, 03:14:10 »
Grazie, speriamo venga implementato presto allora, effettivamente è una piccola cosa ma che aumenta la piacevolezza del tutto.

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: GridView con header, allineamento testo header?
« Risposta #3 il: 30 Marzo 2009, 10:41:48 »
Vero!!!

Diciamo che i componenti grafici di Gambas non sono sicuramente all'altezza di quelli implementati in altri linguaggi più blasonati, ma credo che il lavoro procede, anche se a rilento, a causa della ancor poca diffusione.

Offline giulio

  • Maestro Gambero
  • ****
  • Post: 280
    • Mostra profilo
Re: GridView con header, allineamento testo header?
« Risposta #4 il: 30 Marzo 2009, 12:36:26 »
Ciao .Puoi farlo con una piccola funzione. Allego un piccolo esempio.
Naturalmente, poi ti devi preoccupare  di gestire l'evento ColumnResize
se vuoi centrare l'header ogni volta che l'utente modifica la larghezza
della colonna. Guarda la funzione AllineaHeader alla fine del codice. Ciao.

Offline giulio

  • Maestro Gambero
  • ****
  • Post: 280
    • Mostra profilo
Re: GridView con header, allineamento testo header?
« Risposta #5 il: 30 Marzo 2009, 12:46:32 »
EDIT: se non ti piace usare TRY per evitare l'errore del valore iPadding negativo,
modifica così:

Codice: [Seleziona]

IF iPadding < 0 THEN iPadding = 0
GridView1.Columns[0].Text = String$(iPadding, " ") & "First Column width 250" & String$(iPadding, " ")

Offline jeawrong

  • Gamberetto
  • *
  • Post: 3
    • Mostra profilo
    • http://jealab.altervista.org/index.html
Re: GridView con header, allineamento testo header?
« Risposta #6 il: 31 Marzo 2009, 00:12:05 »
Interessante che (in mancannza di meglio) si possa aggirare l'ostacolo ;) ma per ora preferirei evitare di scrivere ulteriore codice solo per una "mancanza" estetica. In ogni caso grazie mille :))

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: GridView con header, allineamento testo header?
« Risposta #7 il: 17 Aprile 2009, 15:04:51 »
Citazione

giulio ha scritto:
Ciao .Puoi farlo con una piccola funzione. Allego un piccolo esempio.
Naturalmente, poi ti devi preoccupare  di gestire l'evento ColumnResize
se vuoi centrare l'header ogni volta che l'utente modifica la larghezza
della colonna. Guarda la funzione AllineaHeader alla fine del codice. Ciao.


Anch'io sono interessato ai problemi di allineamento all'interno della gridview. La mia necessità non è tanto la testata delle colonne, ma l'allineamento di tipo destrorso all'interno delle caselle che destinate a contenere dati numerici. Ho perciò guardato con molta attenzione l'esempio che hai suggerito nel programmino "gridexample" ed ho trasferito la logica nel progetto che sto costruendo. Poichè è possibile che altri possano imbattersi in utilizzazioni come quelle che si stanno trattando in questa discussione, ho pensato di trascrivere le istruzioni che a cui sono arrivato partendeo dal tuo esempio::
Codice: [Seleziona]

DIM $_StriMia AS String
DIM i_LunCasella AS Integer
DIM i_LunTesto AS Integer
DIM i_LunSpazio AS Integer
DIM i_Risult AS Integer

$_StriMia = "9.999,09"
i_LunSpazio = GriView.Font.Width(" ")
i_LunTesto = GriView.Font.Width($_StriMia)
i_LunCasella = GriView.Columns[1].Width
i_Risult = ((i_LunCasella - i_LunTesto) / i_LunSpazio) - 1 'sottraggo uno al risultato per non avere l'ultimo carattere del numero sovrapposto al bordo destro della colonna
GriView[0, 1].text = String$(i_Risult, " ") & $_StriMia

 :-D  
Considerando però che l'utilizzo delle istruzioni di allineamento può essere impiegato per gridview diverse, appartenenti anche a form diverse, sarebbe comodo trasferire il codice,con opportuni adattamenti, in un modulo esterno  Però dal modulo esterno come posso riferirmi ad una gridview? In V.B. era possibile, ma mi pare che in Gambas gli oggetti possono essere referenziati per valore e non per indirizzo, pertanto non posso definire una variabile il cui contenuto sia il riferimento, ora alla grdview1, ora alla gridview2, e così via. Se è così come ricordo, diventerebbe impossibile creare un modulo generalizzato da richiamare all'occorrenza, da una Form.class qualsiasi.
:ciao:  :ciao:
:ciao:

Offline giulio

  • Maestro Gambero
  • ****
  • Post: 280
    • Mostra profilo
Re: GridView con header, allineamento testo header?
« Risposta #8 il: 18 Aprile 2009, 22:33:18 »
@pica

Ho modificato l'esempio per fare quello che dici tu. E' molto semplice: si mette la funzione in un modulo globale e la si chiama all'occorenza da qualsiasi Form per qualsiasi Grid. Ho aggiunto solo un'altra Form, ma puoi aggiungerne quante vuoi. Comunque guarda il codice: è più facile che spiegarlo. Ciao.

EDIT: naturalmente nell'esempio la funzione usa la stringa del primo
header per calcolare i vari spazi. Sono pigro. Comunque, per il tuo scopo, cioè allineare a destra il testo nelle celle, è chiaro che alla stessa funzione puoi passare anche la colonna e la riga e calcolare così la lunghezza del testo della cella che ti interessa.

Es:.

PUBLIC FUNCTION (hObject as GridView, iRow AS integer, iCol AS integer)

'poi qui ti calcoli la lunghezza del testo della cella con

 iLunghezza = hObject.Font.Width(hObject[iRow, iCol].Text)

'etc etc

END

Nelle Form chiami Global.AllineaHeader(GridView1, 0 ,1) 'per esempio.

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: GridView con header, allineamento testo header?
« Risposta #9 il: 18 Aprile 2009, 23:45:08 »
Non potete scrivere la funzione in una classe e inviarla in area download così che tutti possano implementarla facilmente nei loro progetti dotati di gridwier?

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: GridView con header, allineamento testo header?
« Risposta #10 il: 19 Aprile 2009, 18:26:24 »
@ giulio

ho scaricato il file che gentilmente hai allegato alla tua rispo, ma all'esecuzione mi da un errore di
Citazione
stack overflow
all'istruzione
Codice: [Seleziona]

 hObject.Columns[0].Text = String$(iPadding, " ") & "First Column width 250" & String$(iPadding, " ")

interna a Global.module.

Comunque penso di avere capito quello che mi ha suggerito, solo che vorrei sapere come hai fatto a tirare fuori dal sacco del..."puparo" (è il marionettista della mia terra di Sicilia) l'oggetto "hObiect"; nel mio sacco non c'era. :hammer:

a parte gli scherzi, ti ringrazio moltissimo. Debbo dirti che ho messo subito in pratica il tuo suggerimento ed in parte ha funzionato; infatti non riesco a capire come l'istruzione
Codice: [Seleziona]

i_LunCasel = hObject.Column[i_NumCol].Width

mi dia un errore di "not an object", eppure l'ho guardata e riguardata tante volte, l'ho anche tascurata e sono andato avanti trasferendo nella mia variabile il valore "100" e sono così riuscito ad ottenere l'allineamento a destra nella casella desiderata della gridview del valore da visualizzare.

Per correttezza trascrivo, qui di seguito le istruzioni impiegate:
Citazione

Nella Form.class di riferimento ho scritto:
Codice: [Seleziona]

DIM $_StriMia AS String
DIM i_ColNUm AS Integer
DIM i_RigaNum AS Integer

$_StriMia = "9.999,09"
i_RigaNum = 0
i_ColNUm = 1
ModuliVari.AllinDx(GriRiepPreMom, i_RigaNum, i_ColNUm, $_StriMia)


mentre nel Global.module ho scritto:
Codice: [Seleziona]

PUBLIC FUNCTION AllinDx(hObject AS GridView, i_NumRg AS Integer, i_NumCol AS Integer, $_Testo AS String)          'Funzione di allineamento destrorso del testo
DIM i_LunCasel AS Integer
DIM i_LunSpazio AS Integer
DIM i_Risult AS Integer
DIM i_LunTesto AS Integer
 
i_LunSpazio = hObject.Font.Width(" ")
i_LunTesto = hObject.Font.Width($_Testo)  
i_LunCasel = hObject.Column[i_NumCol].Width   ««««««  ERRORE (not an object )
i_Risult = (i_LunCasel - i_LunTesto) / i_LunSpazio - 1
hObject[0, 1].text = String$(i_Risult, " ") & $_Testo
END


 Ho anche sostituito il campo dentro le [ ] col corrispondente valore numerico, nel mio caso [1], edl'effetto errore si è ripresentato regolarmente.
___________________________

@ Ceskho:
sembra facile, ma io non saprei da dove cominciare; mi sento troppo piccolo. In ogni caso bisogna prima che la Funzione ... funzioni bene!. :lol:

Ciao a tutti
:ciao:

Offline giulio

  • Maestro Gambero
  • ****
  • Post: 280
    • Mostra profilo
Re: GridView con header, allineamento testo header?
« Risposta #11 il: 19 Aprile 2009, 18:58:03 »
Per parlare del mio esempio,  a me qui non dà messaggi d'errore tipo
stack overflow. Uso Gambas 2.12 su Slackware con D.E. KDE. Quindi l'esempio
usa le librerie QT. Altro non so dirti. Ora provo il tuo codice e cerco di capire
quell'errore di non object.

P.S. U sacciu socchè u' puparo. Ma stiurnu a ficiru a cronoscalata? aeri mi vinni a viriri i provi. Salutamo a vossia.

P.P.S 'un tu ricu di dunni sugnu, questioni di praivasi :-)

Offline giulio

  • Maestro Gambero
  • ****
  • Post: 280
    • Mostra profilo
Re: GridView con header, allineamento testo header?
« Risposta #12 il: 19 Aprile 2009, 19:15:48 »
Trovato l'errore:

correggi così:

i_LunCasel = hObject.Columns[i_NumCol].Width


avevi dimenticato la "s" di columns.

Allego il tuo esempio funzionante. E' il tuo codice. Saluti

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: GridView con header, allineamento testo header?
« Risposta #13 il: 19 Aprile 2009, 23:57:25 »
Citazione

giulio ha scritto:
Trovato l'errore:

correggi così:

i_LunCasel = hObject.Columns[i_NumCol].Width


avevi dimenticato la "s" di columns.

Allego il tuo esempio funzionante. E' il tuo codice. Saluti


Ahia, alla faccia della 's'! Grazie per la correzione; io non l'avevo proprio vista. :-x

rispo P.S.: Si a ficiru, ma nun sacciu comu finiu.
           
      PS:  Ma, ora comu pozzu durmiri nun sapennu di dunni si tu?
 :-D  :ciao:  :ciao:
:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.303
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: GridView con header, allineamento testo header?
« Risposta #14 il: 23 Giugno 2012, 14:38:38 »
« Ultima modifica: 01 Settembre 2012, 20:33:35 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »