Newsgroup: it.comp.lang.visual-basic
Titolo: input msflexgrid

è possibile dare dei valori di input a una msflexgrid come se fosse una
textbox? (ie: clicco e scrivo?)
grazie a tutti !



Assolutamente no. L'unico modo è gestire un TextBox, disporlo nella giusta
posizione, renderlo visibile e impostargli il focus.




Avresti del codice di esempio, ho anch'io lo stesso problema (risolto come
hai suggerito tu), ma mi rimane il problema di gestire l'uscita dalla
textbox sul lostfocus e la gestione dei tasti freccia nel textbox per
simulare la "navigazione" nella flexgrid (come fosse una cella normale).
(potresti postarla sul NG, credo interessi anche ad altri)
Grazie in anticipo.
--
Roal Zanazzi
z...@iol.it

Ecco qua. Questo è il meccanismo che ho usato per simulare l'input. Non sarà
il massimo, ma dovrebbe funzionare (io lo uso normalmente nelle mie
applicazioni, se non va è perché mi sono dimenticato di incollare qualche
Sub).
Dim LastRow as Integer
Dim LastCol as Integer
Private Sub Gr_Click()
  PreparaInput Gr, Text1
End Sub
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
Dim Rw as Integer
Dim Cl as Integer
Dim NRw as Integer
Dim NCl as Integer
Dim TopRow as Integer
If Shift <> 0 Then Exit Sub
If (KeyCode >= 37 And KeyCode <= 40) Then
    If Not Text1Valido Then
       KeyCode = 0
       Exit Sub
    End If
End If
Cl = Gr.Col
Rw = Gr.Row
TopRow = Gr.FixedRows
NCl = Gr.Cols
NRw = Gr.Rows
Select Case KeyCode
   Case 37 ' Sinistra
     If Cl = 0 Then
        If Rw - 1 <= TopRow Then
           Cl = 0
           Rw = TopRow
        Else
           Cl = NCl
           Rw = Rw - 1
        End If
     Else
        Cl = Cl - 1
     End If
   Case 38 ' Su
     If Rw - 1 >= TopRow Then
        Rw = Rw - 1
     End If
   Case 39 ' Destra
     If Cl + 1 >= NCl Then
        If Rw + 1 >= NRw Then
        Else
           Cl = 0
           Rw = Rw + 1
        End If
     Else
        Cl = Cl + 1
     End If
   Case 40 ' Giu
     If Rw + 1 < NRw Then
        Rw = Rw + 1
     End If
   Case Else
     Exit Sub
End Select
On Error Resume Next
Gr.Col = Cl
Gr.Row = Rw
Gr_Click     ' Riesegue PreparaInput
  If (KeyCode >= 37 And KeyCode <= 40) Then KeyCode = 0
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer)
  If KeyAscii <> 13 Then Exit Sub
  KeyAscii = 0
End Sub
Sub PreparaInput(Grx As MSFlexGrid, Controllo As Control)
    Dim St As String
    Dim x as Integer, y as Integer
    On Error Resume Next
' Dispone a video il TextBox che riceverà l'input per i
' dati della griglia
    If LastRow > 0 Then Gr.TextMatrix(LastRow, LastCol) = Controllo
    LastCol = Grx.Col
    LastRow = Grx.Row
    x = Screen.TwipsPerPixelX
    y = Screen.TwipsPerPixelY
    Controllo.Height = Grx.RowHeight(Grx.Row) / y - 6
    Controllo.Width = Grx.ColWidth(Grx.Col) / x - 3
    Controllo.Top = Grx.RowPos(Grx.Row) / y + Grx.Top ' + 3
    Controllo.Left = Grx.ColPos(Grx.Col) / x + Grx.Left ' + 3
    Controllo = ""
    Controllo = Grx.Text
    Controllo.Visible = True
    Controllo.SetFocus
    SelectText Controllo
End Sub
Function Text1Valido() As Boolean
  Gr.TextMatrix(LastRow, LastCol) = Text1
' controlli di validità in relazione alla colonna
  Text1Valido = True
End Function
Sub SelectText(ctrIn As Control)
      ctrIn.SelStart = 0
      ctrIn.SelLength = Len(ctrIn.Text)
End Sub

