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

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: GridView con header, allineamento testo header?
« Risposta #15 il: 20 Novembre 2013, 00:35:58 »
Sempre più difficile!
In una casella di GridView devo impegnare tutta la l'ampiezza della casella scrivendo il valore di una variabile all'estrema sinistra e quello di un'altra, sempre nella stessa casella, ma all'estrema destra.

Riprendendo, questa discussione, perchè la funzione Alignment di Gambas non è è applicabile, ho utilizzato la funzione di allineamento "fatta in casa" mediante le seguenti istruzioni:
Codice: gambas [Seleziona]
AllineaCelleGrid = New AllinCelleGriBox(GriTabMovv, iTotRgGri, 2, $NomeVoce, "sx")
          iLun = Len($NomeVoce)
          iLun1 = Len(GriTabMovv[iTotRgGri, 2].Text)
          $StriMia = "Totali pregressi a riporto => SALDO: " & $Valuta & " " & EdtImp.$Imp!          iLun2 = Len($StriMia)
          iDiff = iLun1 - (iLun + iLun2)
          If iDiff > 0 Then
            $StriMia = $NomeVoce & Space(iDiff) & $StriMia
            AllineaCelleGrid = New AllinCelleGriBox(GriTabMovv, iTotRgGri, 2, $StriMia, "dx")
          Else
            AllineaCelleGrid = New AllinCelleGriBox(GriTabMovv, iTotRgGri, 2, $NomeVoce & " /// " & $StriMia, "dx")
          Endif


Per completezza riporto la classe "AllinCelleGRiBox":
Codice: gambas [Seleziona]
' Gambas class file

'------------------------------- AllinCelleGriBox.Class ------------------------------------------------------------------------------------------
' Questa Classe dinamica si occupa dell'allineamento del contenuito di una cella interna ad una GridBox: -----------------------------------------
' cx --> codice identificativo della richiesta di un allineamento centrale rispetto alla cella --------------------------------------------------
' dx --> codice identificativo della richiesta di un allineamento laterale destro rispetto alla cella -------------------------------------------
' ct --> codice identificativo della richiesta di un allineamento centrale della testata della GridBox --------------------------------------------------
'-------------------------------------------------------------------------------------------------------------------------------------------------
Private iLunCasel As Integer
Private iLunSpazio As Integer
Private iLunTesto As Integer
Private i_Risult As Integer

Public Sub _new(hObject As GridView, i_NumRg As Integer, i_NumCol As Integer, $_Testo As String, $_TipAllin As String)          'Funzione di allineamento destrorso del testo
'------------------------------------------------------- 
  ' [GB2:FNTW] i_LunSpazio = hObject.Font.Width(" ")
  iLunSpazio = hObject.Font.TextWidth(" ")
  ' [GB2:FNTW] i_LunTesto = hObject.Font.Width($_Testo)
  iLunTesto = hObject.Font.TextWidth($_Testo)
  iLunCasel = hObject.Columns[i_NumCol].Width
  i_Risult = (iLunCasel - iLunTesto) / iLunSpazio - 1
  Select Case $_TipAllin
          Case "sx"
            AllinSx(hObject, i_NumRg, i_NumCol, $_Testo)
          Case "dx"
            AllinDx(hObject, i_NumRg, i_NumCol, $_Testo)
          Case "cx"
            AllinCen(hObject, i_NumRg, i_NumCol, $_Testo)
          Case "ct"
            CenTestata(hObject, i_NumCol, $_Testo)
          Case "dt"
            AllinDxTestata(hObject, i_NumCol, $_Testo)
  End Select
End

Public Sub AllinDx(hObject As GridView, i_NumRg As Integer, i_NumCol As Integer, $_Testo As String)          'Funzione di allineamento destrorso del testo
'----------------------------------------------------------------
  If i_Risult > 0 Then
      hObject[i_NumRg, i_NumCol].text = String$(i_Risult, " ") & $_Testo
  Else
    hObject[i_NumRg, i_NumCol].text = $_Testo
  Endif
End

Public Sub AllinCen(hObject As GridView, i_NumRg As Integer, i_NumCol As Integer, $_Testo As String)          'Funzione di allineamento centrale del testo
'----------------------------------------------------------------
  If i_Risult > 0 Then
      i_Risult /= 2
      hObject[i_NumRg, i_NumCol].text = String$(i_Risult, " ") & $_Testo & String$(i_Risult, " ")
  Else
    hObject[i_NumRg, i_NumCol].text = $_Testo
  Endif
End

Public Sub AllinSx(hObject As GridView, i_NumRg As Integer, i_NumCol As Integer, $_Testo As String)          'Funzione di allineamento destrorso del testo
'----------------------------------------------------------------
  If i_Risult > 7 Then
      hObject[i_NumRg, i_NumCol].text = $_Testo & String$(i_Risult, " ")
'      hObject[i_NumRg, i_NumCol].text = $_Testo & String$(i_Risult - 7, " ")
  Else
    hObject[i_NumRg, i_NumCol].text = $_Testo
  Endif
End

Public Sub AllinDxTestata(hObject As GridView, i_NumCol As Integer, $_Testo As String)          'Funzione di allineamento destrorso della testata di colonna
  If i_Risult > 0 Then
      hObject.Columns[i_NumCol].text = String$(i_Risult, " ") & $_Testo
  Else
    hObject.Columns[i_NumCol].text = $_Testo
  Endif
