改行させるには?

解決


新人A  2005-12-20 11:38:24  No: 129060

はじめまして。
いきなりですが質問があります。
Visual Studio 6.0で、テキストボックスに入力した文字をボタンを押すことにより他のテキストボックスに次々表示させるプログラムを作成しております。その時の条件として、

・入力された文に”。”がある場合は”。”以降を改行して次の行に表示
・20文字を超える文は20文字目以降を改行して次の行に表示
・10行目までは行が増えるが、11行目を表示する場合は1行目を削除し10行目に表  示

とあります。今は改行のところをやっておりまして、”。”を判断させて改行させたいのですがまったくできない状況です。
言葉足らずで申し訳ありませんが、この質問にお答えいただければ光栄です。
よろしくお願いいたします。


いな  2005-12-20 11:49:06  No: 129061

>とあります。今は改行のところをやっておりまして、”。”を判断させて改行させたいのですがまったくできない状況です。

Replace関数を用いて、

"。"を改行文字列(vbCrLF)に置換すると
ぐちゃぐちゃ細かいことを考えなくても簡単だよね?

まぁ、
・20文字を超える文は20文字目以降を改行して次の行に表示
などはまた別途考慮すればよいと思うけれど。


ガッ  2005-12-20 11:59:50  No: 129062

えーと、例えば
「012345678901234567890。。。」
とか入力された場合は
「01234567890123456789<改行>0。<改行>。<改行>。<改行>」
と、"素直に"なるわけですか?
Replace$()を使えばできる…かな。
何か弊害があれば、Mid$()でゴリゴリ書くといいと思います。

…ためしに動きそうなのを作ってみました。
Function foo(ByVal Text As String) As String
    '文字列連結を大量に使っているので遅いです
    Dim spl As Collection   '1行ごとに格納するコレクション
    Dim v   As Variant      '一般変数
    Dim i   As Long         '一般変数
    Dim st  As String       '一般変数
    
    '1 "。"を"。"+vbNewLineにする
    Text = Replace$(Text, "。", "。" & vbCrLf)
    
    '2 20文字連続して改行が存在しない場合は、強制的に改行をいれる
    Set spl = New Collection
    For Each v In Split(Text, vbCrLf)
        If Len(v) <> 0 Then '!空行は抜く
            For i = 1 To Len(v) Step 20
                st = Mid$(v, i, 20) '20文字ずつ抜き出す
                If Len(st) > 0 Then
                    '抜き出した文字列が空以外の場合は加える
                    spl.Add st
                End If
            Next
        End If
    Next
    
    '最後の10行を戻り値にする
    i = spl.Count - 10
    If i < 1 Then i = 1
    For i = i To spl.Count - 1
        foo = foo & spl(i) & vbCrLf
    Next
    foo = foo & spl(spl.Count)
    
End Function

