MSFlexGrid

5Rad

Mitglied
Hi liebe Programmierergemeinde,

Ich hab en kleines Prob mti meinem MSFlexGrid, und zwar möchte ich dort eingaben machen und dass die Zellengröße sich richtig anpasst.

Ich bekomm es hin dass sich meine Zellen den Inhalt anpassen ...

ich bekomm es auch hin das ich Eingaben im MSFlexGrid machen kann

aber wie kombiniere ich diese zwei nützlichen Eigenschaften?


Code:
Public Function Grid_AutoSize(oGrid As MSFlexGrid, oLabel As Label)
  Dim nRow As Long
  Dim nCol As Long
  Dim nWidth As Long
  Dim nMaxWidth As Long

  ' Setzen der Eigenschaften
  With oLabel
    ' Wichtig!
    .WordWrap = False
    .AutoSize = True
  End With

  ' Auswerten und Setzen der Grössen
  With oGrid
    For nCol = 0 To .Cols - 1
      nMaxWidth = 0 ' .ColWidth(nCol)
      .Col = nCol
      For nRow = 0 To .Rows - 1
        .Row = nRow
        ' Prüfen der Zellenformatierung und setzen der Eigenschaften für diese Zelle
        With oLabel.Font
          .Name = oGrid.CellFontName
          .Size = oGrid.CellFontSize
          .Bold = oGrid.CellFontBold
          .Italic = oGrid.CellFontItalic
          .Strikethrough = oGrid.CellFontStrikeThrough
          .Underline = oGrid.CellFontUnderline
        End With
        oLabel.Caption = .TextMatrix(nRow, nCol)
        nWidth = oLabel.Width
        If nWidth + 100 > nMaxWidth Then nMaxWidth = nWidth + 100
      Next nRow

      .ColWidth(nCol) = nMaxWidth
    Next nCol
  End With
End Function
Code zum Zellen anpassen

Code:
rivate Sub MSFlexGrid1_Click()
  Call SizeText
  Text1.Visible = True
  Text1.SetFocus
End Sub

Private Sub MSFlexGrid1_GotFocus()
  MSFlexGrid1_RowColChange
End Sub

Private Sub MSFlexGrid1_LeaveCell()
  MSFlexGrid1.Text = Text1.Text
End Sub

Private Sub MSFlexGrid1_RowColChange()
  Static OldRow%, OldCol%, Change As Boolean
   
    If Change Then Exit Sub
    Change = True
     
    With MSFlexGrid1
      If .Col <> OldCol Or .Row <> OldRow Then
        OldRow = .Row
        OldCol = .Col
        
        Call SizeText
        Text1.Visible = True
        Text1.SetFocus
      End If
    End With
  Change = False
End Sub

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
  With MSFlexGrid1
    Select Case KeyCode
    
      Case vbKeyRight
        If .Col + 2 > .Cols And .Row + 1 < .Rows Then
          .Col = 1
          .Row = .Row + 1
        ElseIf .Col + 1 < .Cols And .Row < .Rows Then
         .Col = .Col + 1
        End If
      
      Case vbKeyUp
        If .Row - 1 > 0 Then .Row = .Row - 1
      
      Case vbKeyDown, vbKeyReturn
        If .Row + 1 < .Rows Then .Row = .Row + 1
      
      Case vbKeyLeft
        If .Col - 1 = 0 And .Row - 1 <> 0 Then
          .Col = .Cols - 1
          .Row = .Row - 1
        ElseIf .Col - 1 <> 0 Then
          .Col = .Col - 1
        End If
      End Select
    End With
    MSFlexGrid1_RowColChange
End Sub

Private Sub Text1_KeyPress(KeyAscii As Integer)
  If KeyAscii = vbKeyReturn Then KeyAscii = 0
  If KeyAscii = vbKeyTab Then
    Call Text1_KeyDown(vbKeyRight, 0)
    KeyAscii = 0
  End If
End Sub

Private Sub Text1_LostFocus()
  Text1.Visible = False
  Call MSFlexGrid1_RowColChange
  
End Sub

Private Sub SizeText()
  With MSFlexGrid1
    Text1.Text = .Text
    Text1.FontSize = .Font.Size
    Text1.Height = .CellHeight
    
    If .CellLeft + .CellWidth > .Width Then
     Text1.Width = .Width - .CellLeft
    Else
      Text1.Width = .CellWidth
    End If
    
    Text1.Left = .CellLeft + .Left
    Text1.Top = .CellTop + .Top
  End With
End Sub
Code zum Eingeben ins MsFlexGrid

Kann mir vielleicht jemand helfen?

Vielen liebe Dank im voraus

lg
Piti
 
Du hast das ja schon ziemlich umfangreich gemacht.

Wenn Du Deine Autosize-Funktion (die derzeit in nirgends aufgerufen wird) in das KeyPress-Ereignis einbaust, wird das Grid automatisch bei Betätigung der Entertaste automatisch angepasst.

Code:
Private Sub Text1_KeyPress(KeyAscii As Integer)
  If KeyAscii = vbKeyReturn Then
      Call Grid_AutoSize(MSFlexGrid1, Label1)
      KeyAscii = 0
  End If
  If KeyAscii = vbKeyTab Then
    Call Text1_KeyDown(vbKeyRight, 0)
    KeyAscii = 0
  End If
End Sub

Ich würde an Deiner Stelle in die Autosize-Funktion aber noch einbauen, dass eine minimale Spaltenbreite nicht unterschritten wird, bei leeren Spalten sieht das sonst ein bißchen blöd aus, und man kann da auch schlecht reinschreiben.

Selbstverständlich kannst Du die Autosize-Funktion natürlich auch bei normaler Eingabe aufrufen, dann wird die Spalte automatisch beim tippen größer oder kleiner. Jedoch wirkt dies am Bildschirm dann vielleicht etwas unruhig. Aber das hängt davon ab, was Du mit dieser Funktion anfangen willst.

Viele Grüsse
Ronald
 
Sorry das ich jetzt erst schreib,

Danke dir funktioniert einwandfreie...
frag mich grad warum ich da drauf net kam ...
(Vor lauter Bäume sieht man de Wald net)

nochmals Danke
 
Zurück