Newsgroup: it.comp.lang.visual-basic
Titolo: [?] MsHFlexGrid: rimane una riga vuota con AddItem (+ altre)

Ciao a tutti.
La situazione e' questa: ho una MsHFlexGrid con 4 colonne. La sto
popolando da codice inserendo delle righe che leggo da un file di
testo. Il file di testo e' l'output di un altro programma che scrive,
in ogni riga, 4 stringhe separate da tabulazione.
Allora, per popolare la griglia, mi sono venute in mente 2
possibilita':
- possibilita' macchinosa ma funzionante: leggo una stringa, faccio lo
split, leggo i campi uno alla volta e li scrivo usando la proprieta'
.textmatrix(row,col). Pero' e' macchinosa e non particolarmente veloce
- possibilita' semplicissima ma non funzionante: leggo una stringa e
la do' in pasto al metodo AddItem.
Preferirei, per evidenti ragioni di leggibilita' e semplicita', usare
il secondo metodo.
Il problema, pero', e' che mi rimane una riga vuota in cima alla
griglia. Ho bisogno di avere .fixedrows=1 perche' voglio che la
descrizione delle colonne resti sempre disponibile in cima alla
griglia anche quando scrollo verso il basso con la vscrollbar e
quindi, per avere .fixesrows=1 devo partire con .rows=2 per forza.
Quando faccio la prima .additem, pero', la prima riga rimane vuota e
la riga aggiunta dal metodo viene posta *sotto* quella gia' esistente.
Naturalmente, la prima riga non ho trovato nessun modo per toglierla
in seguito :|
Un metodo davvero machiavellico potrebbe essere di fare lo split della
prima stringa e l'additem delle successive, ma e' una soluzione
talmente raffazzonata che vorrei evitarla.
Il codice che uso e' questo:
*****
Sub ApriTabella(NomeFile As String)
Dim Documento As frmModificaTabelle
Dim fd As Byte
'Dim tmpStringa As String     'per il debug fa sempre comodo
'Dim Contatore As Byte     'nessuna procedura ne puo' fare a meno
'Dim Riga As Integer
Dim Codice As String
'Dim Campi() As String
    Set Documento = New frmModificaTabelle
'tenere presenti le funzioni split() e dir()!!!
 
    With Documento.gridTabella
        .Rows = 2
        .FixedRows = 1
        .TextMatrix(0, 0) = "Pos."
        .TextMatrix(0, 1) = "Codice"
        .TextMatrix(0, 2) = "Q.tà"
        .TextMatrix(0, 3) = "Descrizione"
        .ColWidth(0) = 525
        .ColWidth(1) = 990
        .ColWidth(2) = 525
        .ColWidth(3) = 5835
        .ColAlignment(0) = flexAlignLeftCenter
        .ColAlignment(1) = flexAlignCenterCenter
        .ColAlignment(2) = flexAlignCenterCenter
        .ColAlignment(3) = flexAlignLeftCenter
    End With
'meglio guardare cosa succede, poi sara' da mettere    
'    Documento.gridTabella.Redraw = False
 
    'Contatore = 1
 
'soluzione sborellante
    fd = FreeFile
    Open NomeFile For Input As #fd
        Do While Not (EOF(fd))
            Debug.Print "EOF(fd) = "; EOF(fd)
            Line Input #fd, Codice
            Debug.Print "Codice  = "; Codice
            With Documento.gridTabella
                .AddItem (Codice)
            End With
        Loop
    Close #fd
'soluzione prematurata
    fd = FreeFile
    Open NomeFile For Input As #fd
        Do While Not (EOF(fd))
            Debug.Print "EOF(fd) = "; EOF(fd)
            Line Input #fd, Codice
            Debug.Print "Codice  = "; Codice
            Campi = Split(Codice, vbTab, 4, vbBinaryCompare)
            With Documento.gridTabella
                .AddItem (Codice)
                Contatore = Contatore + 1
                .Rows = Contatore + 1
                .TextMatrix(Contatore, 0) = Campi(0)
                .TextMatrix(Contatore, 1) = Campi(1)
                .TextMatrix(Contatore, 2) = Campi(2)
	'sarebbe troppo intelligente che split togliesse
	'il cr-lf in fondo...
                .TextMatrix(Contatore, 3) = Left(Campi(3), _
			Len(Campi(3)) - 1)
            End With
        Loop
    Close #fd
