HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
0715
Query続・スペース区切りのファイルを表にしたい4解決


Query

リンク

2021/7/15(Thu) 18:57:25|NO.93228

すみません、前スレ(http://hsp.tv/play/pforum.php?mode=all&num=93215)は解決
したのですが、実際に動かしたいファイルではできませんでした。
動かしたいファイルは、msinfo32のレポートファイルで、以下の感じで処理します。

exec "msinfo32 /report c:\msinfo32.txt"
この場合、c:\にmsinfo32のレポートファイル"msinfo32.txt"が作成されています。
これを前スレで行う場合なのですが、スペース区切りではOS|名Microsoft|Windows10|Education
(|は表の区切り)のように処理されてしまいます。
回避策として考えたのは、文字列によって表を変えるという方法なのですが...わかりません。
例えば、msinfo32.txtの内容が、
システム
OS 名 Microsoft Windows 10 Education
CPU Intel Core i7 1109G7
~~~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~~~~~~
ドライバー
マウス Logicool WS8328 USB ・・・・

となっていたとしたら、システムはシステム用の表、ドライバーはドライバーの表みたいに
したいのです。レポートファイルは、改行で別のセクションに移動しています。
(システムの次がドライバならシステムとドライバの内容の間に改行)
このように改行によって表示する表を変えることは可能でしょうか?
語彙力が悪くてすみません... どうかよろしくお願いします。



この記事に返信する


ユーヤン

リンク

2021/7/15(Thu) 19:44:07|NO.93229

試していませんが、execの代わりにWin32APIのShellExecute関数を使うのはどうでしょうか?
あとバックスラッシュは\ではなく\\です。

#uselib "shell32.dll" #func ShellExecute "ShellExecuteA" int,sptr,sptr,sptr,sptr,int #define SW_SHOW 5 #define NULL 0 ShellExecute hwnd,"open",dir_sys+"\\msinfo32.exe","c:\\msinfo32.txt",NULL,SW_SHOW



Query

リンク

2021/7/15(Thu) 19:50:32|NO.93230

返信ありがとうございます。試したのですが、「ファイルがありません。」との表示が出ました。
msinfo32を使うのではなく、HSP内に前スレのように入れたりしたいです。



沢渡

リンク

2021/7/15(Thu) 22:00:31|NO.93231

当方の環境でmsinfo32.txtを出力し、試してみました。
区切り文字は半角スペースではなくタブコードのようなので、それで分割します。
取り急ぎ突貫工事で作ったものなので穴があるかもしれませんが、とりあえず。
(モジュールの使い方については前回のスレを参照してください)

#module #define global listview(%1=300,%2=200,%3=0x50000001,%4=0) winobj "SysListView32","",%4,%3,%1,%2 #define global lv_addcol(%1,%2="",%3=0,%4=-1,%5=100,%6=0) _lv_addcol %1,%2,%3,%4,%5,%6 #deffunc _lv_addcol int c_h,str _c_s,int c_p,int _c_i,int c_w,int c_f c_s=_c_s : dim lvc,8 if _c_i<0 : c_i=c_p : else : c_i=_c_i lvc=0xF,c_f,c_w,varptr(c_s),0,c_i sendmsg c_h,0x101B,c_p,varptr(lvc) //LVM_INSERTCOLUMN=0x101B return #define global lv_additem(%1,%2="",%3=0,%4=0) _lv_additem %1,%2,%3,%4,1 #define global lv_setitem(%1,%2="",%3=0,%4=0) _lv_additem %1,%2,%3,%4,0 #deffunc _lv_additem int i_h,str _i_s,int i_p,int i_c,int i_flg i_s=_i_s : dim lvi,13 lvi=1,i_p,i_c,0,0,varptr(i_s) sendmsg i_h,0x1006+(i_flg!=0),0,varptr(lvi) //LVM_SETITEM=0x1006 LVM_INSERTITEM=0x1007 return #global //以下、msinfo32.txtはすでに出力されているものとする。 exist "d:\\msinfo32.txt" //当方の環境ではCドライブに出力できなかったのでDドライブで。適宜置き換えてください。 x=strsize : if x=-1 : dialog "ファイルが存在しません" : end //出力されたファイルはUTF-16なのでShift_JISに変換する sdim dum,x+2 : bload "d:\\msinfo32.txt",dum,x buf=cnvwtos(dum) : notesel buf dim dum //ロードに使用したバッファを解放 //行頭が"["になっている行の数を数える(カテゴリの数) cats=0 repeat notemax noteget buf2,cnt if peek(buf2,0)='[' : cats++ loop //カテゴリ情報を取得 sdim cat_n,64,cats : dim cat_l,cats+1 x=0 repeat notemax noteget buf2,cnt if peek(buf2,0)='[' { cat_l(x)=cnt //カテゴリがどの行から始まるか strrep buf2,"[","" : strrep buf2,"]","" : cat_n(x)=buf2 //カテゴリ名 x++ } loop cat_l(cats)=notemax //最後のカテゴリを選択した時用 com_str="" //コンボボックス用にカテゴリ名をまとめたもの repeat cats if cnt>0 : com_str+="\n" com_str+=cat_n(cnt) loop pos 0,0 : objsize 300,16 : combox dum,,com_str : com_h=objinfo(stat,2) cat_sel=0 //選択したカテゴリ gosub *view_data //コンボボックスを変更した時の割り込み oncmd gosub *com_chan,0x111 //WM_COMMAND stop *com_chan debug=1 if lparam=com_h { if ((wparam>>16)&0xFFFF)=1 { //CBN_SELCHANGE sendmsg com_h,0x147,0,0 //CB_GETCURSEL if stat>=0 { //表示切り替え cat_sel=stat : clrobj lv_id,lv_id gosub *view_data } } } return *view_data //カテゴリの内容をリストビューに表示 pos 10,20 : listview 620,450 : lv_id=stat : lv_h=objinfo(lv_id,2) //カテゴリ内のテキストを抜き出す l=cat_l(cat_sel)+1 //抜き出す行番号 first_f=0 //最初の行は項目名なので、それを取得したかどうかフラグ cols=0 //リストビューの項目数 lines=0 //リストビューの行数 repeat if l=cat_l(cat_sel+1) : break //次のカテゴリの行まで来たら脱出 noteget buf2,l notext_f=0 //空っぽの行フラグ repeat //行末からタブコードを取り除く。 //その結果空っぽの行になったらnotext_fを1に。 x=strlen(buf2) if x=0 : notext_f=1 : break if peek(buf2,x-1)=9 : poke buf2,x-1,0 : else : break //タブコードのASCIIコードは9 loop if notext_f=0 { split buf2,"\t",res : items=stat //タブコードで分割する if first_f=0 { //最初の行の場合は項目を追加 cols=items repeat cols lv_addcol lv_h,res(cnt),cnt,,580/cols loop first_f=1 } else { //最初の行以外の場合はアイテムを追加 repeat items if cnt>=cols { //分割数が現在の項目数を超えた場合は空っぽの項目を追加 lv_addcol lv_h,"",cnt : cols++ } if cnt=0 : lv_additem lv_h,res(cnt),lines,cnt : else : lv_setitem lv_h,res(cnt),lines,cnt loop lines++ } } l++ loop return



Query

リンク

2021/7/15(Thu) 22:54:35|NO.93232

沢渡さん、前スレでもお世話になりました。本当にありがとうございます。
正常に動作しました。これでアプリのほうを作ることができます。



ONION software Copyright 1997-2023(c) All rights reserved.