[トップ][編集][本文][編集履歴][一覧][最近の更新][->English]

Note:HSPのTips集

dialogでユーザー定義のフォルダを規定として開く

  • 従来品
    • chdirでカレントディレクトリ設定
    • regkillでLastVisitedMRUキーを削除
  • kz3法
    • 書き途中です。従来品で外部HDDの設定に成功した人はいますか?自分の環境ではパスの通っていない(?)外部HDDは設定できなかったので、コモンダイアログの動作(レジストリ処理)を自前で実装するだけです。(汗)
    • ここに書き込むまでは、HSP開発wiki:http://hspwiki.tm.land.to/?Top のソフト開発->タブスペコンバーター->インターフェースを参考にしてみてください。(モジュール化されていませんがコメント付きです(!!))
    • API側で関数が提供されていそうなんだが・・・
  • 直接APIを呼ぶ
    • GetOpenFileName関数、GetSaveFileName関数
    • OPENFILENAME構造体のlpstrInitialDirメンバにパスを指定
      • lpstrInitialDirメンバでしたか!そのメンバは今まで使ったことがありませんでした・・・。(というかtipsばっかりやってたら実用で使えるメンバはいじらないですね;;)ありがとうございました!dialog -> GetOpenFileNameに変更ですね・・・アレ、結構力作だったんですけど(笑)一応HSP開発wikiには完成まで過去のソースは(容量が許す限り)残しておくつもりですが、こちらにはその力作と自負するコードがどんなものかということでピックアップしますね;(本当にピックアップなので単体では動きませんよ)
      • HSP開発wikiにこんなものを自分、書いていました。lpstrInitialDirにNULL指定していますね;;->http://hspwiki.tm.land.to/?%BE%AE%A5%EF%A5%B6/%A5%D5%A5%A1%A5%A4%A5%EB%C6%FE%BD%D0%CE%CF#content_1_9 (HSP開発wiki->小ワザ->ファイル入出力)本当に勉強になった!
/******************************************************************************
 *                                                                            *
 *               以下は関連付けされていないサブルーチン郡です。               *
 *               任意の場所から呼び出すことが出来ます。                       *
 *                                                                            *
 ******************************************************************************/