*****
Altra domanda: muovendo il cursore con le frecce, oppure cliccando
sopra una cella col mouse, viene evidenziata la riga. Questo mi va
bene perche' ho scelto come tipo di selezione quella per righe. La
cella su cui posiziono il cursore o su cui clicco, pero', viene
evidenziata in colore diverso, il che non va sempre bene. Qualcuno era
riuscito a colorare tutta la riga dello stesso colore, ma io non trovo
piu' quel post. Come potrei fare?
Ultima domanda --per ora--: vorrei che *durante* lo scoll col mouse
con la barra di scroll verticale la griglia scrollasse: c'e' modo di
farlo? Ho provato a mettere .scrollbars uguale a none, pero' in quel
modo la griglia non scorre piu' da nessuna parte in nessun caso,
nemmeno imponendo un valore ben preciso a .toprow. Dunque cade la
possibilita', a cui avevo pensato, di usare una scrollbar esterna per
imporre un certo valore di .toprow. Avete qualche idea per risolvere
questo problema? La sporca soluzione che ho trovato e' di sovrapporre
una vscrollbar a quella della mshflexgrid, ma e' davvero lorda :)
Se ho ben capito, inoltre, .row e .rowsel dovrebbero permettermi di
posizionare il cursore su una certa riga e di selezionarla. Pero',
stranamente, impostando i valori da codice non compare il rettangolo
di selezione attorno alle celle di mio interesse. Qualcuon ha qualche
idea?
Ad esempio, mi aspetterei che con un:
    gridTabella.Row = VScrollGriglia.Value
    gridTabella.RowSel = VScrollGriglia.Value
mi venisse evidenziata la linea numero VScrollGriglia.Value, ma cosi'
non avviene.
Saluti.
-- 
      Gianni "bugbarbeq" Rondinini, 25, RA, 0.68, 152
  VBR - Vero Birro Romagnolo®, diffidate dalle imitazioni!
Nike Air Up Tempo Sad Walker -- Kawasaki "Gas Gas" ZZ-R 1100
 ICQ# 36893168 - IRCNet: bugbarbeq, @ on #linux-it & #NetBSD
   On contrary of popular belief, Unix *IS* user friendly:
    it just appears to be selective who it is friend with

 ha scritto nel messaggio
news:0qt3tt8oer30kbtd6...@4ax.com...


     End With
<Ri-CUTTONE>
Per gli altri è tardi e ho sonno, ma velocemente posso dirti che la
colorazione la risolvi, ma lo scroll... è un pò più dura, dovrei provare ma
non ho tempo.
Ciao,
Dads.
P.S.: Non esagerare con le pretese dai controlli standard...

 farlo?
.ScrollTrack = True
-- 
Samuele Battarra
prova il mio newsreader:
http://digilander.iol.it/battarsa/programmi/news/

 quindi, per avere .fixesrows=1 devo partire con .rows=2 per forza.
if FG.rows>2 then
    FG.removeitem 1
end if

 piu' quel post. Come potrei fare?
Questa soluzione funziona !
Private Sub FlexLog_Click()
   Dim Riga As Integer
   Dim I    As Integer
  '---  PrecRigaLog č una variabile comune a livello di Form
   Riga = FlexLog.Row
   '--- Evidenziazione delle righe
   If Riga >= 1 And Riga <= FlexLog.Rows - 1 Then
      '--- ripristino il colore bianco della precedente riga
      FlexLog.Row = PrecRigaLog
      For I = 0 To FlexLog.Cols - 1
         FlexLog.col = I
         FlexLog.CellBackColor = vbWhite
      Next I
      '--- Evidenzio la riga su cui ho fatto click
      FlexLog.Row = Riga
      For I = 0 To FlexLog.Cols - 1
         FlexLog.col = I
         FlexLog.CellBackColor = vbRed
      Next I
      PrecRigaLog = Riga
   End If
End Sub
Ciao
Ugo