先ほどアップしたスクリプトは円グラフのサンプルとしては分かりづらかったので、よりシンプルなものを作成しました。
なお棒グラフの描画はHSP-NEXTさんにサンプルがあります。// 参考
// ・日経ソフトウェア 2008年1月号
// ・HSP-NEXT HSPサンプル蔵(COMオブジェクト編)
// http://hspnext.com/hspkura/hspkura11.htm
newcom xlApp, "Excel.Application"
xlApp("Visible") = 1 // ウィンドウを表示
xlApp("DisplayAlerts") = 0 // 警告メッセージを表示させない
xlBooks = xlApp("Workbooks") // Workbooks コレクション取得
xlBook = xlBooks("Add") // ワークブックを追加
xlSheet = xlBook("Worksheets", "sheet1") // シート取得
// データの書き込み
repeat 5
xlRange = xlSheet("Range", "A" + (cnt + 1)) // 代入先セルの指定
xlRange("Value") = rnd(70) + 30 // 値の代入
loop
// グラフの作成
xlCharts = xlApp("Charts")
xlChart = xlCharts("Add")
xlChart("ChartType") = 5 // 円グラフ(xlPie = 5)
xlRange = xlSheet("Range", "A1:A5") // データの範囲
xlChart -> "SetSourceData" xlRange, 2 // グラフの元データを指定
xlChart -> "Location" 2, "sheet1" // グラフの位置(既存のシートに貼り付け)
// COMオブジェクト型変数の破棄
delcom xlRange : delcom xlChart
delcom xlCharts : delcom xlSheet
delcom xlBook : delcom xlBooks
delcom xlApp
stop
2007年11月29日木曜日
Excelによる円グラフの描画
拡張子ごとの合計ファイルサイズを求める
任意のフォルダ内にあるファイルのサイズを取得し、拡張子ごとに分類・合計して出力します。
最もサイズの大きいファイルが調べられて、少し楽しいかも知れません。私の場合は素材として保存してあるBMPファイルが最大でした。HSPスクリプトは60MB、ちょっと少ないかも知れません。// 参考
// ・日経ソフトウェア 2008年1月号
// ・HSP開発wiki COMDictionary
// http://hspwiki.tm.land.to/?COMDictionary
// ・HSP-NEXT HSPサンプル蔵(COMオブジェクト編)
// http://hspnext.com/hspkura/hspkura11.htm
#include "hspext.as"
// Dictionaryの準備
newcom dc, "Scripting.Dictionary"
comres comret
dc("compareMode") = 1 // 大文字・小文字を同一視
sdim exts, 8, 10 // 拡張子名を代入する配列変数
ext_num = 0 // 拡張子の種類数
// 処理開始
gosub *select_folder // 検索対象フォルダの指定
gosub *get_data // ファイルを検索しデータを作成
gosub *make_graph // Excelによるグラフの作成
// Dicitonaryの破棄
delcom dc
end
*select_folder
target_folder = ""
selfolder target_folder, ""
if stat == 1 {
dialog "フォルダの選択がキャンセルされました。"
end
}
return
*get_data
mes "データを取得しています..."
notesel file_list
sdim file_list, 1024
sdim folder_names, 256, 10
sdim file_name, 256
sdim folder_name, 256
folder_names(0) = target_folder
folder_num = 0
// 選択したフォルダの中にあるファイルをすべて検索
// 再帰を利用しない方法
repeat
chdir folder_names(folder_num)
// ファイル一覧を取得
dirlist file_list, "*", 1
repeat stat
noteget file_name, cnt
exist file_name
if strsize > 0 {
file_size = strsize
ext = getpath(file_name, 2) // 拡張子を取り出す
dc -> "Exists" ext
if comret {
// すでにデータが存在している場合
file_size += dc("Item", ext)
dc -> "Remove" ext // Itemプロパティに対する上書きがうまくいかないので、いったん消去
} else {
// まだデータが存在していない場合
exts(ext_num) = ext
ext_num++
}
dc -> "Add" ext, file_size
}
loop
// フォルダー一覧を取得
dirlist file_list, "*", 5
folder_num--
repeat stat
// カレントフォルダにあるフォルダの名前を
// ひとつずつfolder_namesへ代入
folder_num++
noteget folder_name, cnt
folder_names(folder_num) = dir_cur + "\\" + folder_name
loop
if folder_num < 0 : break
await 1
loop
mes "データ取得が終了しました。"
return
*make_graph
mes "グラフを作成しています..."
newcom xlApp, "Excel.Application"
xlApp("Visible") = 1 // ウィンドウを表示
xlApp("DisplayAlerts") = 0 // 警告メッセージを表示させない
xlBooks = xlApp("Workbooks") // Workbooks コレクション取得
xlBook = xlBooks("Add") // ワークブックを追加
xlSheet = xlBook("Worksheets", "sheet1") // シート取得
// データの書き込み(拡張子ごとのデータ)
repeat ext_num
xlRange = xlSheet("Range", "A" + (cnt + 1)) // 代入先セルの指定
xlRange("Value") = exts(cnt) // 値の代入
xlRange = xlSheet("Range", "B" + (cnt + 1)) // 代入先セルの指定
xlRange("Value") = dc("Item", exts(cnt)) // 値の代入
loop
// データの書き込み(合計値の算出)
xlRange = xlSheet("Range", "A" + (ext_num + 1)) // 代入先セルの指定
xlRange("Value") = "合計" // 値の代入
xlRange = xlSheet("Range", "B" + (ext_num + 1)) // 代入先セルの指定
xlRange("Value") = "=SUM(A1:B" + ext_num + ")" // 値の代入
// グラフの作成
xlCharts = xlApp("Charts")
xlChart = xlCharts("Add")
xlChart("ChartType") = 5 // 円グラフ
xlRange = xlSheet("Range", "A1:B" + ext_num) // データの範囲
xlChart -> "SetSourceData" xlRange, 2 // グラフの元データを指定
xlChart -> "Location" 2, "sheet1" // グラフの位置(既存のシートに貼り付け)
// COMオブジェクト型変数の破棄
delcom xlRange : delcom xlChart
delcom xlCharts : delcom xlSheet
delcom xlBook : delcom xlBooks
delcom xlApp
mes "グラフを作成しました。"
return
2007年11月27日火曜日
IEコンポーネントによるRSSリーダー
本家BBSにて、動的にHTMLを記述するスクリプトを見て作成。
IEはあまり好きではないのですが(普段はFxを使用)、ほぼすべての環境で動作する点が長所ですね。
hspailさんのスクリプトをほぼそのまま流用しています(感謝!)が、とても基本的なスクリプトなので著作権は発生しないと考え、無許可で載せています。
ついでにmod_rss.asを利用してみました。mod_rss.as内部ではCOMを利用しています。#include "mod_rss.as"
// RSSリーダーサンプル
// 付属サンプル(rssload.hsp)を改造
// また、HSPTV!のBBSよりhspailさんのスクリプトを参考とさせていただきました。
title "Loading..."
url="http://hspwiki.tm.land.to/?cmd=rss&ver=1.0"
rssload desc, link, url, 15
if stat == 1 : dialog "取得に失敗しました。" : end
if stat == 2 : dialog "RSSではありません。" : end
axobj ie, "Shell.Explorer.2", ginfo_winx, ginfo_winy
if stat == -1 {
dialog "ActiveXコントロールの配置に失敗しました。", 1
end
}
title url
code = {"<html><body>
\t<p>クリックすると別ウィンドウでリンク先を開きます。</p>
\t<ol>\n"}
foreach desc
code += "\t<li><a href=\"" + link(cnt) + "\" target=\"_blank\">" + desc(cnt) + "</a></li>\n"
loop
code += "\t</ol>\n</body></html>"
ie -> "Navigate" "about:blank"
doc = ie("Document")
doc -> "write" code
stop
2007年11月11日日曜日
閉塞領域の塗りつぶし
ペイントツールお約束の機能も、APIを使えば簡単に実装できます。
昔はSRPGの経路探索を応用したりしてモジュールを組んでたのですが……今思えば結構無茶してますね。
なおHSP2.61用のスクリプトはCrimson Forestさんにあるようです。// 参考
// http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpgdi/html/_win32_extfloodfill.asp
#include "gdi32.as"
#module
#const FLOODFILLSURFACE 1
// カレントカラーで(x, y)を含む同色領域を塗りつぶす
// 実際の画面に反映させるには redraw 1 を実行すること
#deffunc fill int x, int y
// カレントカラーを記憶
current_color = ginfo_r, ginfo_g, ginfo_b
// カレントカラーからブラシを生成
CreateSolidBrush (ginfo_b << 16) | (ginfo_g << 8) | ginfo_r
if stat {
hBrush = stat
} else {
dialog "ブラシの生成に失敗しました。プログラムを終了します。", 1
end
}
SelectObject hDC, hBrush
// 塗りつぶす色を取得
pget x, y
// 塗りつぶし実行
ExtFloodFill hdc, x, y, (ginfo_b << 16) | (ginfo_g << 8) | ginfo_r, FLOODFILLSURFACE
// 後始末
DeleteObject hBrush
color current_color(0), current_color(1), current_color(2)
return
#global
repeat 5
hsvcolor 191 * cnt / 5, 255, 255
boxf rnd(640), rnd(480), rnd(640), rnd(480)
loop
onclick gosub *do_fill
stop
*do_fill
hsvcolor rnd(192), 255, 255
fill mousex, mousey
redraw 1
return
2007年11月10日土曜日
Footy2.as 仮公開
HSPスクリプトビューワ(Footy2)のページにコメントをくださった方、ありがとうございます。
私の力量不足によりまだ動作検証がヘルプの6章までしか終わっていない状態ですが、Footy2.asを下記アドレスにて仮公開いたします。
シフトキーロックが正常に働かないなど問題点も見つかっています。他にも不具合があるかも知れませんが、各自自己責任にてご利用ください。http://www.geocities.jp/prjctsp/hsp/Footy2.txt
※拡張子をtxtに変えているので、asにリネームしてご利用ください。
正式な公開は早くても来月以降になります。
正式公開いたしました。詳しくはこちらの記事をご覧ください。