Microsoft Grid Control (grid32.ocx)

Hallo,
ich möchte das Grid-Control verwenden, um eine kleine Liste für den User anzuzeigen.

Jetzt ist es aber so, dass es in ein oder mehreren Zellen zu ein oder mehreren Zeilenumbrüchen kommen kann, weil der Text teilweise etwas länger ist.

Wie kann ich die Höhe der einzelnen Zeilen automatisch anpassen?!?

sanx from michL

Hi michL!

Schau dir mal in der Online-Hilfe für das MSGrid die Liste der „Eigenschaften“ an (ein MSGrid auf eine Form legen, Grid anklicken, Taste F1 drücken, dann auf „Eigenschaften“ bzw. „Properties“ klicken).
Da gibt es eine Eigenschaft namens „RowHeight“.
Diese Eigenschaft verändert die Höhe einer Zeile im Grid (siehe bei Bedarf auch bei „ColWidth“ nach - das ist die Spaltenbreite).
Da jede Zeile eine andere Höhe haben kann, muß die Zeile bei Ansprache der RowHeight-Eigenschaft vorgegeben werden, also:

Grid1.RowHeight(0) =

setzt die Zeile 0 (= 1.Zeile des Grid) auf den entsprechenden Wert.

Steht aber auch alles in der Online-Hilfe (siehe auch den Programm-Code unter „Beispiel“ bei der „RowHeight“-Online-Hilfe).

Gegenfrage: Online-Hilfe nie benutzt?

Grüße
Siegfried

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Grid1.RowHeight(0) =
setzt die Zeile 0 (= 1.Zeile des Grid) auf den entsprechenden
Wert.

Uuuhhhyyyeeeaaahh … so weit war ich auch schon. Das Problem liegt darin, wie Hoch die Zeile (Zelle) sein muss, wenn die Zellen-Breite FIX ist, der Text der drinnen steht aber gaaaaanz Lang ist und einen Umbruch produziert. Ich möchte den ganzen Text sehen. Wenn die Zeilen-Höhe (Zellen-Höhe) zu klein ist, schneidet „er“ mir den Text unten ab.

Steht aber auch alles in der Online-Hilfe (siehe auch den
Programm-Code unter „Beispiel“ bei der
„RowHeight“-Online-Hilfe).
Gegenfrage: Online-Hilfe nie benutzt?

Das war aber jetzt gemein, oder?!?

Hoffe, ich habe mich jetzt verständlicher ausgedrückt!

sanx from michL

Hallo Sigfried,

schätze mal, das Problem liegt etwas woanders, die Frage war nämlich, wie man die Höhe der Zeilen automatisch anpassen kann. Das scheint VB nicht zu beherrschen.

Manuell wird es schwieriger, weil bei einem serifenlosen Font die genaue Textbreite nicht bekannt ist, ab welcher umgebrochen wird. Abhilfe würde hier z.B. Courier bringen, da kann man dann aus der Zahl der Buchstaben die benötigte Zeilenzahl und damit die Höhe der Zelle bestimmen. Ist natürlich immernoch von Hand und schaut wahrscheinlich nicht so toll aus.

Soll es „perfekt“ sein, könntest Du eine unsichtbare PictureBox erstellen, in dieser den Font genauso einstellen wie im Grid und mittels der .TextWidth-Eigenschaft die Breite des Textes ermitteln. Wenn Du diese durch die Breite Deiner Grid-Column teilst, erhältst Du die Zahl der Zeilen resp. die benötigte Höhe.

Das musst Du dann halt für alle Zellen in einer Schleife durchführen …

Hoffe, das hilft.

Gruß

Sculpture

danke für die Unterstützung…
…wenigstens weiss ich jetzt, dass ich meine Probleme doch noch halbwegs richtig formulieren kann!

Danke für Deinen Tipp … so etwas ähnliches habe ich auch gefunden:
Mit der API-Funktion „DrawText()“ und dem Parameter „DT_CALCRECT“ glaube ich, dass man was halbwegs vernünftiges anfangen kann. Scheint mir aber ziemlich kompliziert zu sein.

