HSPでツリー形式防災関連リンク集を作る

1.概要

ブラウザでネットサーフィンしているとお気に入りが溜まって、だんだん整理したくなくなります。大きな地震や大雨など 日々の天気予報なども気にして、気象関連などのサイトも良く閲覧しています。今回、防災関連に特化したカテゴリでの 整理したツリー形式のリンク集を作って、いざという時に素早く情報が取得できるように備えます。



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

ダウンロード

コメント

このブログの人気の投稿

Excelアドインで日本語形態素解析

階層構造JSONファイルの作成

HSPでコマンドプロンプトを制御する

TOP