End
Public Sub CenTestata(hObject As GridView, i_NumCol As Integer, $_Testo As String)          'Funzione di allineamento centrale della testata di colonna
'----------------------------------------------------------------------------------------------------------
  If i_Risult > 0 Then
      i_Risult /= 2
      hObject.Columns[i_NumCol].text = String$(i_Risult, " ") & $_Testo & String$(i_Risult, " ")
  Else
    hObject.Columns[i_NumCol].text = $_Testo
  Endif
End

La classe "AllinCelleGRiBox" completa la lunghezza della stringa con tanti caratteri "spazio" quanti ne servono per impegnare tutta la casella. Essa viene richiamata due volte, la prima per riempire tutta la casella con la prima variabile, la seconda, dopo avere riunito entrambi le variabili, la prima a sx, la seconda a dx, della stringa di transito. La logica funziona solo teoricamente, perchè applicata praticamente, purtroppo, la stringa finale oltrepassa l'ampiezza della cella di GridView destinataria.
A prima vista ho la sensazione che il problema sia sulle dimensioni e sul tipo di font in base al quale lavora la classe "AllinCelleGRiBox" che, credo, debba essere diverso da quello utilizzato poi per la casella di destinazione.

Se qualcuno non dovesse risolvere l'enigma prima di me, vi saprò dire. ;D
 :ciao:  :ciao:
:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: GridView con header, allineamento testo header?
« Risposta #16 il: 20 Novembre 2013, 01:42:33 »
A prima vista ho la sensazione che il problema sia sulle dimensioni e sul tipo di font in base al quale lavora la classe..


...se si potesse sapere  a priori :hard: da quanti caratteri può essere colmata la riga della GridView....


« 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. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: GridView con header, allineamento testo header?
« Risposta #17 il: 20 Novembre 2013, 02:29:49 »
...se si potesse sapere  a priori :hard: da quanti caratteri può essere colmata la riga della GridView....


Questo può essere conseguito con sufficiente accuratezza conoscendo la dimensione in pixel dei caratteri sulla base del font e delle altre loro caratteristiche assegnate.

Nell'esempio che segue abbiamo una GridView con tre colonne e tre righe. Nella prima riga della prima colonna vogliamo porre la parola "ali", tutta a sinistra, e la parola "baba" tutta a destra della riga.

In sintesi espongo di seguito la mia elaborazione:
Codice: gambas [Seleziona]

Public Sub Form_Open()

 Dim a, b, c, d As Short


  d = 140

  With GridView1
    .Columns.count = 3
    .Rows.Count = 3
' Dimensioniamo la lunghezza dell'intera prima colonna di 140 pixel:
    .Columns[0].Width = d
  End With


  With GridView1[0, 0]   ' Individuiamo la prima riga della prima colonna
' Impostiamo l'allineamento del testo al suo interno come "centrale":
    .Alignment = Align.Center
' Verifichiamo quanti pixel occupa il carattere di uno "spazio":
    a = .Font.TextWidth(String$(1, Chr(32)))
' Verifichiamo quanti pixel occupa l'intera parola "ali":
    b = .Font.TextWidth("ali")
' Verifichiamo quanti pixel occupa l'intera parola "baba":
    c = .Font.TextWidth("baba")

' Quindi applichiamo, con un po' di alchimia ed intrugli vari, l'elaborazione alla riga prescelta della GridView:
    .Text = "ali" & String$((d - (b + c)) \ a, Chr(32)) & "baba"
  End With

End




...sopravviverò all'ardua sentenza ?  :-X
« 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. »

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: GridView con header, allineamento testo header?
« Risposta #18 il: 20 Novembre 2013, 10:29:28 »
...se si potesse sapere  a priori :hard: da quanti caratteri può essere colmata la riga della GridView....

Non te la prendere vuott: l'ampiezza in pixel della casella incriminata la conosco benissimo, perchè la imposto io nella funzione di costruzione della GridView.  ;D
Però ..., nonostante che non ti abbia comunicato detta ampiezza, mi hai battuto nel tempo; complimenti!  ;D

Pertanto, avendo già nota l'ampiezza della casella da valorizzare, è stato tutto molto più semplice. Riporto la parte di programma così come l'ho modificata:
Codice: gambas [Seleziona]
 iLun = GriTabMovv[iTotRgGri, 2].Font.TextWidth(" ")       'calcola l'impegno in pixel del crt " "
          $StriMia = "Totali pregressi a riporto => SALDO: " & $Valuta & " " & EdtImp.$Imp
          iLunx = GriTabMovv[iTotRgGri, 2].Width                                       ' ampiezza della casella
          iLun1 = GriTabMovv[iTotRgGri, 2].Font.TextWidth($NomeVoce)     ' ampiezza della 1^ stringa
          iLun2 = GriTabMovv[iTotRgGri, 2].Font.TextWidth($StriMia)           ' ampiezza della  2^ stringa
          iDiff = iLunx - (iLun1 + iLun2)
          If iDiff > 0 Then
            $StriMia = $NomeVoce & Space$(iDiff \ iLun) & $StriMia            'Stringa che andrà a riempire la casella
            GriTabMovv[iTotRgGri, 2].Text = $StriMia
          Else
            GriTabMovv[iTotRgGri, 2].Text = $NomeVoce & " /// " & $StriMia     'Stringa che andrà a riempire la casella, nel caso eccezionale che non occorra aggiungere spazi intermedi
          Endif
          GriTabMovv[iTotRgGri, 2].Alignment = Align.Right

L'ho provata e funziona benissimo! D'altronde, dopo il tuo intervento, non poteva essere che così.  :D
Graziiiissime!
 :ciao:
:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: GridView con header, allineamento testo header?
« Risposta #19 il: 20 Novembre 2013, 12:38:23 »
« 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. »