Rubrik: Controls · MSFlexGrid/DataGrid | VB-Versionen: VB6 | 10.10.01 |
FlexGrid - Spaltenbreiten autom. festlegen Füllt ein FlexGrid Control mit dem Inhalt einer Textdatei und legt automatisch die Spalten und Spaltenbreiten fest. | ||
Autor: Dieter Otter | Bewertung: | Views: 24.801 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Unser gestriger Tipp hat gezeigt, wie sich ein FlexGrid Control automatisiert mit dem Inhalt einer Ascii-Textdatei füllen lässt, wobei alle benötigten Spalten automatisch erstellt wurden.
Siehe hierzu auch: FlexGrid mit dem Inhalt einer Textdatei füllen
Jetzt könnte man natürlich das ganze noch steigern. Wie wäre es denn, wenn nicht nur die Anzahl der Spalten automatisch ermittelt werden, sondern auch gleich noch die Spaltenbreite automatisch festgelegt wird? Bisher hatten ja alle Spalten immer die gleiche Breite.
Die nachfolgende Prozedur ersetzt die Prozedur aus dem vorigen Tipp (s.o.), und zwar lässt sich als zusätzlicher Parameter angeben, ob:
- die optimale Spaltenbreite eingestellt werden soll (d.h. die einzelnen Spalten sind immer so breit, dass auch der längste Eintrag innerhalb einer Spalte noch vollständig angezeigt wird)
- oder ob die einzelnen Spalten prozentual an die aktuelle Anzeigebreite des Flexgrids angepasst werden sollen
Hier die modifizierte Routine
(alle Änderungen gegenüber dem gestrigen Tipp sind rot hervorgehoben)
' Füllt ein FlexGrid Control mit dem Inhalt einer ' Textdatei (z.B. Adressen) ' ' "WithHeader" gibt an, ob die erste Zeile die ' Feldbeschreibung (Feldnamen) enthält (True), oder ' nicht (False) ' ' Über "FieldSep" kann das Feld-Trennzeichen ' festgelegt werden (Vorgabe: Semikolon) ' ' Sind Felder durch Anführungszeichen eingeschlossen, ' werden diese automatisch entfernt. ' ' Zusätzlich werden die Spaltenbreiten des Grid-Controls ' automatisch anhand der gelesenen Daten eingestellt ' "MaxWidth" : 0 = optimale Spaltenbreite (Vorgabe) ' > 0 = maximale Anzeigebreite ' ====================================================== Private Sub FillFlexGrid(ByVal sFilename As String, _ ByVal WithHeader As Boolean, _ Optional ByVal FieldSep As String = ";", _ Optional MaxWidth As Long = 0) Dim F As Integer Dim sLine As String Dim nCols As Long Dim lRow As Long Dim lPos As Long Dim FieldName As String Dim I As Integer Dim sText() As String Dim ColumnsWidth As Long Dim iProz As Integer Dim lWidth() As Long With MSFlexGrid1 ' zunächst FlexGrid löschen .Rows = 0: .Cols = 0 ' Textdatei öffnen und erste Zeile einlesen F = FreeFile Open sFilename For Input As #F ' Einlesen bis Dateiende While Not EOF(F) Line Input #F, sLine If Trim$(sLine) <> "" Then ' Zeilenzähler erhöhen lRow = lRow + 1 .Rows = .Rows + 1 ' einzelnen Datenfelder ermitteln sText = SplitLine(sLine, FieldSep) ' Bei der ersten eingelesenen Zeile werden ' die Grid-Spalten festgelegt If lRow = 1 Then nCols = UBound(sText) ReDim lWidth(nCols - 1) .Cols = nCols .Row = 0 ' Erste Zeile = Feldbeschreibung? If WithHeader Then ' Spalten anhand der Feldbeschreibung ' beschriften For I = 1 To nCols .Col = I - 1 .Text = sText(I) ' Spaltenbreite If Me.TextWidth(.Text) > lWidth(.Col) Then _ lWidth(.Col) = Me.TextWidth(.Text) Next I Else ' Spalten als "Feld1", "Feld2", usw. ' beschriften For I = 1 To nCols .Col = I - 1 .Text = "Feld " & Format$(I + 1) ' Spaltenbreite If Me.TextWidth(.Text) > lWidth(.Col) Then _ lWidth(.Col) = Me.TextWidth(.Text) Next I .Rows = .Rows + 1 End If End If ' Daten dem Grid hinzufügen If (lRow > 1) Or (lRow = 1 And Not WithHeader) Then .Row = .Rows - 1 For I = 1 To UBound(sText) If I > nCols Then Exit For .Col = I - 1 .Text = sText(I) ' Spaltenbreite If Me.TextWidth(.Text) > lWidth(.Col) Then _ lWidth(.Col) = Me.TextWidth(.Text) Next I End If End If Wend ' Textdatei schliessen Close #F ' zunächst die reel benötigte Gesamtbreite ermitteln ColumnsWidth = 0 For I = 0 To .Cols - 1 ' kleine Zugabe pro Spalte: 105 Twips lWidth(I) = lWidth(I) + 105 ColumnsWidth = ColumnsWidth + lWidth(I) Next I ' Anzeigebreite für alle Spalten insgesamt If MaxWidth = 0 Then MaxWidth = ColumnsWidth ' Jetzt die prozentuale Breite der einzelnen Spalten ' aufgrund der maximal verfügbaren Anzeigebreite ' berechnen und die Spaltenbreiten entsprechend ' setzen. For I = 0 To .Cols - 1 iProz = Int(lWidth(I) / ColumnsWidth * 100 + 0.5) .colWidth(I) = Int(MaxWidth / 100 * iProz + 0.5) Next I End With End Sub
Beispiel für den Aufruf der Funktion:
' optimale Spaltenbreiten FillFlexGrid App.Path & "\Adressen.txt", True, vbTab, 0 ' Spalten prozentual an die aktuelle ' Anzeigenbreite des FlexGrids anpassen FillFlexGrid App.Path & "\Adressen.txt", True, vbTab, _ MSFlexGrid1.Width