HSPでツリー形式防災関連リンク集を作る
1.概要
ブラウザでネットサーフィンしているとお気に入りが溜まって、だんだん整理したくなくなります。大きな地震や大雨など
日々の天気予報なども気にして、気象関連などのサイトも良く閲覧しています。今回、防災関連に特化したカテゴリでの
整理したツリー形式のリンク集を作って、いざという時に素早く情報が取得できるように備えます。
2.利用方法 eqlink.exeを起動します。3つのカテゴリである「防災」、「交通機関」、「河川防災」のボタンで リンク一覧を切替ます。リンクデータは、データベース化しており、ボタンクリック毎にツリー形式のデータIDで親、子、孫を判別してテーブルより読み込んでいます。 また、終了時にウィンドウ位置を保存して、起動時に反映させています。
リンク集データは、だいぶ以前に作ってメンテしていないので、この機会にメンテして最新としています。
3.ソースコード ソースコードは、HSPスクリプト言語で作成しています。ツリーメニューは、JavaScriptで記述していて、データベースのテーブルより リンク名とURLをコードに挿入しています。バッファにソースコードを生成して格納後、一時ファイルを作成して起動させています。 終了時にウィンドウの位置を設定情報としてデータベースに書き込み、一時ファイルを削除して終了します。
4.ダウンロード 提供するソースコードのライセンスは、CC0 (クレジット表示不要、改変可、商用可) とします。自由に利用して頂いてかまいません。 尚、データの取得やプログラム実行において損害等が生じた場合は、筆者は一切の責任も負いません。全て自己責任でお願いします。
紹介した防災関連リンク (eqlink.exe)は、下記よりダウンロードして下さい。
ダウンロード
2.利用方法 eqlink.exeを起動します。3つのカテゴリである「防災」、「交通機関」、「河川防災」のボタンで リンク一覧を切替ます。リンクデータは、データベース化しており、ボタンクリック毎にツリー形式のデータIDで親、子、孫を判別してテーブルより読み込んでいます。 また、終了時にウィンドウ位置を保存して、起動時に反映させています。
リンク集データは、だいぶ以前に作ってメンテしていないので、この機会にメンテして最新としています。
3.ソースコード ソースコードは、HSPスクリプト言語で作成しています。ツリーメニューは、JavaScriptで記述していて、データベースのテーブルより リンク名とURLをコードに挿入しています。バッファにソースコードを生成して格納後、一時ファイルを作成して起動させています。 終了時にウィンドウの位置を設定情報としてデータベースに書き込み、一時ファイルを削除して終了します。
;**************************************************************************** ;* ;* 防災関連リンク (eqlink.hsp) Ver1.1 ;* ;* <処理の概要> ;* 本プログラムは、防災関連リンク集をJavascriptを利用したツリーメニュー ;* 形式をIEオブジェクトを利用して表示するものである。 ;* リンクの作成は、階層化したデータベースのメニューテーブルより展開し ;* ており、メニューテーブルをメンテすれば、カスタマイズ可能である。 ;* ;**************************************************************************** #include "sqlele.hsp" #packopt type 0 #packopt name "eqlink" #packopt runtime "hsprt" #packopt manifest "app.manifest" #packopt icon "SetDisp.Ico" #packopt hide 1 #pack "linkbtn.png" #define DIID_DWebBrowserEvents2 "{34A715A0-6587-11D0-924A-0020AFC7AC4D}" #define DISPID_NAVIGATECOMPLETE2 252 #define TEMP_FILE dir_cur+"/exec.tmp" ;***** カーソルの形状を変更 ***** #module #uselib "user32.dll" #func LoadCursorFromFile "LoadCursorFromFileA" var #func LoadCursor "LoadCursorA" int,int #func SetClassLong "SetClassLongA" int,int,int #func SetCursor "SetCursor" int #define IDC_ARROW $00007F00 #deffunc chengecur int prm1,str prm2,int prm3 UserMode = prm1 : if UserMode<0 : return -1 sdim Curfname,260 Curfname = prm2 ;カーソルファイル名 resourceID = prm3 ;リソースID (0~ ;UserMode=$200 でカーソルファイル名が設定されていた場合は、 ;ユーザーカーソルを設定 if (UserMode==$200)&(strlen(Curfname)!0) { LoadCursorFromFile varptr(Curfname) hcurwnd=stat SetClassLong hwnd,-12,hcurwnd SetCursor hcurwnd sdim Curfname,0 return 0 } ;リソースIDに対応するカーソルを設定 (object Mode) (ID=0~28) hinst=0 : lpszCursor=IDC_ARROW if resourceID>=5 : resourceID+=123 LoadCursor hinst,resourceID+lpszCursor hcurwnd=stat ;if UserMode==$100 { ; hCld=hwnd ; }else{ hCld=objinfo(UserMode,2) ;} SetClassLong hCld,-12,hcurwnd SetCursor hcurwnd sdim Curfname,0 return 0 #global #module #uselib "kernel32.dll" #cfunc CreateMutex "CreateMutexA" int,int,sptr #cfunc GetLastError "GetLastError" ;***** 二重起動防止 ***** #deffunc wexapend str prm1 strname=prm1 ;***** 名前の文字列が省略された場合 ***** if strlen(strname)==0 : strname="HSP340ONIWND" ;Default String ret=CreateMutex(0,1,strname) ;二重起動か? if GetLastError()==0 : return 0 ;同じジョブが起動していない if GetLastError()==183 : return 1 ;既に起動している return -1 #global ;***** 起動ディレクトリ取得 ***** sdim Startdir,512 if hspstat&1=0 { Startdir=dir_exe+"¥¥" : chdir dir_exe } else { Startdir=dir_cur+"¥¥" } chdir Startdir ;***** データベース存在確認 ***** exist Startdir+"setting¥¥eqlink.ini" if strsize ==-1 { dialog "データベースファイルが見つかりません。",0 : end } await wexapend "eqlink" : if stat : end ;***** データベースオープン ***** sql_open Startdir+"setting¥¥eqlink.ini" onexit goto *owari ;***** 画面表示位置設定 ***** sql_q "SELECT * FROM TValu WHERE ID = "+1 xpos=sql_i("wxpos") : ypos=sql_i("wypos") if (xpos<0 or xpos>ginfo_dispx) : xpos=0 if (ypos<0 or ypos>ginfo_dispy) : ypos=0 buffer 2,200,22,0 : picload "linkbtn.png",0 screen 0,360,410,,xpos,ypos color 234,234,242 : boxf color 220,220,220 : boxf 0,378,360,378 color 200,200,200 : line 0,379,360,379 color 255,255,255 : line 0,380,360,380 pos 3,384 : objsize 60,22 : objimage 2,0,0,60,22 : button "",*mode01 pos 66,384 : objsize 70,22 : objimage 2,60,0,130,22 : button "",*mode02 pos 139,384 : objsize 70,22 : objimage 2,130,0,200,22 : button "",*mode03 chengecur 0,"",14 pos 0, 0 : axobj ie, "Shell.Explorer.2", 360, 367 target = "00" flag = "00" *main ;***** 実行用HTMLを生成 ***** sdim buff,5000 : sdim UPD_INFO,128,7 buff = "<html><head>¥n" buff+= "<meta http-equiv=¥"Content-Type¥" content=¥"text/html; charset=shift-jis¥">¥n" buff+= "<meta http-equiv=¥"Content-Script-Type¥" content=¥"text/javascript¥">¥n" buff+= "<meta http-equiv=¥"Content-Style-Type¥" content=¥"text/css¥">¥n" buff+= "<style type=¥"text/css¥">¥n" buff+= ".default_text {¥n" buff+= " cursor: head;¥n" buff+= " color: #000000;¥n" buff+= " text-decoration: none;¥n" buff+= " font-family: Meiryo UI;¥n" buff+= " font-size: 11px;¥n" buff+= "}¥n" buff+= ".highlight_text {¥n" buff+= " cursor: hand;¥n" buff+= " color: #000000;¥n" buff+= " background-color: #00ffff;¥n" buff+= " text-decoration: none;¥n" buff+= " font-family: Meiryo UI;¥n" buff+= " font-size: 11px;¥n" buff+= "}¥n" buff+= ".marginset {¥n" buff+= " margin-left: 2px;¥n" buff+= " display: block;¥n" buff+= "}¥n" buff+= ".ifstyle {¥n" buff+= " border-left: 0px solid #ffffff;¥n" buff+= " border-right: 0px solid #ffffff;¥n" buff+= " border-top: 0px solid #ffffff;¥n" buff+= " border-bottom: 0px solid #ffffff;¥n" buff+= "}¥n" buff+= "</style>¥n" buff+= "<script language=¥"JavaScript¥" type=¥"text/javascript¥"><!--¥n" buff+= "//***** Icon名定義 *****¥n" buff+= "var IconImgPath = ¥"./image/¥";¥n" buff+= "var IconSet = new Array(2);¥n" buff+= " IconSet[0] = ¥"ic00.gif¥";¥n" buff+= " IconSet[1] = ¥"ic01.gif¥";¥n" buff+= " IconSet[2] = ¥"ic02.gif¥";¥n" buff+= "function ClickAction(idMenu){¥n" buff+= " if(idMenu.style.display!=¥"block¥"){¥n" buff+= " idMenu.style.display=¥"block¥";¥n" buff+= " }¥n" buff+= " else{¥n" buff+= " idMenu.style.display=¥"none¥";¥n" buff+= " }¥n" buff+= "}¥n" buff+= "function ClickOpen(idMenu){¥n" buff+= " idMenu.style.display=¥"block¥";¥n" buff+= "}¥n" buff+= "function rollon() {¥n" buff+= " if (window.event.srcElement.className == ¥"default_text¥") {¥n" buff+= " window.event.srcElement.className = ¥"highlight_text¥";¥n" buff+= " }¥n" buff+= "}¥n" buff+= "document.onmouseover = rollon;¥n" buff+= "function rolloff() {¥n" buff+= " if (window.event.srcElement.className == ¥"highlight_text¥") {¥n" buff+= " window.event.srcElement.className = ¥"default_text¥";¥n" buff+= " }¥n" buff+= "}¥n" buff+= "document.onmouseout = rolloff;¥n" buff+= "function writeParent(name,idnameShow,path,no,tframe){¥n" buff+= " if(path==¥"¥"){¥n" buff+= " document.write(¥"<span class='default_text' onClick='ClickAction(¥"+idnameShow+¥");'>¥");¥n" buff+= " document.write(¥"<img src='¥"+IconImgPath+IconSet[no]+¥"' width='16' height='16' align='absmiddle'>¥");¥n" buff+= " document.write(¥" ¥"+name);¥n" buff+= " document.write(¥"</span><br>¥");¥n" buff+= " }¥n" buff+= " else{¥n" buff+= " document.write(¥"<span class='default_text' onClick='ClickAction(¥"+idnameShow+¥");'>¥");¥n" buff+= " document.write(¥"<img src='¥"+IconImgPath+IconSet[no]+¥"' width='16' height='16' align='absmiddle'>¥");¥n" buff+= " document.write(¥"</span>¥");¥n" buff+= " document.write(¥"<span class='default_text' onClick='ClickOpen(¥"+idnameShow+¥");'>¥");¥n" buff+= " document.write(¥"<a href='¥"+path+¥"' target='¥"+tframe+¥"' class='default_text'>¥"+name+¥"</a>¥");¥n" buff+= " document.write(¥"</span><br>¥");¥n" buff+= " }¥n" buff+= "}¥n" buff+= "function writeChild(name,path,no,tframe){¥n" buff+= " document.write(¥"<a href='¥"+path+¥"' target='¥"+tframe+¥"' class='default_text'>¥");¥n" buff+= " document.write(¥" <img src='¥"+IconImgPath+IconSet[no]+¥"' width='16' height='16' border='0' align='absmiddle'>¥");¥n" buff+= " document.write(¥" ¥"+name);¥n" buff+= " document.write(¥"</a><br>¥");¥n" buff+= "}¥n" buff+= "//--></script>¥n" buff+= "</head><body bgcolor=¥"#eaeaf2¥">¥n" buff+= "<table width=322 height=380 border=0 cellpadding=0 cellspacing=0>¥n" buff+= "<tr>¥n" buff+= " <td width=322 align=¥"left¥" valign=¥"top¥">¥n" ;***** 階層メニューを作成する ***** sql_q "SELECT * FROM TREETABLE WHERE pid = '"+target+"'" + "ORDER BY cid ASC" count = stat nID = "a" ReadRec = 0 CHUPD_INFO = "" repeat count,1 UPD_INFO(1) = sql_v("pid") UPD_INFO(2) = sql_v("p_name") UPD_INFO(3) = sql_v("cid") UPD_INFO(4) = sql_v("c_name") UPD_INFO(5) = sql_v("cmid") UPD_INFO(6) = sql_v("m_name") UPD_INFO(7) = sql_v("urllink") ;***** 孫IDを退避 ***** MGUPD_INFO = UPD_INFO(5) ;***** 親カテゴリ名を代入 ***** if UPD_INFO(1)==flag { buff+= "<div class=¥"marginset¥" style=¥"padding-left:6px¥"<nobr>¥n" buff+= " <script>¥n" buff+= " writeParent(¥""+UPD_INFO(2)+"¥",¥"a0¥",¥"¥",2,¥"¥");¥n" buff+= " </script>¥n" buff+= " <div id=a0 style=¥"display:block:margin-left:10px;¥">¥n" } ;***** 前回の孫IDと今回の孫IDが変化した場合 ***** if (flag=="00") or (flag=="01") or (flag=="02") : goto *skip if MAGO_INFO!=UPD_INFO(5) { buff+= " </script>¥n" buff+= " </div>¥n" } *skip flag="99" ;***** 子カテゴリ名を代入 ***** if CHUPD_INFO!=UPD_INFO(3) { ReadRec++ buff+= " <script>¥n" buff+= " writeParent(¥""+UPD_INFO(4)+"¥",¥""+nID+ReadRec+"¥",¥"¥",1,¥"¥");¥n" buff+= " </script>¥n" buff+= " <div id="+nID+ReadRec+" style=¥"display:block:margin-left:10px;¥">¥n" buff+= " <script>¥n" buff+= " writeChild(¥" "+UPD_INFO(6)+"¥",¥""+UPD_INFO(7)+"¥",0,¥"_blank¥");¥n" } ;***** 孫カテゴリ名を代入 ***** if CHUPD_INFO==UPD_INFO(3) { buff+= " writeChild(¥" "+UPD_INFO(6)+"¥",¥""+UPD_INFO(7)+"¥",0,¥"_blank¥");¥n" } ;***** 子IDを退避 ***** CHUPD_INFO=UPD_INFO(3) ;***** 前回孫IDを退避 ***** MAGO_INFO=UPD_INFO(5) sql_next loop buff+= " </script>¥n" buff+= " </div>¥n" buff+= "</nobr></div>¥n" buff+= " </td>¥n" buff+= "</tr>¥n" buff+= "</table>¥n" buff+= "</body></html>¥n" bsave TEMP_FILE, buff, strlen(buff) ie->"Navigate" "file:///"+TEMP_FILE comevent ie_event, ie, DIID_DWebBrowserEvents2, *event gsel 0,1 stop *event dispid = comevdisp(ie_event) if dispid = DISPID_NAVIGATECOMPLETE2 title "防災関連リンク" return *mode01 ;***** 防災関連 ***** target = "00" : flag = "00" : objsel 3 : goto *main *mode02 ;***** 交通機関 ***** target = "01" : flag = "01" : objsel 3 : goto *main *mode03 ;***** 都道府県河川 ***** target = "02" : flag = "02" : objsel 3 : goto *main *owari ;***** 終了処理 (DB CLOSE) ***** wx=str(ginfo_wx1) ; 現在の画面左上 X 座標取得 wy=str(ginfo_wy1) ; 現在の画面左上 y 座標取得 ;***** 終了位置をDBへ保存 ***** sql_q "UPDATE TValu SET wxpos=" + prm_text(wx) + ", wypos=" + prm_text(wy)+ " WHERE ID="+1 sql_close ;***** 一時ファイルを削除 ***** exist Startdir+"exec.tmp" if strsize !=-1 { delete Startdir+"exec.tmp" } end
4.ダウンロード 提供するソースコードのライセンスは、CC0 (クレジット表示不要、改変可、商用可) とします。自由に利用して頂いてかまいません。 尚、データの取得やプログラム実行において損害等が生じた場合は、筆者は一切の責任も負いません。全て自己責任でお願いします。
紹介した防災関連リンク (eqlink.exe)は、下記よりダウンロードして下さい。
ダウンロード
コメント
コメントを投稿