Visto che siamo in argomento. Se a qualcuno può interessare quello che segue
è un esempio di Layout
abbastanza generico di MsFlexgrid.
Questo codice consente di impostare una struttura di dati relativi al
numero, alla dimensione, all'intestazione e all'allineamento delle colonne
MsFlexGrid.
' FRM
Private Sub Form_Load()
' Gr è il controllo MsFlexGrid
  Dim LGrid As LayGrid
  With LGrid
     Set .Grid = Gr
    .AutoWidth = True
    .FixedCols = 0
    .FixedRows = 1
    .HeadGrid(0) = "Data"
    .HeadGrid(1) = "Descrizione"
    .HeadGrid(2) = "T"
    .HeadGrid(3) = "Tempo"
    .ColChar(0) = 8
    .ColChar(1) = 30
    .ColChar(2) = 2
    .ColChar(3) = 4
    .Cols = 4
    .Rows = 32
  End With
  LayOutGrid LGrid
  Set LGrid.Grid = Nothing
End Sub
' ==============================================
' BAS
Type LayGrid
     Grid As MSFlexGrid
     AutoWidth As Boolean ' True = Ridimensionamento colonne automatico,
False = Colonne Fisse (Calcolate in base a ColChar)
     AutoHeight As Boolean ' True = Ridimensionamento Ampiezza Grid
Automatico (non compare la barra verticale), False = Non Ridimensiona
     FixedCols As Integer
     FixedRows As Integer
     ColChar(50) As Single
     AlignCol(50) As Integer
     HeadGrid(50) As String
     Rows As Integer
     Cols As Integer
End Type
Sub LayOutGrid(LGrid As LayGrid)
   On Error GoTo ErG
   Const Car = 150                ' Dimensione inTwips di un carattere
   Dim GW As Long              ' Grid Width
   Dim TotC As Double          ' Totale Ampiezza Calcolata (In %)
   Dim Diff As Double             ' Differenza del totale delle colonne
dall'ampiezza reale
   Dim Percent As Single
   Dim i As Integer, r As Integer
   Dim hGrid As Long
   Dim Df As Double
  With LGrid
   If .Rows = 0 Then .Rows = 1
   Brd = 50
  ' Calcola se viene visualizzata la barra verticale.
  ' Se si, la griglia deve essere ridotta per essere visibile
   If .AutoWidth And Not .AutoHeight And .Grid.RowHeight(0) * .Rows >
(.Grid.Height * Screen.TwipsPerPixelY) Then Brd = 330
   GW = (.Grid.Width * Screen.TwipsPerPixelX) - Brd
' Inizializza la Grid
   .Grid.Cols = .Cols
   .Grid.Rows = .Rows
   .Grid.FixedRows = .FixedRows
   .Grid.FixedCols = .FixedCols
   .Grid.Row = 0
' Calcola la dimensione in Twips e la percentuale di
' occupazione della colonna rispetto all'intera griglia
' (Serve per ridimensionarla)
   For i = 0 To .Cols - 1
       .ColChar(i) = .ColChar(i) * Car
       Percent = (.ColChar(i) * 100) / GW ' % di occupazione
       TotC = TotC + Percent
   Next
  If .AutoWidth Then
' Se il totale delle colonne supera l'ampiezza della griglia la riduce in
percentuale
   If TotC > 100 Then
      Df = TotC - 100 ' % di scostamento dalla dimensione griglia
      For i = 0 To .Cols - 1
          Fat = .ColChar(i)
          .ColChar(i) = Fat - ((Fat * Df) / 100)
      Next
   ElseIf TotC < 100 Then
' Se il totale delle colonne è inferiore all'ampiezza della griglia la
ingrandisce in percentuale
      Df = 100 - TotC       ' % di scostamento dalla dimensione griglia
      For i = 0 To .Cols - 1
          Fat = .ColChar(i)
          .ColChar(i) = Fat + ((Fat * Df) / 100)
      Next
   End If
   For i = 0 To .Cols - 1
       Tc# = Tc# + .ColChar(i)
   Next
'   MsgBox "Colonne: " & Tc# & " - Grid: " & GW
' Predisposizione colonne finale:
' le dimensioni delle colonne sono state
' adattate all'ampiezza totale della griglia
' rispettando le proporzioni delle singole
' colonne
End If
   For i = 0 To .Cols - 1
        .Grid.ColWidth(i) = .ColChar(i)
        .Grid.TextMatrix(0, i) = .HeadGrid(i)
   Next
  If .AutoHeight Then
     For r = 0 To .Rows - 1
         hGrid = hGrid + .Grid.RowHeight(r)
     Next
     .Grid.Height = (hGrid + 50) / Screen.TwipsPerPixelY
  End If
  For r = 0 To .Grid.Rows - 1
      .Grid.Row = r
      For CC% = 0 To .Grid.Cols - 1
          .Grid.Col = CC%
          .Grid.CellAlignment = .AlignCol(CC%)
      Next
  Next
End With
Exit Sub
ErG:
MsgBox "Errore " & Err & " - " & Err.Description
Resume Next
End Sub