サウンドノベルゲームのように、テキストを一文ずつ、左から順番に流して表示するにはどうしたらいいでしょうか?
後、指定の場所で流れてる文章が止まり、クリックするとまた流れ始めるようにしたいのですが・・・。
どなたか教えてくださいm_ _m
テキストボックスに文字を表示するにはどうすればいいですか?
画面にコマンドボタン(Command1)、ラベル(Label1)をはりつけて
以下をコードにはりつけてやってみてください。
あとは頑張って、内容を理解していってください。
Option Explicit
Private Sub Command1_Click()
Dim i As Integer
Dim txtMsg As String
Label1 = ""
txtMsg = "あいうえお|@@@かきくけこ"
For i = 1 To Len(txtMsg)
If Mid(txtMsg, i, 1) = "@" Then
Call TimeWait(0.3)
ElseIf Mid(txtMsg, i, 1) = "|" Then
Label1 = Label1 & vbCrLf
Else
Label1 = Label1 & Mid(txtMsg, i, 1)
Call TimeWait(0.1)
End If
Next i
'ここで
'後、指定の場所で流れてる文章が止まり、クリックするとまた流れ始めるようにしたいのですが・・・。
'を頑張っていれてね。
'そんなに難しくないですが。
End Sub
Private Sub TimeWait(wait As Single)
Dim wrktime As Single
wrktime = Timer + wait
Do Until Timer >= wrktime
DoEvents
Loop
End Sub
あんびさんのを改良
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub Command1_Click()
Dim i As Long
Dim txtMSG As String
Dim lngLen As Long
Dim str As String
Label1.Caption = "あいうえお "
lngLen = Len(Label1.Caption)
i = 1
Do
Label1.Caption = Mid$(Label1.Caption, 2, lngLen) & Mid$(Label1.Caption, 1, 1)
Sleep 500
DoEvents
Loop
End Sub
で、どうですか?
改の改良です
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private blnStop As Boolean
Private strLabel As String
Private lngLen As Long
Private Sub Command1_Click()
blnStop = False
If strLabel <> vbNullString Then
Label1.Caption = strLabel
End If
Do
Label1.Caption = Mid$(Label1.Caption, 2, lngLen) & Mid$(Label1.Caption, 1, 1)
Sleep 500
DoEvents
If blnStop = True Then
strLabel = Label1.Caption
Exit Do
End If
Loop
End Sub
Private Sub Command2_Click()
blnStop = True
End Sub
Private Sub Form_Load()
Label1.Caption = "あいうえお "
lngLen = Len(Label1.Caption)
End Sub
みなさん有難うございますm_ _m
やってみますね。
すいません。質問の仕方が間違っていました・・・。
一文ずつではなく、一文字ずつと書くつもりでした。
例えば「あいうえお、かきくけこ」という文だと、
「あ→い→う→え→お」と流れ、ここで一回止まり、画面をクリックすると「か→き→く→け→こ」と読み進めるようにしたいんです。
コマンドボタンを使用せず、画面をクリックすることで読み進めたい場合は、直接Form1に記述すれば良いのでしょうか?
何度も申し訳ありませんm_ _m
今ひとつ動きが判らないけど。。
Labelを一つ貼り付けて、index プロパティを0にする。
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub MoveStart()
Dim LabelPos As Long
LabelPos = Label1(2).Left + Label1(2).Width
Do
Label1(1) = Left(Trim(Label1(2)), 1)
Label1(2) = Right(Label1(2), Len(Label1(2)) - 1)
Label1(1).Left = Label1(2).Left - Label1(1).Width
Label1(2).Left = LabelPos - Label1(2).Width
MoveLabel
Loop While Trim(Label1(2)) <> "" And Label1(1) <> "お"
Label1(1) = ""
End Sub
Private Function MoveLabel()
Do
Sleep (10)
Label1(1).Left = Label1(1).Left - 100
DoEvents
Loop While (Label1(0).Left + Label1(0).Width) < Label1(1).Left
Label1(0) = Label1(0) + Label1(1)
Label1(1).Left = Label1(2).Left - Label1(1).Width
End Function
Private Sub Form_Click()
MoveStart
End Sub
Private Sub Form_Load()
Dim i As Integer
For i = 1 To 2
Load Label1(i)
Next
For i = 0 To 2
With Label1(i)
.AutoSize = True
.Caption = ""
.Left = i * 3000 + 200
.Top = 1000
.Visible = True
End With
Next
Label1(2).Caption = "あいうえおかきくけこ"
Me.Show
MoveStart
End Sub
こんなことですかね。
連続で失礼。
>Private Sub Form_Click()
> MoveStart
>End Sub
は
Private Sub Form_Click()
If Len(Label1(2)) <> 0 Then
MoveStart
End If
End Sub
の方がいいかな。
というか改さんがこれだけサンプルを出してくれているんだから
それを先ず理解してみてはどうですか?
動かしてみてちがう動きだからこうして欲しいとかじゃ
質問じゃなくて作成依頼じゃないですか。
改さんのサンプルでどうやって文字を流しているのか理解できたなら
後から言っている仕様も自分で作れるはずですよ。
私も、作ってみました。
Option Explicit
Private Const MAX_LENGTH As Integer = 40 '一行に表示可能な文字数
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub Form_Load()
Label1.Caption = ""
Me.Show
Call MoveStart("あいうえお")
End Sub
Private Sub Form_Click()
Call MoveStart("かきくけこ")
End Sub
Private Sub MoveStart(strText As String)
Dim i As Integer
With Label1
For i = 1 To Len(strText)
.Caption = .Caption & _
Space$(MAX_LENGTH - Len(.Caption) - 1) & _
Mid$(strText, i, 1)
Do Until InStr(.Caption, " ") = 0
.Caption = Replace(.Caption, " ", "", 1, 1)
Sleep 10
DoEvents
Loop
Next i
End With
End Sub
このような動きでしょうか?
VB.NETで作りました。
ちょっと長いですが・・・
'Labelに表示する文字を格納する変数
Dim MoziString(3) As String
'コントロールを定義
Dim timer1 As Timer
Dim flg As Boolean
'カウント
Dim count As Integer, place As Integer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'初期化
count = 1
place = 0
flg = True
'インスタンスを設定
timer1 = New Timer
timer2 = New Timer
'パラメータの設定
With timer1
.Interval = 100
End With
With timer2
.Interval = 1000
End With
'Labelの設定
With Label1
'各パラメータを設定
Dim kankaku As Integer
Dim height As Integer
kankaku = 20
height = 40
'テキストを初期化
.Text = ""
'X、Y座標を設定
.Location = New Point(kankaku, Me.Height - (kankaku * 2 + height))
.Size = New Size(Me.Width - (kankaku * 2), height)
'背景色の変更
.BackColor = Color.FromArgb(128, 0, 0, 255)
'文字色の設定
.ForeColor = Color.FromArgb(255, 255, 255)
End With
'イベントハンドラーの作成
AddHandler timer1.Tick, AddressOf timer1_Tick
'Labelに表示される文字の設定
MoziString(0) = "あいうえお"
MoziString(1) = "かきくけこ"
MoziString(2) = "さしすせそ"
'TimerをStart
timer1.Start()
End Sub
Private Sub timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)
'Labelに文字を表示
If flg Then
Label1.Text &= GetChar(MoziString(place), count)
If count >= MoziString(place).Length Then
count = 0
place += 1
flg = False
End If
If place >= UBound(MoziString) Then
Label1.Text &= vbCrLf & "Finish"
timer1.Stop()
End If
count += 1
End If
End Sub
Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
'イベントハンドラーの破棄
'コントロールの破棄
timer1.Dispose()
timer2.Dispose()
End Sub
Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
If e.KeyCode = Keys.Enter Then
flg = True
Label1.Text &= vbCrLf
timer1.Start()
End If
End Sub
みなさん、いろいろ本当にありがとうございます。
まず、挙げていただいた文を理解する事から始めたいと思います。
自分の質問の仕方がどうも悪かったみたいで・・・。
「流す」というか「読み進める」というかなんと表現すればいいのか・・・。
サウンドノベルゲームのような文字表現がしたいんです。
Option Explicit
Dim CRLF$
Private Sub Form_Click()
CRLF$ = Chr$(13) + Chr$(10)
Form1.Print "それは夏の暑い深夜に起こった。" + CRLF$
Form1.Print "別に特別何かを感じたわけではない。 " + CRLF$
Form1.Print "ベッドから目覚めた僕は、その異変に気づいた。"
End Sub
ここで「読み進める」という表現が出来なくて困っているんです。
最初からこう聞けばよかったのに何度も手間をかけてごめんなさい。
画面にLabel1(ラベル)を用意してから実行してみてください。
タイトルが「テキストを左から流して表示するには?」なのに
聞きたいことが違ったみたいで、いろんな方がサンプル作ってくれてますが
いろんな方のサンプルをみて何をしているか理解されることを期待します。
CRLF$ = Chr$(13) + Chr$(10)
の表現は vbcrlf で標準定義されてます。
Option Explicit
Private strMSG(3) As String
Private intP As Integer
Private Sub Form_Load()
strMSG(0) = "あああああ"
strMSG(1) = "いいいいい"
strMSG(2) = "ううううう"
strMSG(3) = "えええええ" & vbCrLf & "おおおおお"
intP = 0
Label1 = strMSG(intP)
End Sub
Private Sub Form_Click()
intP = intP + 1
If intP > UBound(strMSG()) Then Exit Sub
Label1 = strMSG(intP)
End Sub
もしかしてこういう事?
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub Form_Click()
Call DisplayText("それは夏の暑い深夜に起こった。" & vbCrLf)
Call DisplayText("別に特別何かを感じたわけではない。 " & vbCrLf)
Call DisplayText("ベッドから目覚めた僕は、その異変に気づいた。")
End Sub
Private Sub DisplayText(strText As String)
Dim i As Integer
For i = 1 To Len(strText)
Form1.Print Mid$(strText, i, 1);
Sleep 100
Next i
End Sub
>>LESIAさん
こうじゃない?
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub Form_Click()
Static no As Integer
Dim text(0 To 2) As String
text(0) = "それは夏の暑い深夜に起こった。" & vbCrLf
text(1) = "別に特別何かを感じたわけではない。 " & vbCrLf
text(2) = "ベッドから目覚めた僕は、その異変に気づいた。"
If no > 2 Then
Form1.Cls
no = 0
End If
DisplayText (text(no))
no = no + 1
End Sub
Private Sub DisplayText(strText As String)
Dim i As Integer
For i = 1 To Len(strText)
Form1.Print Mid$(strText, i, 1);
Sleep 100
Next i
End Sub
あ!まさにその通りです!本当にありがとうございました。
上記で挙げていただいた文も理解できるように頑張ります。
本当に、みなさんありがとうございました。
ツイート | ![]() |