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

1.概要

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



2.利用方法

eqlink.exeを起動します。3つのカテゴリである「防災」、「交通機関」、「河川防災」のボタンで リンク一覧を切替ます。リンクデータは、データベース化しており、ボタンクリック毎にツリー形式のデータIDで親、子、孫を判別してテーブルより読み込んでいます。 また、終了時にウィンドウ位置を保存して、起動時に反映させています。
リンク集データは、だいぶ以前に作ってメンテしていないので、この機会にメンテして最新としています。

3.ソースコード

ソースコードは、HSPスクリプト言語で作成しています。ツリーメニューは、JavaScriptで記述していて、データベースのテーブルより リンク名とURLをコードに挿入しています。バッファにソースコードを生成して格納後、一時ファイルを作成して起動させています。 終了時にウィンドウの位置を設定情報としてデータベースに書き込み、一時ファイルを削除して終了します。
eqlink.hsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
  ;****************************************************************************
  ;*
  ;*    防災関連リンク (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>
¥");¥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>
¥");¥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>
¥");¥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ファイルの作成

キーボードのキーコードの一覧表