横にスクロール

解決


初心者  2003-07-19 08:33:12  No: 78720

いつもお世話になります。
MSHFlexGridを使用してデータ表示を行っております。
通常ですと、データのサイズは10バイトくらいのデータなのですが、
たまに200バイトくらいのデータがあります。
その歳に横にスクロールをすれば最後のデータまで見れるようにしたいの
ですが上手くいきません。
グリッドの幅はかなり確保しています。
出来ればフォームのサイズを変えずに水平のスクロールバーで、
レコードの最後を見れるようにしたいのですが、MSHFlexGridで可能でしょうか?
エクセルとかみたいに出来ればと思っています。
お手数ですが、ご教授をよろしくお願いします。


魔界の仮面弁士  2003-07-19 09:22:06  No: 78721

プログラムで横スクロールを行いたい、という事でしょうか。
もしそうならば、LeftColプロパティを指定すればOKです。


初心者  2003-07-19 15:05:28  No: 78722

魔界の仮面弁士さん、有難うございます。
説明不足でした。
例.
グリットには"1234567890abcdefghijklmno"
①1234567890←最初の表示
②横スクロールバーを右に
③567890abcde←見える状態
④横スクロールバーを最後までドラック
⑤・・・klmno←見える状態
1番目のデータから見れてもかまわないのですが、フォームのサイズは大きくしたく
ないのです。

以上よろしくお願いします。


oku  URL  2003-07-19 23:29:57  No: 78723

文章を読む限り、(横スクロールバーと言われてるので)
> プログラムで横スクロールを行いたい、という事でしょうか。
としか思えませんが…
それとも列の幅を変えたいって事?
それなら、ColWidthをいじってやれば良いですけど。


初心者  2003-07-20 03:46:06  No: 78724

すみません。説明が下手で
使用しているのはグリッドなんですが、
フォーム(全体の画面)をそんなに大きく出来ないのです。
それで横スクロール(グリッドの)で画面全体のサイズを変えずに、
一番右のデータまで見れるようにしたいのです。
カラムのサイズは充分取っていますし、入力データもちゃんと入っています。
ところが横スクロールバーを最後までドラックしても最後(付近)のデータが、
見れないのです。(エクセルとか見れますよね。)
申し訳ありません、よろしくお願いします。


oku  URL  2003-07-20 06:31:27  No: 78725

一番右にスクロールしても
一番右のセルに入っているテキストが
全部見えないって事ですね。
うーん  やっぱり一番右の列の幅が足らないだけのような…
試しに一番右の列の幅を増やしてみて下さい。


初心者  2003-07-20 20:56:46  No: 78726

幅は確保しております。
またグリッドにそのデータは、
全部入っております。
例.
form1.MSFHlexGrid1.ColWidth(2) = 200000 '取りすぎですかね。
buff = "1234567890・・・・・0"  '300文字くらいセットします
form1.MSFHlexGrid1.TextMatrix(i+1,2) = Buff  'ちゃんとデータは入っています
その後表示したのですが、
一番右にスクロールして途中までしか表示されないんです。
よろしくお願いします。


oku  URL  2003-07-21 09:26:25  No: 78727

うーん、さすがに300文字位にすると見えませんね。
どーもフォームのサイズより
大きいセルは見えないみたいですね。
フォームを最大化しても300文字は収まりきれないので無理でした。
フォントサイズを小さくすれば見えましたが…。
エクセルでも見えませんでした。(フォントサイズにもよるんでしょうが)
テキストボックスなどに表示するなどの逃げしかないですかね?


Say  2003-07-21 16:41:50  No: 78728

PictureBoxコントロール上に配置して
スクロールバーが出現しないぐらいに
GridのWidth,Heightを十分にとって、
ScrollBarコントロールで自前でスクロールすればいいのでは?


初心者  2003-07-21 21:07:46  No: 78729

Sayさん、ありがとうございます。
やってみたのですが、40バイトまでしか、
出来ませんでした。
300文字は不可能でしょうか?
widthは充分だと思うんですけど・・・


Say  2003-07-22 00:32:54  No: 78730

MSFlexでもMSHFlexでも
Width(ColWidthの合計)が245745twip以下なら
表示すると思いますが?