; ______________________________________________________________________________
;/ デフォルト値に設定された作業ディレクトリをレジストリに書き込む
*reg_setworkdir
    /*--------------------------------------------------------------------*
     *    レジストリに書き込むバイナリデータを用意する(Unicode)    *
     *--------------------------------------------------------------------*/
 
    ; レジストリに書き込む作業ディレクトリパスをunicodeに変換
    to_uni u_regwdir,regwdir,0
    u_wdirsize=stat                     ; 作業ディレクトリパスのunicodeサイズ
    sdim u_regwdir,u_wdirsize           ; unicodeバイナリデータのバッファ
    to_uni u_regwdir,regwdir,-1         ; unicodeに変換
 
    reg_bsize=u_aplnsize+u_wdirsize     ; レジストリに書き込むバイナリサイズ
    sdim reg_bdata,reg_bsize            ; レジストリに書き込むデータのバッファ
 
    ; レジストリに書き込むバイナリデータの作成
    memcpy reg_bdata,u_aplname,u_aplnsize,0,0
    memcpy reg_bdata,u_regwdir,u_wdirsize,u_aplnsize,0
 
    /*--------------------------------------------------------------------*
     *                        レジストリキーを開く                        *
     *--------------------------------------------------------------------*/
 
    prm.0=$80000001                 ; ルートキー
    getptr prm.1,subkey             ; サブキー
    prm.2=0                         ; 予約フィールド
        nameClass=""
    getptr prm.3,nameClass          ; クラス名""
    prm.4=0                         ; オプション
    prm.5=$000F003F                 ; アクセス権
    prm.6=0                         ; 継承
    getptr prm.7,hkey               ; 作成したキーのハンドル
    getptr prm.8,bstat              ; 取得したキーの要因
 
    ; LastVisitedMRUキーを作成してオープンする
    dllproc "RegCreateKeyExA",prm,9,hdll
    if dllret!0 : dialog _DLG_DLLERROR_
 
    /*--------------------------------------------------------------------*
     *           文字列エントリMRUListのデータを読み取る           *
     *--------------------------------------------------------------------*/
 
    repeat
        wait 1
 
        ; 文字列エントリMRUListのデータサイズを取得する
        prm.0=hkey                      ; 親キーのハンドル
            nameEntry="MRUList"
        getptr prm.1,nameEntry          ; エントリ名
        prm.2=0                         ; 予約フィールド
        prm.3=0                         ; エントリタイプ(NULL)
        prm.4=0                         ; バッファへのポインタ(NULL)
        getptr prm.5,cbsize             ; エントリデータのサイズ
 
        dllproc "RegQueryValueExA",prm,6,hdll
 
        if dllret=0 : break
        /*------------------------------------------------------------*
                           エントリが無ければ新規作成
         *------------------------------------------------------------*/
 
        prm.0=hkey                  ; 親キーのハンドル
            nameEntry="MRUList"
        getptr prm.1,nameEntry      ; エントリ名
        prm.2=0                     ; 予約フィールド
        prm.3=1                     ; エントリタイプ(REG_SZ)
            szMRUList=""
        getptr prm.4,szMRUList      ; エントリデータ
        prm.5=1             ; データサイズ
            dllproc "RegSetValueExA",prm,6,hdll
            if dllret!0 : dialog _DLG_DLLERROR_
    loop
 
    ; データのサイズだけバッファを確保
    sdim szMRUList,cbsize
 
    getptr prm.4,szMRUList      ; 確保したバッファへのポインタ
    getptr prm.5,cbsize
 
    ; 文字列エントリMRUListのデータを取得する
        dllproc "RegQueryValueExA",prm,6,hdll
        if dllret!0 : dialog _DLG_DLLERROR_
 
    ; バイナリエントリの数を取得する
    strlen nEntry,szMRUList
 
    /*--------------------------------------------------------------------*
     *           存在するバイナリエントリの数だけ順次検索を行う           *
     *--------------------------------------------------------------------*/
 
    repeat nEntry+1
        match=cnt           ; 検索対象のインデックス
 
        /*------------------------------------------------------------*
                          最後まで検索し終えたかどうか
         *------------------------------------------------------------*/
 
        if cnt==nEntry{
            ; エントリの数が25未満かどうか
            if nEntry<25{
                ; 書き換えるエントリ名をnameEntryに設定
                poke nameEntry,0,'a'+cnt
                poke nameEntry,1,$00
            }
            else{
                ; 一番古いエントリをnameEntryに設定
                strmid nameEntry,szMRUList,-1,1
            }
            break
        }
 
        ; MRUListから1字読込み
        strmid nameEntry,szMRUList,cnt,1
 
        /*------------------------------------------------------------*
                            バイナリデータを読み込む
         *------------------------------------------------------------*/
 
        prm.0=hkey                  ; 親キーのハンドル
        getptr prm.1,nameEntry      ; エントリ名
        prm.2=0                     ; 予約フィールド
        prm.3=0                     ; エントリタイプ(NULL)
        prm.4=0                     ; バッファへのポインタ(NULL)
        getptr prm.5,cbsize         ; エントリデータのサイズ
 
        ; バイナリデータのサイズを取得する
        dllproc "RegQueryValueExA",prm,6,hdll
        if dllret!0 : dialog _DLG_DLLERROR_
 
        ; バイナリデータを読み込むバッファを確保する
        sdim reg_bary,cbsize
 
        getptr prm.4,reg_bary       ; 確保したバッファへのポインタ
 
            ; バイナリデータを読み込む
            dllproc "RegQueryValueExA",prm,6,hdll
            if dllret!0 : dialog _DLG_DLLERROR_
 
        /*------------------------------------------------------------*
                            バイナリデータを比較する
         *------------------------------------------------------------*/
        repeat u_aplnsize
            peek ac,u_aplname,cnt       ; 実行ファイル名の1byteデータ
            peek rc,reg_bary,cnt        ; レジストリエントリの1byteデータ
 
            ; 不一致かどうか
            if ac!rc{
                match=-1 : break                    ; 比較を中断
            }
        loop
 
        ; 一致するかどうか
        if match!-1 : break
    loop
 
    /*--------------------------------------------------------------------*
     *                    バイナリエントリを書き換える                    *
     *--------------------------------------------------------------------*/
 
    prm.0=hkey                  ; 親キーのハンドル
    getptr prm.1,nameEntry      ; エントリ名へのポインタ
    prm.2=0                     ; 予約フィールド
    prm.3=3                     ; エントリタイプ(REG_BINARY)
    getptr prm.4,reg_bdata      ; エントリデータへのポインタ
    prm.5=reg_bsize             ; データサイズ
 
        ; レジストリにバイナリエントリを作成する
        dllproc "RegSetValueExA",prm,6,hdll
        if dllret!0 : dialog _DLG_DLLERROR_
 
    /*--------------------------------------------------------------------*
     *                      MRUListを更新する                      *
     *--------------------------------------------------------------------*/
 
    strmid szFront,szMRUList,0,match
    strmid szBack,szMRUList,match+1,nEntry-match-1
    szMRUList=nameEntry+szFront+szBack
    strlen nEntry,szMRUList
 
    prm.0=hkey                  ; 親キーのハンドル
        nameEntry="MRUList"
    getptr prm.1,nameEntry      ; エントリ名
    prm.2=0                     ; 予約フィールド
    prm.3=1                     ; エントリタイプ(REG_SZ)
    getptr prm.4,szMRUList      ; エントリデータ
    prm.5=nEntry+1              ; データサイズ
 
        dllproc "RegSetValueExA",prm,6,hdll
        if dllret!0 : dialog _DLG_DLLERROR_
 
    ; キーを閉じる
    prm.0=hkey
        dllproc "RegCloseKey",prm,1,hdll
        if dllret!0 : dialog _DLG_DLLERROR_
 
    return