Toon posts:

[vb6] flexgrid uitlijnen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo mensen, ik zit met een vraagje...ik gebruik een flexgrid in mijn vb projectje. Die ziet er als volgt uit:

Afbeeldingslocatie: http://home.quicknet.nl/qn/prive/y.paap.aalten/Temp/S1.JPG

Nu moet de gebruiker eerst de tabellen telkens met de muis vergroten om alle tekst te zien die zich in een regel bevind. Iedere keer als er gerefreshd wordt moet de gebruiker dit weer opnieuw doen, vrij irritant. Weet iemand misschien een manier om de flexgrid automatisch uit te lijnen? Zie:

Afbeeldingslocatie: http://home.quicknet.nl/qn/prive/y.paap.aalten/Temp/S2.JPG

Ik zat te denken aan zoiets als:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Option Explicit

Public Sub Resize(Flx As MSFlexGrid)
    
On Error GoTo Fout
    
    Dim Dat1 As String
    Dim RijTel As Integer
    Dim ColTel As Integer
    
    ColTel = Flx.Cols - 1 'Tel aantal cols
    Do While ColTel > 0
        
        RijTel = Flx.Rows - 1 'Tel aantal rows
        Do While RijTel > 0
            Dat1 = Flx.TextMatrix(RijTel, ColTel)
            If Len(Dat1) * 35 > Flx.ColWidth(ColTel) Then
                'Breedte van de col aanpassen
                Flx.ColWidth(ColTel) = Len(Dat1) * 35
            End If
            RijTel = RijTel - 1
        Loop
        
        ColTel = ColTel - 1
    Loop

Exit Sub
Fout:
    'Melding
    
End Sub


Maar dit werkt helaas niet :|

[ Voor 44% gewijzigd door Verwijderd op 24-09-2004 19:34 ]


  • DukeMan
  • Registratie: Mei 2000
  • Niet online
je kan in code de breedte van een kolom instellen van een flexgrid. Als een kolom standaard een bepaalde waarde bevat (bv datum) is de benodigde breedte redelijk te voorspellen. Dan kan je deze vanuit code instellen.

Verwijderd

Topicstarter
NTGiant schreef op 27 september 2004 @ 12:02:
je kan in code de breedte van een kolom instellen van een flexgrid. Als een kolom standaard een bepaalde waarde bevat (bv datum) is de benodigde breedte redelijk te voorspellen. Dan kan je deze vanuit code instellen.
En welke code zou dit dan moeten zijn? Want zoals je in mijn stukje code ziet doe ik ook iets dergelijks. Maar het werkt niet, dus wat doe ik dan fout? :/

  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Je hebt de functie TextWidth() die je terug geeft hoeveel Twips een bepaald stukje tekst in beslag neemt. Zit alleen een nadeel aan, het werkt alleen binnen een form en met het lettertype van het form.

