ワードラップ時に行の高さを自動調整 |
MSFlexGridでワードラップ時に行の高さを自動調整 (163) | |
Option Explicit 'SampleNo=163 WindowsXP VB6.0(SP5)
2002.07.06 Private Sub Form_Load() With lblTemp 'ラベルを見えない位置に配置 .AutoSize = True .WordWrap = True .Visible = False End With Form1.Move 0, 0, 7400, 4000 'MSFlexGrid の初期設定 With MSFlexGrid1 .Move 200, 200, 6800, 2600 .Rows = 8 '行の総数(固定行含む) .Cols = 6 '列の総数(固定列含む) .WordWrap = True .AllowUserResizing = flexResizeBoth .FixedRows = 1 '固定行の数 Rowsより1以上少ない事 .FixedCols = 1 '固定列の数 Colsより1以上少ない事 .TextMatrix(1, 1) = "あいうえA" .TextMatrix(2, 2) = "あいうえお" .TextMatrix(3, 3) = "あいうえお kakiku keko" .TextMatrix(4, 4) = "あいうえおさしすせそ" End With End Sub Private Sub Command1_Click() 'すべてのセルの高さを自動調整する場合 Call AutoCellHeight(0, 0) End Sub Private Sub Command2_Click() '標準の高さに設定 MSFlexGrid1.RowHeight(-1) = -1 End Sub Private Sub MSFlexGrid1_DblClick() With MSFlexGrid1 Call AutoCellHeight(.Row, .Col) End With End Sub Private Sub AutoCellHeight(MyRow As Long, MyCol As Long) Dim RowStrt As Long 'スタートの列 Dim RowEnd As Long '終りの列 Dim i As Long, j As Long 'ループ用のカウンター Dim TxtHeight As Long '文字の高さ Dim NewHeight As Long '変更後のセルの高さ With MSFlexGrid1 .Visible = False '非表示に(ちらつき防止・処理が早い) RowStrt = MyRow '個別か全体化を判断 RowEnd = MyRow If MyRow = 0 Then '全体の設定の場合 RowStrt = 0 RowEnd = .Rows - 1 End If For i = RowStrt To RowEnd NewHeight = 0 For j = 0& To .Cols - 1 'その行内で一番高いセルを取得 .Row = i .Col = j 'セルとラベルのフォントを同じに設定 lblTemp.FontSize = .CellFontSize lblTemp.FontName = .CellFontName lblTemp.FontBold = .CellFontBold lblTemp.FontItalic = .CellFontItalic 'ラベルに文字列を設定して高さを取得 lblTemp.Caption = .TextMatrix(i, j) lblTemp.Width = .ColWidth(j) - 90 TxtHeight = lblTemp.Height '折返しを含めた高さを取得 If NewHeight < TxtHeight Then NewHeight = TxtHeight '行内で一番高いセルの高さを取得 End If Next j .RowHeight(i) = NewHeight + 40 '余白分をプラスして設定 Next i If MyCol = 0 And MyRow = 0 Then 'ホームポジションへ移動 .Col = .FixedCols .Row = .FixedRows Else .Row = MyRow '元のセル位置に移動 .Col = MyCol - 1 End If .Visible = True End With End Sub |
|
実行結果 ラベルコントロール(lblTemp)を1個見えない所にでも配置して下さい。 セルの内容をラベルに表示して、その時にラベルのサイズをセルに設定する事で 実現しております。 |
|
APIを使った同様のサンプル 別途同様にラベルとテキストボックスが必要です。 |
|
Option Explicit 'SampleNo=163 WindowsXP VB6.0(SP5) 2002.07.06 '指定のウィンドウにメッセージを送る Private Declare Function SendMessage Lib "user32" _ Alias "SendMessageA" (ByVal hwnd As Long, _ ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long 'テキストの行数を取得する定数 Private Const EM_GETLINECOUNT = &HBA Private Sub Form_Load() With txtTemp 'テキストボックスを見えない位置に配置 '.MultiLine = True 別途プロパティで設定しておいて下さい .Visible = False End With With lblTemp 'ラベルを見えない位置に配置 .AutoSize = True .Visible = False End With Form1.Move 0, 0, 7400, 4000 'MSFlexGrid の初期設定 With MSFlexGrid1 .Move 200, 200, 6800, 2600 .Rows = 8 '行の総数(固定行含む) .Cols = 6 '列の総数(固定列含む) .WordWrap = True .AllowUserResizing = flexResizeBoth .FixedRows = 1 '固定行の数 Rowsより1以上少ない事 .FixedCols = 1 '固定列の数 Colsより1以上少ない事 .TextMatrix(1, 1) = "あいうえA" .TextMatrix(2, 2) = "あいうえお" .TextMatrix(3, 3) = "あいうえお kakiku keko" .TextMatrix(4, 4) = "あいうえおさしすせそ" End With End Sub Private Sub MSFlexGrid1_DblClick() With MSFlexGrid1 Call AutoCellHeight(.Row, .Col) End With End Sub Private Sub Command1_Click() 'すべてのセルの高さを自動調整する場合 '起動時データを読込んで表示する場合に Call AutoCellHeight(0, 0) End Sub Private Sub Command2_Click() '標準の高さに設定 MSFlexGrid1.RowHeight(-1) = -1 End Sub Private Sub AutoCellHeight(MyRow As Long, MyCol As Long) Dim RowStrt As Long 'スタートの列 Dim RowEnd As Long '終りの列 Dim i As Long Dim j As Long Dim OldHeight As Long '文字の高さ Dim TxtHeight As Long '文字の高さ Dim NewHeight As Long '変更後のセルの高さ Dim textLine As Long 'ワードラップ後の行数 With MSFlexGrid1 .Visible = False '非表示に(ちらつき防止・処理が早い) RowStrt = MyRow '個別か全体化を判断 RowEnd = MyRow If MyRow = 0 Then '全体の設定の場合 RowStrt = 0 RowEnd = .Rows - 1 End If For i = RowStrt To RowEnd NewHeight = 0 For j = 0& To .Cols - 1 'その行内で一番高いセルを取得 .Row = i .Col = j 'セルのフォントとテキストボックスのフォントを同じに設定 txtTemp.FontSize = .CellFontSize txtTemp.FontName = .CellFontName txtTemp.FontBold = .CellFontBold txtTemp.FontBold = .CellFontItalic 'セルの幅とテキストボックスの幅を同じに設定 txtTemp.Width = .ColWidth(j) lblTemp.FontSize = .CellFontSize txtTemp.Text = .TextMatrix(i, j) lblTemp.Caption = .TextMatrix(i, j) OldHeight = lblTemp.Height '文字の高さを取得 textLine = SendMessage(txtTemp.hwnd, EM_GETLINECOUNT, 0&, 0&) TxtHeight = textLine * OldHeight If NewHeight < TxtHeight Then NewHeight = TxtHeight '行内で一番高いセルの高さを取得 End If Next j .RowHeight(i) = NewHeight + 40 '余白分をプラスして設定 Next i If MyCol = 0 And MyRow = 0 Then 'ホームポジションへ移動 .Col = .FixedCols .Row = .FixedRows Else .Row = MyRow '元のセル位置に移動 .Col = MyCol - 1 End If .Visible = True End With End Sub |
|
こちらは、セルの内容をテキストボックスに表示し、APIを使ってテキストボックスの行数を求め セルの高さを設定しております。 どちらのサンプルも一つのセルの内容を変更したら、その行のすべての列のセルの内容を調べ 一番行が高い値に設定しております。でないと高く変更された場合は問題ないのですが、低く 変更された場合は、どの列のセルが一番高いか調査し直さなければ、低く変更出来ないからです 作成してから、MSの方に同様のサンプルがありましたが、セル個別しか変更出来ないし、個別 にフォントの設定がされていれば、うまく機能しないようです。 私のサンプルも、セルをマージしていたらどうなるかは、確認していません。 |
2002/07/06