- 日時: 2007/07/15 20:40
- 名前: 花ちゃん
- ***********************************************************************************
* カテゴリー:[グリッド関係][][] * * キーワード:MSHFlexGrid,フレックスグリッド,セルの連結,セルのMerge,, * ***********************************************************************************
--------------------------------------------------------------------------------- No.4023 Re:MSFlexGridセルのマージ 投稿者:ゆう(U) [2002/03/07(木)9:46分] ---------------------------------------------------------------------------------
> MSFlexGridセルのマージを下のようにしたいのですが、余計なところまでマージされてしまったり、 > マージされなかったりなってしまいます。 ┬─────┐ │ │ ├──┬──┤ │ │ │ ┼──┼──┤ こんな感じが最後にあるならプロパティの設定で簡単に 実現可能です。
┬─────┬─ │ │ ├──┬──┤ │ │ │ ┼──┼──┼─ さらに続きがある場合上下のセルのマージには失敗します、 プロパティだけでは回避不可能で、こうしたくとも・・・
┬─────┬─ │ │ ├──┬──┼─ │ │ │ ┼──┼──┼─ こんな感じになってしまいます。
なので、続きの失敗したマージ部分をピクチャボックスで 覆ってしまい、ピクチャボックスにマージ用の絵を表示 するとOKでしょう。
サンプル) MSFlexGrid コントロール1個(MSFlexGrid1) ピクチャボックス コントロール1個(Picture1) Private Declare Function SetParent Lib "user32" _ (ByVal hWndChild As Long, _ ByVal hWndNewParent As Long) As Long Private Const COL_MASK = 10 Private Const COL_CAPTION = "体育" Private Sub Form_Click() Dim lRow As Long, lCol As Long
With MSFlexGrid1 .Rows = 20 '行の総数 .Cols = 11 '列の総数 .FixedRows = 2 '固定行の数 .FixedCols = 1 '固定列の数 .Row = 0 .ColWidth(-1) = 700 '列幅設定 .RowHeight(-1) = 285 '行高さ
'固定行1行目 .TextMatrix(0, 0) = " " .TextMatrix(0, 1) = "国語" .TextMatrix(0, 2) = "算数" .TextMatrix(0, 3) = "理科" .TextMatrix(0, 4) = "理科" .TextMatrix(0, 5) = "理科" .TextMatrix(0, 6) = "社会" .TextMatrix(0, 7) = "英語" .TextMatrix(0, 8) = "英語" .TextMatrix(0, 9) = "英語" .TextMatrix(0, 10) = "体育" .Row = 0 For lCol = 0 To .Cols - 1 .Col = lCol .CellAlignment = flexAlignCenterCenter Next '固定行2行目 .TextMatrix(1, 0) = " " .TextMatrix(1, 1) = "国語" .TextMatrix(1, 2) = "算数" .TextMatrix(1, 3) = "a" .TextMatrix(1, 4) = "b" .TextMatrix(1, 5) = "c" .TextMatrix(1, 6) = "社会" .TextMatrix(1, 7) = "a" .TextMatrix(1, 8) = "b" .TextMatrix(1, 9) = "c" .TextMatrix(1, 10) = "体育" .Row = 1 For lCol = 0 To .Cols - 1 .Col = lCol .CellAlignment = flexAlignCenterCenter Next .MergeRow(0) = True .MergeCol(0) = True .MergeCol(1) = True .MergeCol(2) = True .MergeCol(6) = True .MergeCol(10) = True .MergeCells = 2 'マージの指定
'データ(マージされない事を確認用) For lRow = .FixedRows To .Rows - 1 For lCol = .FixedCols To .Cols - 1 .TextMatrix(lRow, lCol) = "ZZZ" Next Next .Refresh End With 'ピクチャボックスの初期設定 Call iniHead End Sub
'覆ったピクチャボックスの移動 Private Sub MSFlexGrid1_Scroll() With MSFlexGrid1 Picture1.Visible = Not (.LeftCol > COL_MASK) Picture1.Move .ColPos(COL_MASK) + Screen.TwipsPerPixelX, _ .RowPos(0) + Screen.TwipsPerPixelY End With End Sub
'覆うピクチャボックスの初期設定 Private Sub iniHead() Dim sngTpP_X As Single Dim sngTpP_Y As Single Dim strCaption As String
sngTpP_X = Screen.TwipsPerPixelX sngTpP_Y = Screen.TwipsPerPixelY
'SetParentを使うと何かと後の操作が簡単なので・・・ 'SetParentを使わない場合かなり厄介な処理をする必要が出てきます SetParent Picture1.hWnd, MSFlexGrid1.hWnd With Picture1 .AutoRedraw = True .BorderStyle = vbBSNone Set .Font = MSFlexGrid1.Font .BackColor = MSFlexGrid1.BackColorFixed .ForeColor = MSFlexGrid1.ForeColorFixed .Enabled = False .ScaleMode = vbTwips .ZOrder vbBringToFront With MSFlexGrid1 Picture1.Move .ColPos(COL_MASK) + sngTpP_X, _ .RowPos(0) + sngTpP_Y, _ .ColWidth(COL_MASK) - sngTpP_X * 2, _ .RowHeight(0) * 2 - sngTpP_Y * 2 End With .CurrentX = (.ScaleWidth - .TextWidth(COL_CAPTION)) / 2 .CurrentY = (.ScaleHeight - .TextHeight(COL_CAPTION)) / 2 Picture1.Print COL_CAPTION End With End Sub
※国語・算数・理科までは問題なくお任せでマージできますが 社会についてはお任せではマージされません、 英語部分のマージ後の体育はマージされないのでコードで 対応策をとることでマージされたように見えます。
ピクチャボックスはEnabled=Falseで各イベントを直下の コントロールへ透過しています(ヘッダクリック等対応)。
セル幅変更等が必要な場合は自分で組み込んでみて下さい、 かなり面倒と思いますが・・・
|