ab.com コミュニティ https://www.activebasic.com/forum/ |
|
関数:_splitpathについて https://www.activebasic.com/forum/viewtopic.php?t=2518 |
ページ 1 / 1 |
作成者: | C1000 [ 2008年12月27日(土) 21:31 ] |
記事の件名: | 関数:_splitpathについて |
関数:_splitpathを使ってファイル名と取り出すのに次のようなコードを組みましたが、 変数:fname[0]が常にゼロとなってしまい、スタティックテキストに何も表示されませ ん原因は何でしょうか。 ちなみに、他の変数にはきちんと文字が代入されています。 コード: dim drv[2] As Byte dim path[255] As Byte dim fname[255] As Byte dim ext[3] As Byte 'bufferにファイルのパスが入っている _splitpath(buffer, drv, path, fname, ext) 'スタティックテキストにパスを設定する SetWindowText(hStatic,lstrcat(fname,ext)) 'fname[0]=0となりスタティックテキストに何も表示できない |
作成者: | konisi [ 2008年12月27日(土) 22:40 ] |
記事の件名: | |
こちらの環境では、bufferの中身が C:/test/test.abp.txt となってるときには上手く動きませんでしたが、 C:\test\test.abp.txt となってるときには上手く動きました。 bufferの中身はどのようになっていますか? |
作成者: | C1000 [ 2008年12月27日(土) 23:08 ] |
記事の件名: | |
bufferの中身は「ファイルを開く」ダイアログボックスで取得しているのでいろいろ変わりますが、 C:\test\test.abp.txt などという形式です。 また、 _splitpath("C:/test/test.abp.txt", drv, path, fname, ext) のように直接パスを入れてみてもうまくいきませんでした。 また、普通の.abのファイルに下のようなコードで試したところ、こちらではうまくいきました。しかし、プロジェクトファイルではうまくいきませんでした。 コード: dim drv[2] As Byte dim path[255] As Byte dim fname[255] As Byte dim ext[63] As Byte dim f[255] As Byte Dim ofn As OPENFILENAME Dim buffer[MAX_PATH-1] As Byte '------------------ ' ファイル名を取得 '------------------ ofn.lStructSize=Len(ofn) ofn.hwndOwner=0 ofn.lpstrFilter=Ex"マルチメディア ファイル (*.avi;*.wav;*.mid;*.mp3;*.wma)\0*.avi;*.wav;*.mid;*.mp3;*.wma\0すべてのファイル(*.*)\0*\0\0" ofn.nFilterIndex=1 ofn.nMaxFile=MAX_PATH ofn.Flags=OFN_FILEMUSTEXIST or OFN_HIDEREADONLY ofn.lpstrFile=f GetOpenFileName(ofn) _splitpath(ofn.lpstrFile, drv, path, fname, ext) MessageBox(0, lstrcat(fname,ext), "testcode", MB_OK) end |
作成者: | konisi [ 2008年12月29日(月) 16:41 ] |
記事の件名: | |
>また、普通の.abのファイルに下のようなコードで試したところ AB5のどのバージョンを使っていますか? 「UNICODE文字セットを使用する」のチェックが入っている場合は、_splitpath関数の代わりに_wsplitpath関数を用いる事で解決するかもしれません。 コード: Declare Sub _wsplitpath Lib "MSVCRT" (path As *Word,drive As *Word,dir As *Word,name As *Word,ext As *Word) |
作成者: | C1000 [ 2008年12月31日(水) 20:38 ] |
記事の件名: | |
バージョンはAB5β13です。「UNICODE文字セットを使用する」のチェックは入っていませんでした。_wsplitpath関数を使って試してみましたがうまくいきませんでした。 |
作成者: | ゲスト [ 2009年1月03日(土) 08:09 ] |
記事の件名: | |
ver424で下記のようにして使ってます。 以前に凡そで造ったので、何か変な気がしていますが動いてます。 function filesplit(tes as string,k as word) as string dim drv as BytePtr ,dir as BytePtr ,fna as BytePtr ,ext as BytePtr dim ppath as BytePtr drv=malloc(8) dir=malloc(255) fna=malloc(128) ext=malloc(8) ppath=calloc(512) _splitpath(tes,drv,dir,fna,ext) select case k case 1 lstrcat(ppath,drv)' lstrcat(ppath,dir)' case 2 lstrcat(ppath,fna)' lstrcat(ppath,ext)' end select ppath[lstrlen(ppath)]=0 filesplit=MakeStr(ppath) end function |
作成者: | konisi [ 2009年1月03日(土) 15:05 ] |
記事の件名: | |
なぜβ13使ってるんだろう。 せめてAB4.24とかAB5CP5とか使ってみてください。 >>ゲスト 見間違いでなければ、物凄い勢いでメモリリークしない?その関数。 とりあえず異常系とか書き足してみる。 [ここをクリックすると内容が表示されます]
コード: Const FILESPLIT_DIRECTORY=1 Const FILESPLIT_FILENAME=2 Function filesplit(tes As String,k As Long) As String Dim drv As *Byte,dir As *Byte,fna As *Byte,ext As *Byte Dim ppath As *Byte Dim length As Long filesplit="" length=Len(tes) drv=malloc(length+1) dir=malloc(length+1) fna=malloc(length+1) ext=malloc(length+1) ppath=malloc(length+1) If drv=0 Or dir=0 Or fna=0 Or ext=0 Or ppath=0 then'mallocが上手く動かない場合 free(drv) free(dir) free(fna) free(ext) free(ppath) Exit Function End If ppath[0]=0 _splitpath(StrPtr(tes),drv,dir,fna,ext) Select Case k Case 1 lstrcat(ppath,drv) lstrcat(ppath,dir) Case 2 lstrcat(ppath,fna) lstrcat(ppath,ext) Case Else lstrcpy(ppath,StrPtr(tes)) End Select filesplit=MakeStr(ppath) free(ppath) free(drv) free(dir) free(fna) free(ext) End Function '使用例 #console Print filesplit("c:\tes\test.txt",FILESPLIT_DIRECTORY) Print filesplit("c:\tes\test.txt",FILESPLIT_FILENAME) Sleep(-1) |
作成者: | C1000 [ 2009年1月03日(土) 16:21 ] |
記事の件名: | |
Konisiさんのコードでうまくファイル名を分離できました。ゲストさん、konisiさんありがとうございました。ちなみに、β13を使う理由はAB5のほうがきのうがいいけれどABCP5だとものすごい数のエラーが出るから、ということです。 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |