textboxに””を入れる場合。。。。


コップ  2004-01-16 16:04:57  No: 111361  IP: [192.*.*.*]

VB6.0
text1 text2 text3 がありまして、そこへ文字を入れます。
このほかにもチェックボタンがあります。

text1へ「私の名前は”コップ”です」と入れます。

これで保存します。
それで保存したものを再度読み込んで、text1に表示させると
text1に「私の名前」
text2「コップ
のように区切られてしまいます。また他のチェックとかも勝手に入ります。

”を使いたいのですが、諦めるしかないでしょうか・・・・

編集 削除
いちゆ  2004-01-16 16:36:30  No: 111362  IP: [192.*.*.*]

保存って…Print?それともWrite?それ以外?
ソースがないからなんともいえません。

編集 削除
 2004-01-16 16:37:52  No: 111363  IP: [192.*.*.*]

区切られたりするのはソースの問題です。
後、”は表示できます。
くわしく説明するにはソースを開示して
いただく事が一番なのですが・・・

編集 削除
いな  2004-01-16 16:38:44  No: 111364  IP: [192.*.*.*]

Chr(34)に変換しないといけないのかな

編集 削除
コップ  2004-01-16 17:00:05  No: 111365  IP: [192.*.*.*]

説明不足ですみません。
a = text1
b = text2
c = text3
(以下省略)

Open ***** For Output As #1 
Write #1, a,b,c,d,e,f,g  ・・・・・・

で書き込んでいます。

 
  Open ***** For input As #1 
input #1, a,b,c,d,e,f,g  ・・・・・・ 
で開いて
text1.text = a 
text2.text = b 

とすると、text1の文章途中に”を入れたところが勝手にtext2に
入ったりします。

>保存って…Print?それともWrite?それ以外?
printとwriteって違うんでしょうか?  本には同じですと書いてあったんですがT_T;


よろしくお願いします。

編集 削除
コップ  2004-01-16 20:52:27  No: 111366  IP: [192.*.*.*]

今までやってみて、どこが問題か少しわかったので報告します。

text1.text = あい"うえお  と入力。

これを保存
a = text1.text

Open ***** For Output As #1 
Write #1, a
close #1

これで文章はこのように保存されます。
"あい"うえお"

この為に、読み込んださいに  a  の中の「あい」しか
読み込まないという状況だと思うんです。

実際にはtext1にはhtmlを打ち込むので  "  は頻繁にはいります。
しかしこの問題で読み込んで修正が出来ませんT_T;

なにか方法がありますでしょうか?

編集 削除
GS  2004-01-16 22:25:51  No: 111367  IP: [192.*.*.*]

Printを使うと"←ダブルクォーテーション(合ってるかな?^^;)は出力されませんよ。

'textbox1からファイル保存→hoge.txt
FileOpen(1, "hoge1.txt", OpenMode.Output, OpenAccess.Default)
  Print(1, Text1.Text)
FileClose(1)

'hoge1.txtからファイル読み込み→textbox1

FileOpen(1, "hoge1.txt", OpenMode.Input, OpenAccess.Default)
  Do Until EOF(1)    'ファイル末端まで読み込み
    Text1.Text = TextBox2.Text & LineInput(1) & Chr(13) & Chr(10)
  Loop
FileClose(1)

編集 削除
GS  2004-01-16 22:33:46  No: 111368  IP: [192.*.*.*]

修正
×12:Text1.Text = TextBox2.Text & LineInput(1) & Chr(13) & Chr(10)
○12:Text1.Text = Text2.Text & LineInput(1) & Chr(13) & Chr(10)

freefile()・変数を使って書き直して下さいね^^;

編集 削除
GS  2004-01-16 22:34:57  No: 111369  IP: [192.*.*.*]

あ・・・申し訳ないです。修正の修正なんてtext1.textです

編集 削除
かな  2004-01-16 22:39:44  No: 111370  IP: [192.*.*.*]

その使い方なら Line Input でいいんでないかなぁ。

form1、comannd1、command2、大きめのtext1、text2を作る。
text1、text2にmultilineをTrue、ScrollBarsを 3 にでもしておく。