Stel dat je grid Arial, 12pt gebruikt en het form MS Sans Serif, 10pt dan zal TextWidth de width terug geven voor een MS Sans Serif, 10pt lettertype. Dat kan je natuurlijk omzeilen door het lettertype van het form op te slaan, het lettertype van de grid toe te wijzen aan het form, width berekenen en vervolgens weer het originele lettertype terug zetten :)

  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Er is trouwens ook nog een andere manier, heb je een API-call voor nodig. In de onderstaande routine kun je zien hoe je 'em kunt gebruiken om de tekstbreedte te berekenen.

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Public Sub SetListBoxHScroll(ByRef objListbox As Object, ByRef OwnerForm As Object)
'-------------------------------------------------------------------------------
' SetListBoxHScroll (Sub)
'  Zet de horizontale scrollbar voor een listbox zodat alle tekst in de listbox
'  te lezen is.
'
' Scope : Public
'
' Parameter(s):
'  {in/out} objListbox  (OBJECT)
'    add comment here
'  {in/out} OwnerForm   (OBJECT)
'    add comment here
'-------------------------------------------------------------------------------
  Dim lngLoop     As Long
  Dim rcText      As RECT
  Dim lngVScroll  As Long
  Dim lngWidth    As Long
  Dim lngMaxWidth As Long
  Dim tmpFont     As TFontSetting
  
  'Controleer of objListbox wel een Listbox is. Dit kan helaas niet voor
  'OwnerForm omdat typename de benaming van het form is en niet een universele
  'benaming
  If (TypeName(objListbox) = "ListBox") Then
    'Bewaar de font instelling van het scherm
    tmpFont.FontName = OwnerForm.FontName
    tmpFont.FontSize = OwnerForm.FontSize
    tmpFont.FontBold = OwnerForm.FontBold
    'Geef het form dezelfde font instellingen als de listbox, dit omdat via het
    'form de lengte van de tekst wordt berekend. Als het font van het form
    'anders is dan dat van de listbox dan zullen de waarden niet kloppen
    OwnerForm.FontName = objListbox.FontName
    OwnerForm.FontSize = objListbox.FontSize
    OwnerForm.FontBold = objListbox.FontBold
    'Haal op hoeveel pixels de verticale scrollbar breed is
    lngVScroll = GetSystemMetrics(SM_CXVSCROLL)
    'Doorloop alle items in de listbox
    For lngLoop = 0 To objListbox.ListCount - 1
      'Laat Drawtext bepalen hoeveel pixels de tekst in beslag neemt
      Call DrawText(OwnerForm.hdc, objListbox.List(lngLoop), -1&, rcText, DT_CALCRECT)
      'Bereken de totale lengte voor de tekst
      lngWidth = rcText.Right + lngVScroll
      'Lengte bewaren als het de grootste waarde tot nu toe is
      If lngWidth > lngMaxWidth Then lngMaxWidth = lngWidth
    Next
    'Zet de lengte van de langste tekst als uitgangspunt voor de scrollbar
    Call SendMessageLong(objListbox.hwnd, LB_SETHORIZONTALEXTENT, lngMaxWidth, ByVal 0&)
    'Geef het form weer zijn eigen font terug
    OwnerForm.FontName = tmpFont.FontName
    OwnerForm.FontSize = tmpFont.FontSize
    OwnerForm.FontBold = tmpFont.FontBold
  End If
End Sub

Verwijderd

Topicstarter
Lorn schreef op 28 september 2004 @ 08:49:
Er is trouwens ook nog een andere manier, heb je een API-call voor nodig. In de onderstaande routine kun je zien hoe je 'em kunt gebruiken om de tekstbreedte te berekenen.
Waar haal je die 'TFontSetting' vandaan?
code:
1
Dim tmpFont     As TFontSetting

Edit:

Lama, ik had em al, dit werkt ook:
code:
1
Dim tmpFont     As TextBox


Enfin, ik weet nu hoe je de breedte van een tekst kunt berekenen. Maar nu weet ik nog niet hoe je die dan moet gebruiken om de breedte van de cols aan te passen. De stukken code die hier staan aangegeven werken niet, de cols blijven gewoon 'cropped', hetzelfde... :'(

[ Voor 46% gewijzigd door Verwijderd op 29-09-2004 12:36 ]


Verwijderd

Topicstarter
Aha! Ik ben er achter wat ik fout deed. De onderstaande code werkt (als voorbeeld):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Option Explicit

Public Sub FlxResize(Flx As MSFlexGrid, Owner As Form)
    
    Dim Dat1 As String
    Dim Dat2 As Long
    Dim RijTel As Integer
    Dim ColTel1 As Integer
    Dim ColTel2 As Integer
    
    ColTel1 = 1
    ColTel2 = Flx.Cols - 1 'Tel aantal cols
    Do While ColTel2 > ColTel1 - 1
        
        RijTel = Flx.Rows - 1 'Tel aantal rows
        Do While RijTel > 0
            Dat1 = Flx.TextMatrix(RijTel, ColTel1)
            'If Len(Dat1) * 115 > Flx.ColWidth(ColTel1) Then
            Dat2 = Owner.TextWidth(Dat1)
            If Owner.TextWidth(Dat1) + 100 > Flx.ColWidth(ColTel1) Then
                'Breedte van de col aanpassen
                Flx.ColWidth(ColTel1) = Owner.TextWidth(Dat1) + 100
                Flx.Refresh
            End If
            RijTel = RijTel - 1
        Loop
        
        ColTel1 = ColTel1 + 1
    Loop
    
End Sub


Bedenkt wel: De Font van het opgegeven Form moet dezelfde zijn als de opgegeven textbox, ander kloppen de waarden niet. Mzzlss

[ Voor 23% gewijzigd door Verwijderd op 29-09-2004 14:52 ]

Pagina: 1