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)は、下記よりダウンロードして下さい。
ダウンロード


コメント
コメントを投稿