※動作保障はしません。
  …出遅れた(orz


新人A  2005-12-20 12:08:39  No: 129063

ものすごくすばやい対応に驚きと感謝の気持ちでいっぱいです。
一度試してみます。


新人A  2005-12-20 13:35:07  No: 129064

ガッさん。やってみましたが動きませんでした。
ちなみにボタンを押した時にその作業がおこなわれるので、

    Private Sub Command1_Click()

    End Sub

この中に入れればいいわけですか?
初心者過ぎてもうしわけないです↓


ぶぶ  2005-12-20 14:51:03  No: 129065

横からですが・・・
動かないとはどういうふうに動かないのでしょう?
コードは提示されているのですから、ステップ実行したりしてみましたか?

表示するテキストボックスのMultiLineプロパティはTrueになっていますか?
ボタンクリックで動作させるのであれば

    Private Sub Command1_Click()

    End Sub
の中に記述すればいいと思います。がんばってくださいね(^-^)


新人A  2005-12-20 15:25:42  No: 129066

ぶぶさんありがとうございます☆
ガっさんのソースを

    Private Sub Command1_Click()

    End Sub
に入れてみたんですが、End  Sub  がありません  みたいなことを言われてしまいます><で、指定の場所にEnd  Sub  入れたら、End Functionがありませんといわれます><;あるんですけどないことになるんです。入れ方がまずいんだと思いますが、初心者なものでして、まったくわかりません。


matsu  2005-12-20 15:55:41  No: 129067

fooという文字列を返すファンクションなので、
Private Sub Command1_Click()
    テキストボックス.Text = foo(テキストボックス.Text)
End Sub
こういう使い方でいいと思います。


新人A  2005-12-20 17:28:30  No: 129068

matsuさんありがとうございます。
実行してみたとこ、”。”で改行され、20文字で改行されます。
しかし、

・10行目までは行が増えるが、11行目を表示する場合は1行目を削除し10行目に表示

ができませんでした><。あと追加で、

・前に入力した文が20文字に達してない場合は次の文はその続きから書く

だそうです。つまり、5文字先に書いて表示させてあったら、次の文字は6文字目から20文字目まで表示。あまったら次の行へ。といった具合です><
わかるかたいらっしゃいましたらよろしくお願いいたします。


技術以外のアドバイス  2005-12-20 17:55:33  No: 129069

今までの応用なんですから少しはご自分で努力されたらいかがですか?
もし、努力した結果で分からない事があれば、何がどう分からないのかを明確にしましょう。
そうすれば求める回答が早く得られると思いますし、書いているうちに自分で気付くことがあるかもしれません。
質問の仕方のテクニックもついでに身に付けましょう。


新人A  2005-12-21 09:22:16  No: 129070

はい。ごもっともです。いろいろ調べながら手探りでやっております。それでもわからずここに書き込んだのですが、虫が良すぎなのはわかっています。あの後も考えて試してみたのですが、どうしてもわかりません。もしよろしければヒントでいいので教えてもらえないでしょうか??><


ガッ  2005-12-21 11:15:47  No: 129071

> いろいろ調べながら手探りでやっております。
> それでもわからずここに書き込んだのですが、虫が良すぎなのはわかっています。
…"それでもかかわらず"?……気にしないで置こう…

> あの後も考えて試してみたのですが、どうしてもわかりません。
(あの後)どのように試して、何が分からないのですか?
事実を伝えない限り、何も伝わりませんー

> もしよろしければヒントでいいので教えてもらえないでしょうか??><
ヒントは私のコード。あれ以上実装したら完成してしまいます。
ですが、最後に追加された「前に入力した文が20文字に達してない場合は次の文はその続きから書く」
に関しては、結構いじくらないといけないと思います。
こういう場合は、メソッドで機能を作るのではなく、クラスで機能を作ってください。
そうすれば、"前"という状態が把握しやすくなりますから。

私がコード載せたのが悪かったなぁ…
(一部勘違いして「10行越えたら最後の10行を出力」していますが(orz

※昨日、学校でPrologの演習させられた…
  今分かるのは逐次型言語って最高、ということ(ororz
  長文失礼しました


新人A  2005-12-21 11:39:00  No: 129072

ガッさん、長文ありがとうございます。><
今わからないのは、

・前に入力した文が20文字に達してない場合は次の文はその続きから書く

のところで、あとのところは自力で9割がた完成しました。皆様のおかげです。
なんとか頑張ってみます。


新人A  2005-12-21 15:58:58  No: 129073

今必死に作業中です。こんな感じで作ってみましたら、エラーはでないんですけど動作がおかしいモノが出来上がってしまいました><。

Private Sub Command1_Click()

    Dim strKAKU     As String
    Dim lngKAKU2    As Long
    Dim strCHA      As String
    Dim lngP        As Long
    Dim lngK        As Long
    Dim lngMORE     As Long
    Dim lngAHU      As Long

'エラー表示
    If Me.Text1.Text = "" Then
        MsgBox "文字を入力してください"
        Me.Text1.SetFocus
    End If

'半角全角を判断する
    strBIT = StrConv(strBIT, vbFromUnicode)
    strBIT = LenB(strBIT)
        
    If strBIT = 1 Then
        LngHZ = 1
    Else
        LngHZ = 2
    End If

'”。”があったら改行させる
    Text1.Text = Replace$(Text1.Text, "。", "。" & vbCrLf)

'20文字すぎたら改行させる
    For P = 1 To Len(Text1.Text) Step 20
        Text2.SelText = Mid$(Text1.Text, P, 20) & vbCrLf
    Next P

'改行回数の計算
    K = KAI + KAI2
        
'あふれ処理
    If K >= 10 Then
        AHU = K - 10
        For MORE = 0 To AHU
            KAKU = Me.Text2.Text
            KAKU2 = InStr(1, KAKU, Chr(13), 1)
            KAKU = Mid(KAKU, KAKU2 + 1)
            KAI = KAI - 1
            Me.Text2.Text = Replace(KAKU, KAKU, "")
            CHA = KAKU
            Me.Text2.Text = Me.Text2.Text & CHA
        Next MORE
    End If

    Me.Text1.Text = ""
    Me.Label4.Caption = ""
    Me.Label5.Caption = ""
    KAI = KAI + KAI2
    KAI2 = 0
    
End Sub
-----------------------------------------------------------
Private Sub Command2_Click()
    End
End Sub
-----------------------------------------------------------
Private Sub Command3_Click()

'すべてのテキストボックスの内容をクリアする

    Dim ctrLoop As Control
    
    For Each ctrLoop In Me.Controls
    
        If TypeOf ctrLoop Is TextBox Then
        
            ctrLoop.Text = ""
        
        End If
        
    Next
    
End Sub
-----------------------------------------------------------
Private Sub Text1_Change()

    Dim strBIT As String
    
    Me.Label4.Caption = Len(Me.Text1.Text)
    strBIT = StrConv(Me.Text1.Text, vbFromUnicode)
    Me.Label5.Caption = LenB(strBIT)

End Sub

無駄な処理、謎な処理、かなりボロクソ言われて直しています。
そしていまだに

・前に入力した文が20文字に達してない場合は次の文はその続きから書く

はできていません。どう直せばいいかわかる方いらっしゃいませんか??><。


ガッ  2005-12-21 17:43:00  No: 129074

うーん…やっぱり下手に載せたのが悪かったかも


> どう直せばいいかわかる方いらっしゃいませんか??><。
それはもー、仕様書とにらめっこしてください ('A`)
…目先真っ暗なのに当てずっぽうにコーディングしているわけではないですよね…


> 前に入力した文が20文字に達してない場合は次の文はその続きから書く
前にも書きましたが、「前」という状態は「何かを記憶しておく部分が必要」になります。
(ちょうど今"前にも書いた"事を思い出すために上にスクロールしたように)
メソッド内部で状態を保持するのはstaticステートメントで実現することができます。
例)
sub foo()
static i as long
i=i+1
msgbox i
end sub
※重複しますが、このような内部状態で動作が変わる機能は
  メソッドで作るのではなくてクラスとして作ったほうがいいと思います。


matsu  2005-12-22 10:29:32  No: 129075

>・前に入力した文が20文字に達してない場合は次の文はその続きから書く
>はできていません。どう直せばいいかわかる方いらっしゃいませんか??><。

最後の状態を保存する方法もありますが、表示用テキストボックスの最終行の
文字数をカウントしても判断できると思います。


新人A  2005-12-22 10:40:37  No: 129076

ガッさんごめんなさい。今回はじめてVBをやってます。本当の初心者で教科書、参考書、ネット、あらゆるものを駆使して頑張っています。
なのでこのサイトの初心者掲示板に書き込みましたm(  )m
matsuさんありがとうございます。どちらかというと今matsuさんの方法でやろうとしています。なかなかうまくいきませんが頑張ります。


ぶぶ  2005-12-22 13:22:48  No: 129077

最終行の文字数をカウントする方法でやるならば

Instrrev関数、Len関数調べてみてください。


新人A  2005-12-26 14:19:38  No: 129078

皆さんにいろいろ意見いただきまことに感謝しています。
すみませんがまた質問がありまして書き込みました。

まず文字を格納し、その中から指定の文字数分だけ文字を別の所に格納し、残りの余った文字をまた元の場所に戻すためにはどうすればいいんでしょうか??

「あいうえおかきく」をAに格納
その中から前5文字だけをBに格納
残った「かきく」またAに格納

といった具合なのですが、どのようにすればよいのでしょうか?それとも、Bに格納された文字以外はAに残った状態なのでしょうか?
ご教授よろしくお願いしますm(  )m


課題は自分でやりましょう。  2005-12-26 15:35:17  No: 129079

A ="あいうえおかきく"
B = right( A,5)
A = left(A, 3)


新人A  2005-12-26 15:48:27  No: 129080

調べてもわからないことだらけで質問させていただいてるのですが、質問してはいけませんか??課題すべての完全な答えを聞くのは虫が良すぎると思いました。しかし今回のはやり方を聞いただけなので他の質問されてる皆様と同じではないでしょうか?m(  )mもちろん自分でやってます。それでこれはどうするんだろうと思い、調べてわからなかったことを質問させていただきました。最初の方の書き込みは完全に答えを聞いていて虫が良すぎると反省しています。


 2005-12-26 16:54:14  No: 129081

「どのようにすればよいのでしょうか?」ではなく、
「〜のようにしたけどうまくいきませんでした。」のように
自分のやったことを書かないと、丸投げと思われても仕方ないですよ。
課題は自分でやりましょう。さんが言いたかったことはそういうことだと思います。
>調べてもわからないことだらけ
と新人Aさんは言われていますが
>A ="あいうえおかきく"
>B = right( A,5)
>A = left(A, 3)
はそれほど難しいことでしょうか?
>教科書、参考書、ネット、あらゆるものを駆使して頑張っています。
残念ですが、その努力が見えないです。

アドバイス
求める処理を一回で行おうとするから「はまる」のです。
処理を細分化して、一つ一つ処理していけば
新人Aさんの求める処理は何とかなります。
ローマの道も一歩から、です。
頑張って!!


ぶぶ  2005-12-27 00:40:02  No: 129082

たとえば、検索するときのキーとして
今回の例では「vb 文字列  切り取る」をキーワードに検索すると
http://www.google.co.jp/search?hl=ja&q=vb+%E6%96%87%E5%AD%97%E5%88%97%E3%80%80%E5%88%87%E3%82%8A%E5%8F%96%E3%82%8B&lr=
となります。すると、結構ヒントになることが載っているのでは?
その上で、どこがわからないか明確にしていくと・・・
答えるほうも答えやすくなります。どこで悩んでいるのかわかるからです。
がんばってくださいね(^-^)


さくら  2005-12-27 10:21:09  No: 129083

やさしさと言うかなんと言うか(-_-;)
レスが多くなる前に・・・。
Private Sub Command1_Click()
  Dim Moji As String
  Dim lCnt As Long
  Dim str As String
  Dim lStr As Long
  
  Text1.Text = ""
  Moji = "あいうえお。かきくけこさしすせそたちつてと。なにぬねのはひふへほまみむめもやゆよ。らりるれろ。わをん。" & _
         "あいうえお。かきくけこさしすせそたちつてと。なにぬねのはひふへほまみむめもやゆよ。らりるれろ。わをん。" & _
         "あいうえお。かきくけこさしすせそたちつてと。なにぬねのはひふへほまみむめもやゆよ。らりるれろ。わをん。" & _
         "あいうえお。かきくけこさしすせそたちつてと。なにぬねのはひふへほまみむめもやゆよ。らりるれろ。わをん。"
         
  For lCnt = 1 To Len(Moji)
    If Mid$(Moji, lCnt, 1) = "。" Then
      str = Mid$(Moji, lCnt, 1) & vbCrLf
    Else
      lStr = lStr + 1
      str = Mid$(Moji, lCnt, 1)
      
      If lStr = 10 Then
        str = str & vbCrLf
        lStr = 0
      End If
    End If
    
    Text1.Text = Text1.Text & str
  
  Next
End Sub


さくら  2005-12-27 11:33:52  No: 129084

>・10行目までは行が増えるが、11行目を表示する場合は1行目を削除し10行目に表  示
抜けていたので訂正・・・(-_-;)
Private Sub Command1_Click()
  Dim Moji As String
  Dim lCnt As Long
  Dim str As String
  Dim lStr As Long
  Dim lCrLf As Long
  Dim strs() As String
  Dim blnCrlf As Boolean
  
  Text1.Text = ""
  Text2.Text = ""
  Moji = "あいうえお。かきくけこさしすせそたちつてと。なにぬねのはひふへほまみむめもやゆよ。らりるれろ。わをん。" & _
         "あいうえお。かきくけこさしすせそたちつてと。なにぬねのはひふへほまみむめもやゆよ。らりるれろ。わをん。" & _
         "あいうえお。かきくけこさしすせそたちつてと。なにぬねのはひふへほまみむめもやゆよ。らりるれろ。わをん。" & _
         "あいうえお。かきくけこさしすせそたちつてと。なにぬねのはひふへほまみむめもやゆよ。らりるれろ。わをん。"
         
  ReDim strs(0)
  lCrLf = 0
  For lCnt = 1 To Len(Moji)
    If Mid$(Moji, lCnt, 1) = "。" Then
      str = Mid$(Moji, lCnt, 1) & vbCrLf
      lStr = 0
      ReDim Preserve strs(UBound(strs) + 1)
      blnCrlf = True
    Else
      lStr = lStr + 1
      str = Mid$(Moji, lCnt, 1)
      blnCrlf = False
      
      If lStr = 10 Then
        str = str & vbCrLf
        lStr = 0
        ReDim Preserve strs(UBound(strs) + 1)
        blnCrlf = True
      End If
    End If
    
    strs(lCrLf) = strs(lCrLf) & str
    
    If blnCrlf Then
      Text2.Text = Text2.Text & strs(lCrLf)
      lCrLf = lCrLf + 1
    End If
  Next
  
  For lCnt = (UBound(strs) - 10) To UBound(strs)
    Text1.Text = Text1.Text & strs(lCnt)
  Next
End Sub


新人A  2006-01-10 15:36:00  No: 129085

やっと完成することができました。
これも皆様のおかげです。
ありがとうございました。
これからもっともっと精進したいと思います。


新人A  2006-01-10 15:36:23  No: 129086

・・・。


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

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







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