↓これをはる
Option Explicit

Private Const strTestFilename = "c:\test.txt"

Private Sub Command1_Click()
Dim intFileNum As Integer
    intFileNum = FreeFile
    Open strTestFilename For Output As #intFileNum
        Print #intFileNum, Text1.Text
    Close #intFileNum
    MsgBox "かきこみおわり"
End Sub

Private Sub Command2_Click()
Dim intFileNum As Integer, strBuf As String
    Text2.Text = ""
    If Len(Dir$(strTestFilename)) Then
        intFileNum = FreeFile
        Open strTestFilename For Input As #intFileNum
        
        Do While (Not EOF(intFileNum))
            Line Input #intFileNum, strBuf
            Text2.Text = Text2.Text & strBuf & vbCrLf
        Loop
        Close #intFileNum
        MsgBox "よみこみおわり"
    Else
        MsgBox "Command1 を押してケロ"
    End If
End Sub

Private Sub Form_Load()
    Text1.Text = ""
    Text2.Text = ""
End Sub

>Write #1, a,b,c,d,e,f,g
VB5以前ではアウツですが、Split関数というのがあります。(詳しくはヘルプなどで)
一旦くっつけてまとめて1行で読み書きし、後でバラすというのもアリかもしれません。

編集 削除
かな  2004-01-16 22:42:47  No: 111371  IP: [192.*.*.*]

ありゃ、いつも間にかGS様のお答えが…。面目ないです。

編集 削除
コップ  2004-01-16 23:55:51  No: 111372  IP: [192.*.*.*]

>最後の補足お願いします。
皆さんどうもです。

かなさんのコードで出来ましたが、なぜ出来るのかが分かりませんT_T;

そのため現在のコードに応用できません。

上のコードの重要な部分の簡単な説明して貰えないでしょうか、、
msdnライブラリで見ても簡単にしか書いてなくて分かんないです。

これとこれで文字の最後まで読み込む程度でよいので
上のソースの重要部分だけの説明お願いします。

編集 削除
しゅう  2004-01-17 02:26:41  No: 111373  IP: [192.*.*.*]

カンマ区切りで保存して、読込時カンマで分割するだけで良いと思います。

Option Explicit

Private Sub Command1_Click()
Dim FNo As Integer
    FNo = FreeFile
    Open "c:\test.txt" For Output As #FNo
        Print #FNo, Text1 & "," & Text2      'カンマ区切りで保存
    Close #FNo
End Sub

Private Sub Command2_Click()
Dim FNo As Integer
Dim strBuf1 As String
Dim strBuf2() As String                     'カンマ区切りで分割したデータを入れる配列を用意する
    FNo = FreeFile
    Open "c:\test.txt" For Input As #FNo
        Line Input #FNo, strBuf1            '一行読み込む
        strBuf2() = Split(strBuf1, ",")     'カンマ区切りで分割する
        Text1 = strBuf2(0)
        Text2 = strBuf2(1)
    Close #FNo
End Sub

編集 削除
かな  2004-01-17 02:31:14  No: 111374  IP: [192.*.*.*]

簡単に言えば、区切り文字(たとえばコンマ",")や囲み文字(データが数字か
文字かを区別するためにお題のようなダブルコーテーションで囲む)というのを
ある程度判別してデータを読み込んでくれるのが input 、
改行までまるまる1行読み込んでくれるのが line input です。

inputを使うとコンマやダブルコーテーションなどが文字データ内にある場合、
「余計な親切」で予期しない格納のされ方をする場合があります。

それをさけるために、「とりあえず1行まるごと読んで必要があれば
後でバラそう」という方が無難といえます。

テキストボックスでなく、リッチテキストを利用するとか、ユーザー定義型を
直接Put/Getするとか(コレもVB5以前はアウツですが)
読み書きのルールを決めるのは最終的には「用途による」ことになるので、
コレがベストというのはそれこそコードを書く方の腕の見せ所であり、
この場ではなんともいえせんが、少なくとも間際らしい特殊文字の存在があり得る
文字列データを含むデータ読み込みにinputを使うのはトラブルのモトともいえます。

