tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^8: ファイルパスの機種依存文字を取得する方法について
投稿日: 2014/12/09(Tue) 14:33
投稿者マサタロウ
> 描画処理を UserControl 化しておくと、通常の Label の代用として使えるかと。
Visual Basic Learning Edition Version 5.0ではActiveX コントロールを作成できません。
PictureBoxとサンプルコードで表示します。


> Label の代用とする、TextOutW API のサンプルを書いてみました。
サンプルを参考にして、機種依存文字を表示させることができました。

DrawText内の"s = Text & vbNullChar"はC言語風文字列で宜しいですか(下記ページ参考にしました)?
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/vb_p07.htm
"s = Text & vbNullChar"で実行すると、機種依存文字の後に
半角中点が表示されます。"s = Text"で表示できました。

TextOutWは宣言で全てLong型となっているため、数値で判断して
描画を行う事がわかります。
DrawTextを呼び出すときに引数を設定すると、引数の値は数値になりますか?
変数の格納されている場所(アドレス)内の値(文字列)は、対応する数値になりますか
(StrPtr(s)のs、イミディエイトウィンドウでは数値でした、数値は格納場所の意味?)?
関数(DrawText)を使用してTextOutWを実行するのは、数値を取得するためですか?

DrawText(Call DrawText)後のPictureBoxのRefreshは、
実行しなくても表示できました。

PictureBoxのプロパティは、デザイン時に設定します。

Printerについては使用しないため確認してません。


サンプルのUnicode対応コモンダイアログについて、
そのまま使用するとうまくいかないので、以下のコードに変更して、
表示、初期ディレクトリの設定、選択可能ファイルの種類設定、
コモンダイアログボックスのタイトル設定、ファイル選択、
は正しくできました。
ReplaceはVB5.0にはありませんでした。

Private Sub Command8_Click()

Dim s As String

    s = DlgShowOpen("C:\Program Files\", "実行ファイル(*.exe,*.lnk)|*.exe", "ファイル")

'▼以下でもできました。
'Dim FP As String
    
    'FP = "実行ファイル(*.exe,*.lnk)" & vbNullChar & "*.exe"
    's = DlgShowOpen("C:\Program Files\", FP, "ファイル")

End Sub

Public Function DlgShowOpen(ByVal initialDirectory As String, ByVal filterPattern As String, Optional ByVal dialogTitle As String = vbNullString) As String

Const OFN_FILEMUSTEXIST As Long = &H1000
Const OFN_HIDEREADONLY As Long = &H4
Const OFN_EX_NOPLACESBAR As Long = &H1

Dim ofnFlags As Long
    ofnFlags = OFN_FILEMUSTEXIST Or OFN_HIDEREADONLY
    
Dim strFile As String
    strFile = String(512, 0)

Dim strFileFilter As String
    Mid(filterPattern, 20, 1) = vbNullChar '変数"FP"を使用しない場合。
    strFileFilter = filterPattern

Dim udtOFN As OPENFILENAME

    With udtOFN

        .lStructSize = Len(udtOFN)

        .hwndOwner = Form1.hWnd

        .hInstance = App.hInstance
        
        .lpstrFilter = StrPtr(filterPattern)
        .nFilterIndex = 1
        
        .lpstrFile = strFile
        
        .nMaxFile = Len(strFile)
        
        .lpstrInitialDir = StrPtr(initialDirectory)
        
        .lpstrTitle = StrPtr(dialogTitle)
        
        .Flags = ofnFlags
        .FlagsEx = 0&

        .nFileOffset = 0
        .nFileExtension = 0
        .nMaxCustFilter = 0&
        .lpstrFileTitle = 0&
        .nMaxFileTitle = 0&
        .lpstrCustomFilter = 0&
        .nMaxCustFilter = 0&
        .lpstrDefExt = 0&
        .lCustData = 0&
        .lpfnHook = 0&
        .lpTemplateName = 0&
        .pvReserved = 0&
        .dwReserved = 0&

    End With

Ret = GetOpenFileNameW(udtOFN)

TextOutW関数で、.lpstrFileのプロパティが数値で表示されるため、
型をString型に変更して上記のコードで実行すると、パス名を表示できました。
引数TextにStrConvでUnicodeから変換して格納しました。
しかし、正しく表示できるパスと化けるパスがある様です
(半角カタカナが化ける)。
また、TextOutW関数で表示すると、パス以外の文字が表示されます
(半角中点)。バッファのサイズ分表示され、パス以外の余分な文字も
表示されるのでしょうか?
バッファのサイズを再設定するとうまく表示できません
(Ret = GetOpenFileNameW(udtOFN)の後でstrFile = String(256, 0)など)。
For〜Next、Mid、Leftでパスのみ取得できるか試しています。
Shell関数でStrConvでUnicodeから変換した.lpstrFileプロパティの
.exeや.lnkファイルを実行する事は出来ました。


バージョンについて、
VB2005はフリーのVisual Basic 2005 Express Edition をダウンロードして
所持しているという意味でした。外観やプログラム方法が似ているため、
VB2005で慣れてからでないと最新版をインストールしないと思います。
VB5.0を希望しているのは、作成している自作プログラムがVB5.0の勉強のために
作成したもので、言語を換えたくない気持ちがあるためです。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。