Option Explicit
Private Const cUSEFLEX As String = "HFLex" '←"HFlex"にすればHFlexを表示
Private Const clngCOLMAX As Long = 11
Dim WithEvents Flex1 As MSFlexGridLib.MSFlexGrid
Dim WithEvents HFlex1 As MSHierarchicalFlexGridLib.MSHFlexGrid
Dim WithEvents Pic1 As PictureBox
Dim WithEvents HScr1 As HScrollBar
Dim WithEvents VScr1 As VScrollBar
Dim mobjFlex As Object
Dim mlngScaleH As Long
Dim mlngScaleV As Long
Private Function fncSetText() As String
    Dim i As Long
    Dim lngLen As Long
    lngLen = (2 ^ (clngCOLMAX - 1)) + 100
    Dim buff As String
    buff = Space(lngLen + 4)
    For i = 0 To lngLen Step 4
        Mid(buff, i + 1, 4) = Right("000" & CStr(i), 3) & ","
    Next
    fncSetText = buff
End Function
Private Sub SetFlex(obj As Object, strText As String)
    Dim i As Long
    Dim j As Long
    Dim strBuf As String
    Dim lngWidthBuf As Long
    With obj
        Set .Font = Me.Font
        .Cols = clngCOLMAX
        .Rows = 100
        .FixedCols = 1
        .FixedRows = 1
        lngWidthBuf = 350
        .Height = .RowHeight(0) * .Rows + lngWidthBuf
        For i = 0 To .Cols - 1
            strBuf = Left(strText, 2 ^ i + 10)
            .ColWidth(i) = Me.TextWidth(strBuf & "A")
            lngWidthBuf = lngWidthBuf + .ColWidth(i)
            .TextMatrix(0, i) = "フィールド" & CStr(i)
            For j = 1 To .Rows - 1
                If i = 0 Then
                    .TextMatrix(j, i) = j
                Else
                    .TextMatrix(j, i) = strBuf
                End If
            Next
        Next
        .Width = lngWidthBuf
        .TextMatrix(0, 0) = .Name
    End With
End Sub

Private Sub Form_Load()
'    Dim i As Long
'    Dim j As Long
    Dim strText As String
'    Dim strBuf As String
'    Dim lngWidthBuf As Long
    Set Pic1 = Me.Controls.Add("VB.PictureBox", "Pic1")
    Set Flex1 = Me.Controls.Add("MSFlexGridLib.MSFlexGrid", "Flex1", Pic1)
    Set HFlex1 = Me.Controls.Add("MSHierarchicalFlexGridLib.MSHFlexGrid", "HFlex1", Pic1)
    Set HScr1 = Me.Controls.Add("VB.HScrollBar", "HScr1")
    Set VScr1 = Me.Controls.Add("VB.VScrollBar", "VScr1")
    strText = fncSetText()
    With Pic1
        .Width = Me.ScaleWidth - HScr1.Height
        .Height = Me.ScaleHeight - VScr1.Width
        .Left = 0
        .Top = 0
        .Visible = True
    End With
    Call SetFlex(Flex1, strText)
    Call SetFlex(HFlex1, strText)
    With HScr1
        .Width = Pic1.Width
        .Left = Pic1.Left
        .Top = Pic1.Height
        mlngScaleH = ((Flex1.Width - Pic1.Width) \ 32768) + 1
        .Max = ((Flex1.Width - Pic1.Width) \ mlngScaleH) + 1
        .LargeChange = Pic1.Width \ mlngScaleH
        .SmallChange = 1
        .Visible = True
    End With
    With VScr1
        .Height = Pic1.Height
        .Left = Pic1.Width
        .Top = Pic1.Top
        mlngScaleV = ((Flex1.Height - Pic1.Height) \ 32768) + 1
        .Max = ((Flex1.Height - Pic1.Height) \ mlngScaleV) + 1
        .LargeChange = Pic1.Height \ mlngScaleV
        .SmallChange = 1
        .Visible = True
    End With
    If cUSEFLEX = "FLex" Then
        Set mobjFlex = Flex1
    Else
        Set mobjFlex = HFlex1
    End If
    mobjFlex.Visible = True
End Sub
Private Sub HScr1_Change()
    mobjFlex.Left = -HScr1.Value * mlngScaleH
End Sub
Private Sub VScr1_Change()
    mobjFlex.Top = -VScr1.Value * mlngScaleV
End Sub


初心者  2003-07-22 05:45:55  No: 78731

Sayさん、どうもありがとうございます。
参考にさせていただきます。


初心者  2003-07-23 06:24:44  No: 78732

Sayさんokuさん、ありがとうございました。
何とかいろいろとやっていたら上手く行きました。
本当に良いアドバイスを有難うございました。
今後ともよろしくお願いします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加