ワードラップ時に行の高さを自動調整
                                                         玄関へお回り下さい。
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