編集 削除
かな  2004-01-17 02:35:45  No: 111375  IP: [192.*.*.*]

あぅ、まごまごしている間に今度はしゅう様のお答えが。

編集 削除
しゅう  2004-01-17 02:36:04  No: 111376  IP: [192.*.*.*]

あっ、かなさんが言ってましたね。

編集 削除
コップ  2004-01-18 21:22:57  No: 111377  IP: [192.*.*.*]

>皆さんどもです。
あれから色々やってみたのですが、Binaryを使うと  ”などで
区切られないということで自分なりにやったのですが、今のところ
良い感じで出来ました。

Open "tesT.TXT" For Binary As #1
Put #1, , a
Close #1

Binaryを強く進められなかったので、デメリットがあるのかな??
と思いまして再度質問しております。

よろしくお願いいたします。

編集 削除
いちゆ  2004-01-19 17:04:03  No: 111378  IP: [192.*.*.*]

…すいません、私が知っているバイナリでの方法だと大体こんな感じです。
もっと簡単なのがあると思いますが…すみません、忘れました。
新しいクラスに貼り付けてください作成してください。

'■■■Class1に、ここから
'Binary で文字列をReadWriteするクラス
Option Explicit

Private UsingFileName           As String

Private Sub Class_Initialize()
UsingFileName = vbNullString
End Sub

Public Property Get ReadWriteStream_FileName() As String
ReadWriteStream_FileName = UsingFileName
End Property

Public Property Let ReadWriteStream_FileName(ByVal NewValue As String)
UsingFileName = NewValue
End Property

Public Function ReadAll(ByRef return_StringArray() As Variant) As Long

Dim i               As Long
Dim ff              As Long
Dim buf()           As Byte
Dim bufLength       As Long

If UsingFileName <> vbNullString Then
    
    ff = FreeFile()
    Open UsingFileName For Binary As ff
        
        Get #ff, 1, ReadAll
        
        If ReadAll > 0 Then
            
            ReDim return_StringArray(1 To ReadAll)
            
            For i = 1 To ReadAll
                
                Get #ff, , bufLength
                
                If bufLength > 0 Then
                    ReDim buf(1 To bufLength)
                    Get #ff, , buf
                    return_StringArray(i) = buf
                End If
                
            Next
            
        End If
        
    Close ff
    
Else
    ReadAll = 0
End If

End Function

Public Function WriteAll(ByRef write_StringArray() As Variant) As Long

Dim i               As Long
Dim ff              As Long
Dim buf()           As Byte
Dim bufLength       As Long

On Error GoTo WriteAll_Error:
WriteAll = UBound(write_StringArray) - LBound(write_StringArray) + 1
On Error GoTo 0

If UsingFileName <> vbNullString Then
    
    On Error Resume Next
    SetAttr UsingFileName, vbArchive
    Kill UsingFileName
    On Error GoTo 0
    
    ff = FreeFile()
    Open UsingFileName For Binary As ff
        
        Put #ff, 1, WriteAll
        
        For i = LBound(write_StringArray) To UBound(write_StringArray)
            
            If write_StringArray(i) = vbNullString Then
                Put #ff, , 0&
            Else
                buf = CStr(write_StringArray(i))
                bufLength = UBound(buf) - LBound(buf) + 1
                Put #ff, , bufLength
                Put #ff, , buf
            End If
            
        Next
        
    Close ff
    
Else
    WriteAll = 0
End If

Exit Function

WriteAll_Error:
'エラーの場合は抜ける
WriteAll = 0
On Error GoTo 0

End Function
'■■■ここまで貼り付ける

以下はフォームにでも貼り付ける。
'■■■利用例
Public Sub main()
Dim x As New BinaryReadWriteClass
Dim va() As Variant
Dim v As Variant
va = Array("1: abcdefg" + """" + "abc" + """", _
           "2: " + vbTab + """" + "this is tab." + """")
x.ReadWriteStream_FileName = "c:\1.bin"
x.WriteAll va
Erase va
x.ReadAll va
For Each v In va
    MsgBox v
Next
End Sub

編集 削除