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:
Hier die modifizierte Routine ' 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 Dieser Tipp wurde bereits 24.793 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
sevISDN 1.0 Überwachung aller eingehender Anrufe! Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Tipp des Monats April 2024 Skyfloy Chart von Microsoft und dazu noch gratis Tutorial für Microsoft Chart Controls für Microsoft .NET Framework 3.5 sevAniGif (VB/VBA) Anzeigen von animierten GIF-Dateien Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |