[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/01/16(Tue) 20:21
投稿者名:7-2/1
Eメール:
URL :
タイトル:
MSFlexGridにチェックボックスを表示するで
MSFlexGridの一番左側にチェックボックスを表示しようとしています。
表示する方法は、このサイトの過去ログを検索し、作ってみました。
MSFlexGridにチェックボックスを表示することはできたのですが、
MSFlexGridの最後に、どうしても、チェックボックスが1個余分に
表示されてしまうのです。
ただ、MSFlexGridに表示するデータはありません。チェックボックス
のみが表示されてしまうのです。

どうしてなのでしょうか。解決策などを教えて欲しいのですが。



以下に、MSFlexGridにチェックボックスを表示するソースを記載します。
------------------------------------------------------------------
Option Explicit

Dim CheckBox_cnt As Long

Private Declare Function SetParent Lib "user32" _
                        (ByVal hWndChild As Long, _
                         ByVal hWndNewParent As Long) As Long
Private Sub Form_Load()
    Call Grid_init
    Call Grid_set
End Sub
Private Sub Grid_init()
    MSFlexGrid1.CellAlignment = 1
    MSFlexGrid1.HighLight = flexHighlightNever
    MSFlexGrid1.Clear
    MSFlexGrid1.Cols = 5
    MSFlexGrid1.Rows = 2
    MSFlexGrid1.TextMatrix(0, 0) = "X"
    MSFlexGrid1.ColWidth(0) = 200
    MSFlexGrid1.TextMatrix(0, 1) = "番号"
    MSFlexGrid1.ColWidth(1) = 900
    MSFlexGrid1.TextMatrix(0, 2) = "名前"
    MSFlexGrid1.ColWidth(2) = 2000
    MSFlexGrid1.TextMatrix(0, 3) = "住所"
    MSFlexGrid1.ColWidth(3) = 4000
    MSFlexGrid1.TextMatrix(0, 4) = "電話番号"
    MSFlexGrid1.ColWidth(4) = 2000
End Sub
Private Sub Grid_set()
Dim lng_I As Long
Dim lng_J As Long
Dim I     As Long

'** エラートラップ開始
  On Error Resume Next

    'Call CheckBox_Clear
    CheckBox_cnt = 0
    lng_I = 0
    lng_J = 0
    
    MSFlexGrid1.ColAlignment(1) = 0

    For I = 0 To 10
        lng_I = lng_I + 1
        MSFlexGrid1.Rows = lng_I + 1

        MSFlexGrid1.TextMatrix(lng_I, lng_J) = "0"
        Call MoveCheck

        MSFlexGrid1.TextMatrix(lng_I, lng_J + 1) = "000001"
        MSFlexGrid1.TextMatrix(lng_I, lng_J + 2) = "山田 太郎"
        MSFlexGrid1.TextMatrix(lng_I, lng_J + 3) = "東京都千代田区大手町"
        MSFlexGrid1.TextMatrix(lng_I, lng_J + 4) = "03-0000-0000"

        CheckBox_cnt = lng_I
    Next
End Sub
Private Sub MoveCheck()
  Const CHECK_COL = 0
  Dim sngTwipsPerPixelX As Single
  Dim sngTwipsPerPixelY As Single
  Dim I As Long, j As Long

  sngTwipsPerPixelX = Screen.TwipsPerPixelX
  sngTwipsPerPixelY = Screen.TwipsPerPixelY

  j = 1
  With MSFlexGrid1
    If .ColIsVisible(CHECK_COL) Then
      I = .Rows - 1
      j = .Rows - 1
        If j > Check1.UBound Then
          Load Check1(j)
          Call SetParent(Check1(j).hWnd, MSFlexGrid1.hWnd)
        End If
        Check1(j).Move .ColPos(CHECK_COL) + sngTwipsPerPixelX, _
                       .RowPos(I) + sngTwipsPerPixelY, _
                       .ColWidth(CHECK_COL) - sngTwipsPerPixelX * 3, _
                       .RowHeight(I) - sngTwipsPerPixelY * 3
        Check1(j).Caption = ""

        If .TextMatrix(I, CHECK_COL) = "1" Then
            Check1(j).Value = 1
        Else
            Check1(j).Value = 0
        End If

        Check1(j).Tag = I
        Check1(j).Visible = True
    End If
    .Refresh
  End With
End Sub
Private Sub CheckBox_Clear()
Dim I As Long

    If CheckBox_cnt >= 1 Then
        For I = 1 To CheckBox_cnt
            Check1(I).Value = False
            Check1(I).Visible = False
            Check1(I).Enabled = True
        Next
    End If
End Sub
------------------------------------------------------------------

投稿時間:2007/01/16(Tue) 21:44
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: MSFlexGridにチェックボックスを表示するで
投稿されたコードを試してみましたが、

画像投稿用掲示板
http://bbs5.aimix-z.com/photovw.cgi?room=vbrescue&image=133.gif

どこに問題があるのでしょうか?

投稿時間:2007/01/16(Tue) 23:29
投稿者名:7-2/1
Eメール:
URL :
タイトル:
Re^2: MSFlexGridにチェックボックスを表示するで
MSFlexGridにデータをすべて表示するのではなく、
立てスクロールが出るぐらいの大きさです。

MSFlexGridの位置を以下のようなときにでました。
  Height:1815
  Left  :120
  Top   :480
  Width :9255

環境は、
 Windows2000
 VB6.0

投稿時間:2007/01/17(Wed) 00:27
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: MSFlexGridにチェックボックスを表示するで
> 立てスクロールが出るぐらいの大きさです。
スクロールした場合チェックボックスを描画し直していますか?
従ってスクロールさせた場合一番上に表示しているチェックボックスがCheck1(0) に
なっているから Check1(10) まで表示するからです

最初のチェックボックスに1個だけチェックを入れてスクロールして見て下さい。

TopRow = Check1(TopRow) にしておかないと。

投稿時間:2007/01/17(Wed) 01:46
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
参考コード
下記コードを追加してみたらどうでしょう。
Check1(1) から作成しているようですがそれでいいのですか? Check1(0) は
まあ、後はお好きなようにして下さい。

Private Sub MSFlexGrid1_Scroll()
   Const CHECK_COL = 0
   Dim sngTwipsPerPixelX As Single
   Dim sngTwipsPerPixelY As Single
   Dim i As Long, j As Long
   sngTwipsPerPixelX = Screen.TwipsPerPixelX
   sngTwipsPerPixelY = Screen.TwipsPerPixelY
   For j = MSFlexGrid1.TopRow To MSFlexGrid1.Rows - 1
      With MSFlexGrid1
         If .ColIsVisible(CHECK_COL) And .RowIsVisible(j) Then
            Check1(j).Move .ColPos(CHECK_COL) + sngTwipsPerPixelX, _
                           .RowPos(j) + sngTwipsPerPixelY, _
                           .ColWidth(CHECK_COL) - sngTwipsPerPixelX * 3, _
                           .RowHeight(j) - sngTwipsPerPixelY * 3
         End If
      End With
   Next j
   MSFlexGrid1.Refresh
End Sub

投稿時間:2007/01/17(Wed) 11:31
投稿者名:7-2/1
Eメール:
URL :
タイトル:
Re: 参考コード - MSFlexGridにチェックボックスを表示するで
>> 立てスクロールが出るぐらいの大きさです。
> スクロールした場合チェックボックスを描画し直していますか?
> 従ってスクロールさせた場合一番上に表示しているチェックボックスがCheck1(0) に
> なっているから Check1(10) まで表示するからです

> 最初のチェックボックスに1個だけチェックを入れてスクロールして見て下さい。
確かに、おかしくなります。
スクロールとかの操作での再描画し直しにつていは、表示が上手く行ったら追加
と考えていました。
実際には、チェックボックスをクリックするので、MSFlexGridの0列に格納して、
再描画するときに、チェックボックスに反映しようと考えていました。

> TopRow = Check1(TopRow) にしておかないと。
これは、どこに位置に、どのタイミングで入れればいいのですか。
MSFlexGridですよね。

> 下記コードを追加してみたらどうでしょう。
> Check1(1) から作成しているようですがそれでいいのですか? Check1(0) は
> まあ、後はお好きなようにして下さい。

参考コードありがとうございます。
上手くいきました。

Check1(1)から作成しているのは、チェックボックスのIndexとMSFlexGridの
データ行の行番号と同期を合わせたいということもあります。
また、チェックボックスコントロール配列を1個作成するために、また、MSFlexGrid
にチェックボックスを割り当てるために、「Check1(0)」をその為に利用している
からです。

「Check1(0)」とかを上手く使ってもできるのですか。
どのようにすればいいのですか。

-----------------------------------------------------------------------------
Option Explicit

Dim CheckBox_cnt As Long

Private Declare Function SetParent Lib "user32" _
                        (ByVal hWndChild As Long, _
                         ByVal hWndNewParent As Long) As Long
Private Sub Form_Load()
    Check1(0).Visible = False
    Call Grid_init
    Call Grid_set
End Sub
Private Sub Grid_init()
    MSFlexGrid1.CellAlignment = 1
    MSFlexGrid1.HighLight = flexHighlightNever
    MSFlexGrid1.Clear
    MSFlexGrid1.Cols = 5
    MSFlexGrid1.Rows = 2
    MSFlexGrid1.TextMatrix(0, 0) = "X"
    MSFlexGrid1.ColWidth(0) = 200
    MSFlexGrid1.TextMatrix(0, 1) = "番号"
    MSFlexGrid1.ColWidth(1) = 900
    MSFlexGrid1.TextMatrix(0, 2) = "名前"
    MSFlexGrid1.ColWidth(2) = 2000
    MSFlexGrid1.TextMatrix(0, 3) = "住所"
    MSFlexGrid1.ColWidth(3) = 4000
    MSFlexGrid1.TextMatrix(0, 4) = "電話番号"
    MSFlexGrid1.ColWidth(4) = 2000
End Sub
Private Sub Grid_set()
Dim lng_I As Long
Dim lng_J As Long
Dim i     As Long

'** エラートラップ開始
  On Error Resume Next

    'Call CheckBox_Clear
    CheckBox_cnt = 0
    lng_I = 0
    lng_J = 0
    
    MSFlexGrid1.ColAlignment(1) = 0

    For i = 1 To 10
        lng_I = lng_I + 1
        MSFlexGrid1.Rows = lng_I + 1

        MSFlexGrid1.TextMatrix(lng_I, lng_J) = "0"
        Call MoveCheck

        MSFlexGrid1.TextMatrix(lng_I, lng_J + 1) = Format$(i, "000000")
        MSFlexGrid1.TextMatrix(lng_I, lng_J + 2) = "山田 太郎"
        MSFlexGrid1.TextMatrix(lng_I, lng_J + 3) = "東京都千代田区大手町"
        MSFlexGrid1.TextMatrix(lng_I, lng_J + 4) = "03-0000-0000"

        CheckBox_cnt = lng_I
    Next
    Debug.Print CheckBox_cnt
End Sub
Private Sub MoveCheck()
  Const CHECK_COL = 0
  Dim sngTwipsPerPixelX As Single
  Dim sngTwipsPerPixelY As Single
  Dim i As Long, j As Long

  sngTwipsPerPixelX = Screen.TwipsPerPixelX
  sngTwipsPerPixelY = Screen.TwipsPerPixelY

  j = 1
  With MSFlexGrid1
    If .ColIsVisible(CHECK_COL) Then
      i = .Rows - 1
      j = .Rows - 1
        If j > Check1.UBound Then
          Load Check1(j)
          Call SetParent(Check1(j).hWnd, MSFlexGrid1.hWnd)
        End If
        Check1(j).Move .ColPos(CHECK_COL) + sngTwipsPerPixelX, _
                       .RowPos(i) + sngTwipsPerPixelY, _
                       .ColWidth(CHECK_COL) - sngTwipsPerPixelX * 3, _
                       .RowHeight(i) - sngTwipsPerPixelY * 3
        Check1(j).Caption = ""

        If .TextMatrix(i, CHECK_COL) = "1" Then
            Check1(j).Value = 1
        Else
            Check1(j).Value = 0
        End If

        Check1(j).Tag = i
        Check1(j).Visible = True
    End If
    .Refresh
  End With
End Sub
Private Sub MSFlexGrid1_Scroll()
   Const CHECK_COL = 0
   Dim sngTwipsPerPixelX As Single
   Dim sngTwipsPerPixelY As Single
   Dim i As Long, j As Long
   sngTwipsPerPixelX = Screen.TwipsPerPixelX
   sngTwipsPerPixelY = Screen.TwipsPerPixelY
   For j = MSFlexGrid1.TopRow To MSFlexGrid1.Rows - 1
      With MSFlexGrid1
         If .ColIsVisible(CHECK_COL) And .RowIsVisible(j) Then
            Check1(j).Move .ColPos(CHECK_COL) + sngTwipsPerPixelX, _
                           .RowPos(j) + sngTwipsPerPixelY, _
                           .ColWidth(CHECK_COL) - sngTwipsPerPixelX * 3, _
                           .RowHeight(j) - sngTwipsPerPixelY * 3
         End If
      End With
   Next j
   MSFlexGrid1.Refresh
End Sub

投稿時間:2007/01/17(Wed) 12:34
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^2: 参考コード - MSFlexGridにチェックボックスを表示するで
私なら、もっと処理を解りやすく分けますが。

1.データの読み込み時に必要数分Check1を作成、データを削除したら削除する
2.CheckBox の表示だけのプロシージャを作成
3.CheckBox のチェックの設定 及び 取得のみのプロシージャを作成
4.Scroll イベントでは、2.を呼ぶ

のような感じにすれば同じような処理を何度も書かなくて済みますし、今後機能を
増やした時にも簡単に対応できます。


>このサイトの過去ログを検索し、作ってみました
どこに掲載させていましたか? ゆう(U)さんがVB初心者友の会にサンプルを投稿されて
いたので、そこを紹介してはいたのですが。(今は閉鎖中)

投稿時間:2007/01/17(Wed) 13:36
投稿者名:7-2/1
Eメール:
URL :
タイトル:
Re^3: 参考コード - MSFlexGridにチェックボックスを表示するで
> 私なら、もっと処理を解りやすく分けますが。
>
> 1.データの読み込み時に必要数分Check1を作成、データを削除したら削除する
データを削除したらとは、データの再読込などですか。
  Check1(i).Value = False
  Check1(i).Visible = False
  Check1(i).Enabled = True
とかですか。

>
> >このサイトの過去ログを検索し、作ってみました
> どこに掲載させていましたか? ゆう(U)さんがVB初心者友の会にサンプルを投稿されて
> いたので、そこを紹介してはいたのですが。(今は閉鎖中)
VB初心者友の会は、以前(閉鎖中になる前)、参照しました。
その折、作ったのですが、中途半端に放っておいたいのを、また作ることになり、
今回、質問しました。

投稿時間:2007/01/17(Wed) 13:54
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^4: 参考コード - MSFlexGridにチェックボックスを表示するで
> > 1.データの読み込み時に必要数分Check1を作成、データを削除したら削除する
> データを削除したらとは、データの再読込などですか。
>   Check1(i).Value = False
>   Check1(i).Visible = False
>   Check1(i).Enabled = True
> とかですか。

じゃなくて、行の削除、追加、違うデータのオープン 等は今後も必要ないのですか?
又、ソート等の事も考えておかなくては。
私には、どのような使い方をされるのか解りませんが、今後の事を考えて置くと
移植や、コピー・ぺでの使用が便利かと思い申し上げた訳です。
(部品として作っておけば、今後、コピペして組み合わせるだけでソフトが作れますよね)

投稿時間:2007/01/17(Wed) 16:08
投稿者名:7-2/1
Eメール:
URL :
タイトル:
Re^5: 参考コード - MSFlexGridにチェックボックスを表示するで
> じゃなくて、行の削除、追加、違うデータのオープン 等は今後も必要ないのですか?
> 又、ソート等の事も考えておかなくては。
> 私には、どのような使い方をされるのか解りませんが、今後の事を考えて置くと
> 移植や、コピー・ぺでの使用が便利かと思い申し上げた訳です。
> (部品として作っておけば、今後、コピペして組み合わせるだけでソフトが作れますよね)

間の抜けた質問ですみません。
花ちゃんが仰っている通りです。
色々と、ご指摘、アドバイスありがとうございます。

投稿時間:2007/01/17(Wed) 14:51
投稿者名:LESIA
Eメール:
URL :
タイトル:
Re^4: 参考コード - MSFlexGridにチェックボックスを表示するで
こういうのはどうでしょうか?
これならチェックボックスコントロールを使わないのでいいかも。

Option Explicit

Private Sub Form_Load()
    Call Grid_init
    Call Grid_set
End Sub

Private Sub Grid_init()
    MSFlexGrid1.CellAlignment = 1
    MSFlexGrid1.FixedCols = 0
    MSFlexGrid1.HighLight = flexHighlightNever
    MSFlexGrid1.Clear
    MSFlexGrid1.Cols = 5
    MSFlexGrid1.Rows = 2
    MSFlexGrid1.TextMatrix(0, 0) = "X"
    MSFlexGrid1.ColWidth(0) = 300
    MSFlexGrid1.TextMatrix(0, 1) = "番号"
    MSFlexGrid1.ColWidth(1) = 900
    MSFlexGrid1.TextMatrix(0, 2) = "名前"
    MSFlexGrid1.ColWidth(2) = 2000
    MSFlexGrid1.TextMatrix(0, 3) = "住所"
    MSFlexGrid1.ColWidth(3) = 4000
    MSFlexGrid1.TextMatrix(0, 4) = "電話番号"
    MSFlexGrid1.ColWidth(4) = 2000
End Sub

Private Sub Grid_set()
    Dim lng_I As Long
    Dim lng_J As Long
    Dim I     As Long

    '** エラートラップ開始
    On Error Resume Next

    lng_I = 0
    lng_J = 0
    
    With MSFlexGrid1
        .ColAlignment(1) = 0

        For I = 0 To 10
            lng_I = lng_I + 1
            .Rows = lng_I + 1

            .Row = lng_I
            .Col = lng_J
            .CellFontName = "Wingdings"
            .CellFontSize = 11
            .Text = Chr$(112) 'UnChecked

            .TextMatrix(lng_I, lng_J + 1) = "000001"
            .TextMatrix(lng_I, lng_J + 2) = "山田 太郎"
            .TextMatrix(lng_I, lng_J + 3) = "東京都千代田区大手町"
            .TextMatrix(lng_I, lng_J + 4) = "03-0000-0000"
        Next
    End With
End Sub

Private Sub MSFlexGrid1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
    If Button = 1 Then
        With MSFlexGrid1
            If .MouseCol = 0 Then
                If .TextMatrix(.MouseRow, .MouseCol) = Chr$(254) Then
                    .TextMatrix(.MouseRow, .MouseCol) = Chr$(112) 'UnChecked
                Else
                    .TextMatrix(.MouseRow, .MouseCol) = Chr$(254) 'Checked
                End If
            End If
        End With
    End If
End Sub

投稿時間:2007/01/18(Thu) 00:58
投稿者名:7-2/1
Eメール:
URL :
タイトル:
Re^5: 参考コード - MSFlexGridにチェックボックスを表示するで
LESIAさん、サンプルコードありがとうございます。
参考にさせていただきます。
で、
   .CellFontName = "Wingdings"
   .CellFontSize = 11
について教えていただきたいのですが、
使ったことがないのですが、
 ・CellFontName は?
 ・Wingdings は?
  ヘルプとかで調べてみたのですが、ありませんでした。


花ちゃんさん、失礼な点、とんちんかな質問にも
親切に答えていただきありがとうございます。

投稿時間:2007/01/18(Thu) 07:50
投稿者名:LESIA
Eメール:
URL :
タイトル:
Re^6: MSFlexGridにチェックボックスを表示
>    .CellFontName = "Wingdings"
>    .CellFontSize = 11
> について教えていただきたいのですが、
> 使ったことがないのですが、
>  ・CellFontName は?
>  ・Wingdings は?
>   ヘルプとかで調べてみたのですが、ありませんでした。

CellFontNameにカーソルを合わせてF1キーを押せば出てくるはずですが…。
左のカテゴリ別サンプル一覧のMSFlexGrid関係の主要プロパティ一覧にも載ってますよ。
Wingdingsはこちらを参考にしてください。&#0112と&#0254が使っている文字コードです。
でも、ここを見ると&#112より&#111の方がいいかもしれないですね。
http://pielin.hp.infoseek.co.jp/fonts/wingdings.html

投稿時間:2007/01/18(Thu) 12:45
投稿者名:7-2/1
Eメール:
URL :
タイトル:
Re^7: MSFlexGridに...
> Wingdingsはこちらを参考にしてください。&#0112と&#0254が使っている文字コードです。
> でも、ここを見ると&#112より&#111の方がいいかもしれないですね。
> http://pielin.hp.infoseek.co.jp/fonts/wingdings.html

LESIAさん、ありがとうございます。
Wingdingsは、絵文字だったんですね。

投稿時間:2007/01/18(Thu) 00:42
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: MSFlexGridにチェックボックスを表示するで
表示するデータ件数が多かったり、編集する必要があるのなら、LESIA さんのコードを
使わせてもらった方がいいかと思いますよ。

# LESIA さんへのお礼も忘れずに。