Ich dachte, es weiss vielleicht einer eine einfachere Lösung … etwa wie:
SendMessage(Grid1.hwnd, GRID_FITROWHEIGHT, …) :smile:

greets from michL (vienna)

hallo nix ist so einfach:

Public Function pTextHeight(ByVal hwnd&, Optional ByVal Tx$ = " ", Optional ByVal Width& = -1, _
Optional ByVal Cal& = DT_CALCRECT Or DT_WORDBREAK) As Long
Dim hdc&, t As RECT, hFnt&

hdc = GetDC(hwnd): t.Right = IIf(Width = -1, 20, Width)
hFnt = SendMessage(hwnd, WM_GETFONT, 0, ByVal &H0)
hFnt = SelectObject(hdc, hFnt)
pTextHeight = DrawText(hdc, Tx, Len(Tx), t, Cal)
SelectObject hdc, hFnt
ReleaseDC hwnd, hdc
End Function

1 Like

ich glaube die function ist etwas besser geeignet, da flexgid unterschiedliche font eigenschaften hat.

Friend Function TextCalRect(ByVal Font As IFont, ByVal Flag&, ByVal lWidth&, ByVal Tx As Variant, _
Optional ByVal sFormat$, Optional lHeight&, Optional ByVal bSetWidth As Boolean = True) As RECT
Dim thFnt&, t$, hFnt&, w&

If Font Is Nothing Then hFnt = m_hFntDefault Else hFnt = Font.hFont
If sFormat = „“ Then t = Tx Else t = Format(Tx, sFormat)
thFnt = SelectObject(m_hdc, hFnt)
With TextCalRect
.Right = lWidth
lHeight = (2 * ewTx) + DrawText(m_hdc, t, -1, TextCalRect, Flag Or EditCal)
If bSetWidth Then .Right = lWidth
End With
SelectObject m_hdc, thFnt
End Function

allso pussle dir was passendes zusammen, kann ja nun nicht mehr allso schwer sein.

volker

1 Like

… absolut cool!!!

Habe es gleich ausprobiert … funktioniert ausgezeichnet. Man muss sich, glaube ich, eine Picture-Box zu Hilfe nehmen und das Ergebnis von Pixel in Twips umwandeln. Der Font sollte, nehme ich an, auch der gleiche sein - sowohl PictureBox als auch Grid.

sanx from michL

PS: So verwende ich es:

strBuf = "Das ist ein gaaaanz gaanz langer Text"
Me.Grid1.RowHeight(1) = Me.pTextHeight(Me.Picture1.hwnd, strBuf, Me.Grid1.ColWidth(1) / Screen.TwipsPerPixelX) \* Screen.TwipsPerPixelY

dein gid1 müßte aber auch ein [hwnd] haben, das kannst du auch nehmen.

Optional ByVal Width& = -1 [in pixel]

Da kann ich nicht ganz folgen, entweder ist me.gid1(0).colwidth in pixel, warum wndelst du mit doch was um ?

mit der function pTextHeight berücksichtigst zu aber nicht die Font der cell !!!

volker

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Da kann ich nicht ganz folgen, entweder ist
me.gid1(0).colwidth in pixel, warum wndelst du mit
doch was
um ?

ganz einfach: Deine Function erwartet sich Pixel. Das Property „.ColWidth(n)“ sind aber Twips (oder das, was man bei ScaleMode eingestellt hat). Daher dividiere ich durch „Screen.TwipsPerPixelX“.

Deine Function liefert mir die Höhe in Pixel. Das Property „.ColHeight(n)“ erwartet sich aber Twips. Daher mulitipliziere ich mit „Screen.TwipsPerPixelY“.

Habe das ganze mittlerweile in die Function selber integriert. d.h. die Function arbeitet jetzt mit Twips (obwohl es intern nach wie vor mit Pixel gerechnet wird).

mit der function pTextHeight berücksichtigst zu aber nicht die
Font der cell !!!

Korrekt … man muss wissen, welcher Font in der Cell verwendet wird. Bei der Grid32.ocx ist es aber leicht. Da kann man nur den Font für das ganze Control setzen und nicht für jede Cell einzeln (glaube ich jedenfalls).

However … funktioniert bestens!!
sanx from michL