ページ 11

サンプルのテキストエディタで読み込みができない

Posted: 2007年5月24日(木) 13:42
by まさ328
ヘルプセンターにあるWin32プログラミング講座-Step11. テキスト エディタを作る
にあるテキストエディターのサンプルプログラムなのですが、
ファイルの読み込みだけうまくいきません。

保存やコピー・ペースト他はサンプル通り動くのですが、テキストファイルを
読み込んでも、何も表示されません。

Sub MainWnd_IDM_OPEN_MenuClick()の中の
SetWindowText(hEdit,buffer)

SetWindowText(hEdit,"TEST")
とかに書き換えるとちゃんとTESTと表示されるのでbufferに何も入って
いないのかなぁと思うのですが、今回のようなケース、なにか別に設定しなければ
いけないことがあるのでしょうか?

AB自体、まだ使い始めて日も浅く、慣れていないのでとんでもないミスを
している可能性もあるのですが・・・

Posted: 2007年5月24日(木) 14:20
by ゲスト
SetWindowText(hEdit,buffer)の前か後の行に
debug
を1行追加してデバッグ実行をしてみましょう。
ブレークしたら、bufferに何が代入されているか確認してください。

Posted: 2007年5月24日(木) 14:49
by まさ328
ブレークしたら、bufferに何が代入されているか確認してください。
buffer の中身は””で何も入っていませんでした。

その前のコードで
'ファイルサイズを取得
dwFileSize=GetFileSize(hFile,0)

'文字列バッファ用のメモリを確保
buffer=ZeroString(dwFileSize)

'ファイルの内容を文字列変数bufferに読み込む
ReadFile(hFile,buffer,dwFileSize,VarPtr(dwAccessByte),ByVal 0)

とあるのですが、
dwFileSizeはエクスプローラー等でファイルのプロパティから調べたサイズが
入っているので、ここまでは正常のようです。

どこがまずいのでしょう?

Posted: 2007年5月24日(木) 17:39
by konisi
よくみるとこれ動く方が凄いコードですね。
下のように書いてみてください。

コード: 全て選択

Sub MainWnd_IDM_OPEN_MenuClick()
    Dim hEdit As Long
    Dim ofn As OPENFILENAME
    Dim hFile As Long
    Dim dwFileSize As DWord
    Dim dwAccessByte As DWord
    Dim FileName[MAX_PATH-1] As Byte
    Dim buffer As *Byte

    'OPENFILENAME構造体の初期化
    FillMemory(VarPtr(ofn),Len(ofn),0)
    ofn.lStructSize=Len(ofn)
    ofn.hwndOwner=hMainWnd
    ofn.lpstrFilter=Ex"テキスト ファイル(*.txt)\0*.txt\0すべてのファイル(*.*)\0*\0\0"
    ofn.nFilterIndex=1
    ofn.lpstrFile=FileName
    ofn.nMaxFile=MAX_PATH
    ofn.lpstrTitle="ファイルを開く"
    ofn.Flags=OFN_FILEMUSTEXIST or OFN_HIDEREADONLY or OFN_PATHMUSTEXIST
    ofn.lpstrDefExt="*"

    '「ファイルを開く」ダイアログ ボックスを表示
    If GetOpenFileName(ofn)=0 Then Exit Sub


    '-------------------
    ' ファイル オープン
    '-------------------

    hFile=CreateFile(ofn.lpstrFile, GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, _
                     ByVal 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
    If hFile=INVALID_HANDLE_VALUE Then
        MessageBox(hMainWnd,"ファイルオープンに失敗","TextEditor",MB_OK or MB_ICONEXCLAMATION)
        Exit Sub
    End If

    'ファイルサイズを取得
    dwFileSize=GetFileSize(hFile,0)

    '文字列バッファ用のメモリを確保
    buffer=calloc(dwFileSize+1)

    'ファイルの内容を文字列変数bufferに読み込む
    ReadFile(hFile,buffer,dwFileSize,VarPtr(dwAccessByte),ByVal 0)

    'ファイル ハンドルを閉じる
    CloseHandle(hFile)

    '-------------------


    'EditBox1のハンドルを取得
    hEdit=GetDlgItem(hMainWnd, EditBox1)

    'hEditにバッファをセットする
    SetWindowText(hEdit,buffer)

    'hEditにフォーカスをセット
    SetFocus(hEdit)

    free(buffer)
End Sub

Posted: 2007年5月24日(木) 19:34
by まさ328
Dim buffer As *Byte

buffer=calloc(dwFileSize+1)
ありがとうございます。うまくいきました!