Visual Basic 中学校 掲示板 投稿内容
タグのない投稿を抽出 統計 RSS

Visual Basic 中学校 > 投稿一覧 >

テキストファイルの内容を1行ずつ改行して表示できるかについて

タグの編集...

投稿者   (高校生)   投稿日時 2016/8/19 10:48:23
ボタンをクリックしたらテキストファイルの内容を1行ずつ、なおかつ改行して表示するということをしたいのですが、どうすればできるでしょうか。

投稿者 (削除されました)   ()   投稿日時 2016/8/19 11:50:05
(削除されました)

投稿者 魔界の仮面弁士   (社会人)   投稿日時 2016/8/19 12:15:39
用途が良く分かりませんが、
TextBox か RichTextBox に読み込んで
スクロールバーでは駄目なのでしょうか。


> 改行して表示するという
読み込むのは、ボタンを押すごとに一行ずつなのですね。
そして、その一行のデータを改行して表示するということは、
折り返し表示を行いたい……ということでしょうか。

だとしたら、Label を AutoSize = False で貼っておけば
自動的に折り返し表示になりますよ。


> どうすればできるでしょうか。 
やり方はいろいろあると思いますが、一例として:
Public Class Form1
    Private txtFile As String
    Private nextLine As IEnumerator(Of String) = Nothing
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        OpenFileDialog1.Filter = "Text Files (.txt)|*.txt|All Files (*.*)|*.*"
        OpenFileDialog1.FilterIndex = 1
        Label1.Text = ""    'ここに一行ずつ表示  
        Button1.Text = "ファイル選択"
        Button2.Text = "次の行"
        Button2.Enabled = False
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If OpenFileDialog1.ShowDialog() = DialogResult.Cancel Then
            Return
        End If
        Button2.Enabled = False
        If nextLine IsNot Nothing Then
            nextLine.Dispose()
            nextLine = Nothing
        End If
        Try
            txtFile = OpenFileDialog1.FileName
            nextLine = System.IO.File.ReadLines(txtFile, System.Text.Encoding.GetEncoding("Shift_JIS"))
            If nextLine.MoveNext() Then
                Button2.Enabled = True
                Button2.PerformClick()
            Else
                Label1.Text = ""
                MessageBox.Show("ファイルが空です""Info", _
                        MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If
        Catch ex As System.IO.IOException
            nextLine = Nothing
            Dim er = "ファイル[" & txtFile & "]を読み込めません。" & vbCrLf & ex.ToString()
            MessageBox.Show(er, "Error", _
                    MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        If nextLine Is Nothing Then
            MessageBox.Show("ファイルが読み込まれていません。""Warning", _
                   MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            Return
        End If
        Label1.Text = nextLine.Current
        Button2.Enabled = nextLine.MoveNext
    End Sub
End Class


投稿者   (高校生)   投稿日時 2016/8/19 12:46:56
説明が足りませんでした。
表示したいのはラベルにではなく、ピクチャーボックスにです。

投稿者   (社会人)   投稿日時 2016/8/19 12:52:28
テキストボックスで改行したいのは、テキストボックスに文字を打つと、一番右まで行くと下の行に行きますが、表示をしても下の行に行った文字は、下に表示されず、右側に行ってしまう現象があります。
それを直したいので、テキストボックスで改行したいのです。
ピクチャーボックスに表示するときに、テキストボックスに入っているテキストファイルの内容を改行できればそれでもいいのですが…

投稿者 魔界の仮面弁士   (社会人)   投稿日時 2016/8/19 14:31:38
> 表示したいのはラベルにではなく、ピクチャーボックスにです。 

そこは是非、自分でトライしてみてください。

ファイルからの読み込みサンプルは提示していますし、
ピクチャーボックスへの表示は、今まで何度も行っていましたよね。


> テキストボックスで改行したいのは
「テキストボックスで改行したい」という話は初耳なんですが…。(^^;


> 表示をしても下の行に行った文字は、下に表示されず、右側に行ってしまう現象があります。
ということは、TextBox の MultiLine を True にしているのですよね。


> テキストボックスに文字を打つと、一番右まで行くと下の行に行きますが、
TextBox の WordWrap が True だと、右端で折り返されます。


> それを直したいので
TextBox の WordWrap が False だと、そのまま折り返されずに続きます。
この時、ScrollBars プロパティの設定によっては、水平スクロールバーが表示されることもあります。


逆に、任意の位置で改行したいのであれば、
下記のリスト5のように、改行させたい場所に
vbCrLf あるいは vbNewLine を挿入すれば OK です。
http://homepage1.nifty.com/rucio/main/dotnet/ClassLibrary/L006_System.Windows.Forms.TextBox.htm

vbCrLf は、先のサンプルでもメッセージボックスの改行に使っていますね。



> テキストボックスに入っているテキストファイルの内容を改行できればそれでもいいのですが… 

TextBox でワードラップ(自動折り返し)されている場所に
改行文字を挿入したいのであれば、下記のようにします。


①ソリューション エクスプローラーでプロジェクトを
 右クリックし、[追加]-[モジュール]を選択します。


②追加する項目が「モジュール」になっていることを確認したら、
 ファイル名を「TextBoxExtensions.vb」にして追加します。


③追加された Module を、下記のコードで置き換えます。

Module TextBoxExtensions
    ''' <summary> 
    ''' 複数行テキストボックスの折り返し位置に、ソフト改行を挿入します 
    ''' </summary> 
    <System.Runtime.CompilerServices.Extension()>
    Public Sub InsertSoftLineBreak(ByVal txt As TextBox)
        SendMessageW(txt.Handle, EM_FMTLINES, New IntPtr(1), IntPtr.Zero)
    End Sub

    ''' <summary> 
    ''' 複数行テキストボックスからソフト改行を削除します 
    ''' </summary> 
    <System.Runtime.CompilerServices.Extension()>
    Public Sub RemoveSoftLineBreak(ByVal txt As TextBox)
        SendMessageW(txt.Handle, EM_FMTLINES, IntPtr.Zero, IntPtr.Zero)
        txt.Refresh()
    End Sub

    Private Declare Unicode Function SendMessageW Lib "user32" _
        (ByVal hWnd As IntPtr, ByVal wMsg As Integer, _
         ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
    Private Const EM_FMTLINES As Integer = &HC8
End Module



④MultiLine と WordWrap の両方が True な TextBox に対して
 『TextBox1.InsertSoftLineBreak()』を実行してみてください。
 現在の折り返し部分に「ソフト改行」が挿入されます。

 本当の改行箇所である「ハード改行」は『vbCr & vbLf』の
 ままですが、折り返し位置には『vbCr & vbCr & vbLf』が
 ソフト改行として挿入されるようになっています。

 また、『TextBox1.RemoveSoftLineBreak()』を実行すれば、
 挿入済みのソフト改行がまとめて削除されます。