<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>たにぐちBLOG</title><link>http://blogs.sqlpassj.org/masatotaniguchi/</link><description>C#が好きでたまんない</description><managingEditor>たにぐち</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>たにぐち</dc:creator><title>祝　およげたいやきくんギネス認定</title><link>http://blogs.sqlpassj.org/masatotaniguchi/archive/2008/02/20/24576.aspx</link><pubDate>Wed, 20 Feb 2008 14:40:00 GMT</pubDate><guid>http://blogs.sqlpassj.org/masatotaniguchi/archive/2008/02/20/24576.aspx</guid><wfw:comment>http://blogs.sqlpassj.org/masatotaniguchi/comments/24576.aspx</wfw:comment><comments>http://blogs.sqlpassj.org/masatotaniguchi/archive/2008/02/20/24576.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.sqlpassj.org/masatotaniguchi/comments/commentRss/24576.aspx</wfw:commentRss><trackback:ping>http://blogs.sqlpassj.org/masatotaniguchi/services/trackbacks/24576.aspx</trackback:ping><description>&lt;P&gt;いやぁ懐かしいですね。子供の頃大好きでした。&lt;BR&gt;&lt;A href="http://contents.oricon.co.jp/news/music/52000/"&gt;http://contents.oricon.co.jp/news/music/52000/&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;私のカラオケの十八番なんですが、３０代後半から４０代前半の方には大ウケします。ほんものの子門真人さんみたいと言ってもらえることも（←ほんとうですってば）！&lt;BR&gt;♪ま～い～にち、ま～い～にち僕らはてっぱんのぉ～♪&lt;/P&gt;
&lt;P&gt;# 今日会社を休んでいます。昨日朝通勤途中で足を挫いてしまい、足首の激痛で歩行が困難なためです。&lt;BR&gt;足首が腫れて赤くなっています。１階と２階の上り下りがツライです。&lt;BR&gt;原因は歩道の段差に気付かなかったことですが、われながら情けないです。トホホ。&lt;BR&gt;&lt;/P&gt;&lt;img src ="http://blogs.sqlpassj.org/masatotaniguchi/aggbug/24576.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>たにぐち</dc:creator><title>タイ在住時住んでいたマンションを発見！</title><link>http://blogs.sqlpassj.org/masatotaniguchi/archive/2008/02/16/24554.aspx</link><pubDate>Sat, 16 Feb 2008 23:42:00 GMT</pubDate><guid>http://blogs.sqlpassj.org/masatotaniguchi/archive/2008/02/16/24554.aspx</guid><wfw:comment>http://blogs.sqlpassj.org/masatotaniguchi/comments/24554.aspx</wfw:comment><comments>http://blogs.sqlpassj.org/masatotaniguchi/archive/2008/02/16/24554.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.sqlpassj.org/masatotaniguchi/comments/commentRss/24554.aspx</wfw:commentRss><trackback:ping>http://blogs.sqlpassj.org/masatotaniguchi/services/trackbacks/24554.aspx</trackback:ping><description>&lt;P&gt;何気なく、google earthで遊んでいました。オモシロいですね。中学１年生の頃住んでいたスクムビット通りのソイ４７はどうなっただろうと、見てみました。住んでいたマンションはさすがに無いだろうなぁ、と思っていると、それらしき建物を発見！建物の形状、プールの位置などから間違いないと断定しました。名前は当時「ウィッタヤー・コート」という名前でした。タイの物件情報を検索してもそれらしきものは見つかりませんでした。それもそのはず、そのマンションは「スリンダ・マンション」と名前を変えていたのです。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.kobayashi.co.th/sukhumvit/apartment/sk1397.htm"&gt;http://www.kobayashi.co.th/sukhumvit/apartment/sk1397.htm&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.platinum-service.jp/new34.htm"&gt;http://www.platinum-service.jp/new34.htm&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;建物、プールや庭の様子などはそのまんま（新オーナーの趣味なのか植えてある植物は増えています）。しかし、築１９８９年とは！？私が帰国したのは１９８３年末でその頃すでに新しくは無かったんですが。。&lt;BR&gt;改築したにしてもあまりにもそのまますぎです。&lt;/P&gt;
&lt;P&gt;マイペンライ！マイペンライ！&lt;/P&gt;&lt;img src ="http://blogs.sqlpassj.org/masatotaniguchi/aggbug/24554.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>たにぐち</dc:creator><title>が～ん</title><link>http://blogs.sqlpassj.org/masatotaniguchi/archive/2008/02/02/24526.aspx</link><pubDate>Sat, 02 Feb 2008 23:52:00 GMT</pubDate><guid>http://blogs.sqlpassj.org/masatotaniguchi/archive/2008/02/02/24526.aspx</guid><wfw:comment>http://blogs.sqlpassj.org/masatotaniguchi/comments/24526.aspx</wfw:comment><comments>http://blogs.sqlpassj.org/masatotaniguchi/archive/2008/02/02/24526.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.sqlpassj.org/masatotaniguchi/comments/commentRss/24526.aspx</wfw:commentRss><trackback:ping>http://blogs.sqlpassj.org/masatotaniguchi/services/trackbacks/24526.aspx</trackback:ping><description>&lt;P&gt;昨日、健康診断に行ってきましたが、血圧がなんと上が１３５、下が９０でした。&lt;BR&gt;職場近くはおいしい店がたくさんあるため、連日の食べ歩きのせいか、&lt;BR&gt;なんて思ったりもしていますが、血圧が１年で１０もあがってしまうのは&lt;BR&gt;ちょっとヤバイかもと思っています。&lt;/P&gt;
&lt;P&gt;そこで今日から食生活改善計画を打ち立てました！&lt;/P&gt;
&lt;P&gt;1.大好きなビール、焼酎は土曜夜週１回に限る。&lt;BR&gt;飲み会のあった週は中止。&lt;BR&gt;2.夜９時以降は、食べない。&lt;BR&gt;3.スナック菓子は食べない。おやつは和菓子のみ。&lt;BR&gt;4.昼の食べ歩きストップはちょっとさびしいので、&lt;BR&gt;朝おにぎり一個、夜は野菜、魚、豆腐、こんにゃく等を中心にする。&lt;/P&gt;
&lt;P&gt;さて、いつまで続くやら？&lt;/P&gt;
&lt;P&gt;ちなみに餃子騒ぎで回収品目になった「ピリ辛カルビ炒飯」&lt;BR&gt;は好きでよく食べていました。&lt;BR&gt;冷凍餃子も、ホットプレートやフライパンで手軽に調理出来るので、&lt;BR&gt;よく食べていましたが、幸いなことにそれで体調を崩すことはありませんでした。&lt;/P&gt;&lt;img src ="http://blogs.sqlpassj.org/masatotaniguchi/aggbug/24526.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>たにぐち</dc:creator><title>ファイル「完全削除」</title><link>http://blogs.sqlpassj.org/masatotaniguchi/archive/2008/01/10/24462.aspx</link><pubDate>Thu, 10 Jan 2008 23:29:00 GMT</pubDate><guid>http://blogs.sqlpassj.org/masatotaniguchi/archive/2008/01/10/24462.aspx</guid><wfw:comment>http://blogs.sqlpassj.org/masatotaniguchi/comments/24462.aspx</wfw:comment><comments>http://blogs.sqlpassj.org/masatotaniguchi/archive/2008/01/10/24462.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blogs.sqlpassj.org/masatotaniguchi/comments/commentRss/24462.aspx</wfw:commentRss><trackback:ping>http://blogs.sqlpassj.org/masatotaniguchi/services/trackbacks/24462.aspx</trackback:ping><description>&lt;P&gt;せっかく暗号化しても、いったん復号化してディスクに保存してしまうと、削除してもファイル復活ツールで戻せてしまいます。&lt;BR&gt;ツールを使って実験してみると、なるほど別なファイルにクラスタを使われてさえいなければ、簡単に戻せてしまいます。&lt;BR&gt;#そういえばMS-DOSの時代にUNDELETEなんてツールがありましたね&lt;/P&gt;
&lt;P&gt;とある打合せでこの点をズバリ指摘されてしまったのですが、調べてみると色々な方法があるようです。&lt;BR&gt;単に0データで埋めればデータは消せるんじゃないかと思っていましたが、どうやら以前にディスクがどのような状態だったか調べる事も出来るらしく、&lt;BR&gt;安全を期すなら複数回データを上書きする必要があるようです。&lt;/P&gt;
&lt;P&gt;1. ランダムなデータを上書き&lt;BR&gt;2. 0データを上書き&lt;BR&gt;3. ファイルの削除&lt;/P&gt;
&lt;P&gt;これくらいで十分かな？と思い以下の実験用コードを書いて実験しました。&lt;/P&gt;
&lt;P&gt;
&lt;HR id=null&gt;
&lt;BR&gt;void FileErase(CString filename)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; const int BUF_SIZE = 2048;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CFile writeFile(filename,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CFile::modeWrite |&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CFile::typeBinary);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ファイル長の取得&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int file_len = writeFile.GetLength();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // NULL埋め用&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned char buf_null[BUF_SIZE];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; memset(buf_null, 0, BUF_SIZE);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // RANDOM埋め用&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned char buf_rand[BUF_SIZE];&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 乱数初期化&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; srand((unsigned int)time(NULL));&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int writeSize = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (writeSize &amp;lt; file_len)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 乱数作成&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt; BUF_SIZE; i++)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buf_rand[i] = (unsigned char)(rand() * 256 / (1.0 + RAND_MAX));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 乱数書込&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writeFile.Write(buf_rand, BUF_SIZE);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writeFile.Flush();&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // さらにNULLで上書きするために巻き戻す&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writeFile.Seek(-1 * BUF_SIZE, CFile::current);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // NULL書込&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writeFile.Write(buf_null, BUF_SIZE);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writeFile.Flush();&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writeSize += BUF_SIZE;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ファイルを閉じます&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writeFile.Close();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ファイルを削除します&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CFile::Remove(filename);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (...)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;
&lt;HR id=null&gt;
&lt;/P&gt;
&lt;P&gt;実験してみると、復元されたファイルは0埋めされていたので、どうやら成功だったようです。&lt;/P&gt;
&lt;P&gt;一時ファイルを作成するプログラムもありますが、そこまで追いかけていくことは難しそうです。&lt;/P&gt;&lt;img src ="http://blogs.sqlpassj.org/masatotaniguchi/aggbug/24462.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>たにぐち</dc:creator><title>あけましておめでとうございます</title><link>http://blogs.sqlpassj.org/masatotaniguchi/archive/2008/01/10/24460.aspx</link><pubDate>Thu, 10 Jan 2008 02:01:00 GMT</pubDate><guid>http://blogs.sqlpassj.org/masatotaniguchi/archive/2008/01/10/24460.aspx</guid><wfw:comment>http://blogs.sqlpassj.org/masatotaniguchi/comments/24460.aspx</wfw:comment><comments>http://blogs.sqlpassj.org/masatotaniguchi/archive/2008/01/10/24460.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.sqlpassj.org/masatotaniguchi/comments/commentRss/24460.aspx</wfw:commentRss><trackback:ping>http://blogs.sqlpassj.org/masatotaniguchi/services/trackbacks/24460.aspx</trackback:ping><description>&lt;P&gt;あけましておめでとうございます。&lt;/P&gt;
&lt;P&gt;かなり久しぶりの投稿です。去年の６月に７年間半暮らした板橋のアパートを引き払い&lt;/P&gt;
&lt;P&gt;故郷の千葉県北西部に戻ってきました。&lt;/P&gt;
&lt;P&gt;昔過ごした「元実家」に一人で住むことになりましたが。。さすがに古い！です。&lt;/P&gt;
&lt;P&gt;Internationalに何気なくチェックしてしまったがために押し寄せてきた大量の&lt;/P&gt;
&lt;P&gt;MSDNのCDROMをしまう場所が出来たのはうれしいですが。。&lt;/P&gt;
&lt;P&gt;古いけれど、住み慣れた家というのはやっぱりいいもんですね。&lt;/P&gt;&lt;img src ="http://blogs.sqlpassj.org/masatotaniguchi/aggbug/24460.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>たにぐち</dc:creator><title>たにぐち、MSDN premium subscriptionに入会する</title><link>http://blogs.sqlpassj.org/masatotaniguchi/archive/2006/02/06/16019.aspx</link><pubDate>Mon, 06 Feb 2006 00:05:00 GMT</pubDate><guid>http://blogs.sqlpassj.org/masatotaniguchi/archive/2006/02/06/16019.aspx</guid><wfw:comment>http://blogs.sqlpassj.org/masatotaniguchi/comments/16019.aspx</wfw:comment><comments>http://blogs.sqlpassj.org/masatotaniguchi/archive/2006/02/06/16019.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blogs.sqlpassj.org/masatotaniguchi/comments/commentRss/16019.aspx</wfw:commentRss><trackback:ping>http://blogs.sqlpassj.org/masatotaniguchi/services/trackbacks/16019.aspx</trackback:ping><description>&lt;P&gt;前からの夢だったんですけど。。でもやっぱ３０万円は痛かった。。&lt;/P&gt;
&lt;P&gt;仕事は現在PHP、その前は通信系(Linux, C++)でなぜか仕事に結びつきません。&lt;/P&gt;
&lt;P&gt;んー、そのうちいつか、ね。&lt;/P&gt;
&lt;P&gt;現在、押し寄せてくるCDの山に備えて部屋を整理中です。&lt;/P&gt;&lt;img src ="http://blogs.sqlpassj.org/masatotaniguchi/aggbug/16019.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>たにぐち</dc:creator><title>今年もまた寝正月</title><link>http://blogs.sqlpassj.org/masatotaniguchi/archive/2006/01/06/15458.aspx</link><pubDate>Fri, 06 Jan 2006 02:25:00 GMT</pubDate><guid>http://blogs.sqlpassj.org/masatotaniguchi/archive/2006/01/06/15458.aspx</guid><wfw:comment>http://blogs.sqlpassj.org/masatotaniguchi/comments/15458.aspx</wfw:comment><comments>http://blogs.sqlpassj.org/masatotaniguchi/archive/2006/01/06/15458.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.sqlpassj.org/masatotaniguchi/comments/commentRss/15458.aspx</wfw:commentRss><trackback:ping>http://blogs.sqlpassj.org/masatotaniguchi/services/trackbacks/15458.aspx</trackback:ping><description>&lt;P&gt;あけましておめでとうございます。&lt;BR&gt;&lt;BR&gt;年末は勉強しようと思い、実家に行く前に本をかばんに入れました。&lt;BR&gt;さらにはたまたま寄った本屋で欲しかった本を見つけ購入しました。&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;ところが。。&lt;BR&gt;&lt;BR&gt;年末は酒を飲んで眠くなり、年越しそばを食って眠くなる。&lt;BR&gt;正月も酒を飲んで眠くなり、雑煮を食って眠くなる。&lt;BR&gt;&lt;BR&gt;結局食う寝るの生活で終わってしまいました。&lt;BR&gt;&lt;BR&gt;元日に実家の近所を歩いていると、なんだか時間がゆっくり流れているような独特の雰囲気を感じました。&lt;BR&gt;この静けさで毎年、正月が来たんだな、去年はもう終わってしまったんだなとつくづく実感します。&lt;BR&gt;&lt;BR&gt;今になって何もしないで終わってしまった去年を悔やんでも仕方がないのですが、この様子だと今年も！？&lt;BR&gt;(&amp;gt;&amp;lt;)&lt;/P&gt;&lt;img src ="http://blogs.sqlpassj.org/masatotaniguchi/aggbug/15458.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>たにぐち</dc:creator><title>Visual Basic 6.0で擬似抽象クラス</title><link>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/08/13/12756.aspx</link><pubDate>Sat, 13 Aug 2005 04:45:00 GMT</pubDate><guid>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/08/13/12756.aspx</guid><wfw:comment>http://blogs.sqlpassj.org/masatotaniguchi/comments/12756.aspx</wfw:comment><comments>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/08/13/12756.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.sqlpassj.org/masatotaniguchi/comments/commentRss/12756.aspx</wfw:commentRss><trackback:ping>http://blogs.sqlpassj.org/masatotaniguchi/services/trackbacks/12756.aspx</trackback:ping><description>&lt;P&gt;よく知られている通り、Visual Basic 6.0ではクラスの継承ができません。よって、抽象クラスもないしprotectedというアクセス指定子もありません。VB6プログラマにとって唯一インターフェース継承のみが残されていますが、これも機能は貧弱です。それではVB6プログラマはデザインパターンを意識したプログラミングはあきらめなければならないのでしょうか？&lt;BR&gt;今回は、VB6のインターフェース継承の機能が貧弱であることを逆に利用してVB6で擬似的に抽象クラスを実装してしまおうというお話です。&lt;/P&gt;
&lt;P&gt;インターフェースには本来実装が許されません。しかし、VB6では幸いにも?それができてしまいます。&lt;BR&gt;以下のようなクラスを作成してみました。&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' 擬似抽象クラス&lt;BR&gt;' PseudoAbstractClass.cls(クラスモジュール)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Private m_SubClass As PseudoAbstractClass&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' 内部変数(本当はprotectedにしたい)&lt;/FONT&gt;&lt;BR&gt;Private m_Message As String&lt;BR&gt;Private m_Count As Integer&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' 子クラスを保持します&lt;/FONT&gt;&lt;BR&gt;Public Property Set SubClass(value As PseudoAbstractClass)&lt;BR&gt;&amp;nbsp;&amp;nbsp; Set m_SubClass = value&lt;BR&gt;End Property&lt;BR&gt;&lt;BR&gt;Public Sub Release()&lt;BR&gt;&lt;FONT color=#008000&gt;&amp;nbsp;&amp;nbsp; ' 後始末用&lt;BR&gt;&amp;nbsp;&amp;nbsp; ' ここでは実装しない&lt;BR&gt;&lt;/FONT&gt;End Sub&lt;/P&gt;
&lt;P&gt;Public Property Get Message() As String&lt;BR&gt;&amp;nbsp;&amp;nbsp; Message = m_Message&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;Public Property Let Message(value As String)&lt;BR&gt;&amp;nbsp;&amp;nbsp; m_Message = value&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;Public Property Get Count() As Integer&lt;BR&gt;&amp;nbsp;&amp;nbsp; Count = m_Count&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;Public Property Let Count(value As Integer)&lt;BR&gt;&amp;nbsp;&amp;nbsp; m_Count = value&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' 擬似abstract関数。子クラスで実装&lt;/FONT&gt;&lt;BR&gt;Public Function SuperClassAbstractFunction() As String&lt;BR&gt;&amp;nbsp;&amp;nbsp; SuperClassAbstractFunction = _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_SubClass.SuperClassAbstractFunction&lt;BR&gt;End Function&lt;/P&gt;
&lt;P&gt;Public Sub SuperClassAbstractSub()&lt;BR&gt;&amp;nbsp;&amp;nbsp; m_SubClass.SuperClassAbstractSub&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Public Sub SuperClassSub()&lt;BR&gt;&amp;nbsp;&amp;nbsp; Dim I As Integer&lt;BR&gt;&amp;nbsp;&amp;nbsp; For I = 1 To m_Count&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Debug.Print SuperClassAbstractFunction&lt;BR&gt;&amp;nbsp;&amp;nbsp; Next I&lt;BR&gt;&amp;nbsp;&amp;nbsp; Call SuperClassAbstractSub&lt;BR&gt;End Sub&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Visual Basic 6.0ではprotectedアクセス指定子がないので、仕方なくプロパティで代用します。メンバ変数はMessageと、Countです。&lt;BR&gt;もう一つ、m_SubClassという変数があります。プロパティSubClassで取得した子クラスはここに格納されます。擬似抽象メソッドSuperClassAbstractFunction、SuperClassAbstractSubでは、m_SubClassの相当関数を実行します。&lt;STRONG&gt;擬似抽象メソッドは、これを継承したクラスが決定後初めて決まります&lt;/STRONG&gt;。今は入れ物だけです。&lt;/P&gt;
&lt;P&gt;メソッドSuperClassSubですが、ここでは抽象メソッドを使用して何を実行するかが書かれています。ここでは、SuperClassAbstractFunctionの戻り値をm_Count回デバッグウィンドウに表示した後、SuperClassAbstractSubを実行するといった単純なものです。擬似抽象クラスSuperClassAbstractFunctionと、SuperClassAbstractSubが何を行うかまだ決定していないことにご注意ください。&lt;/P&gt;
&lt;P&gt;早速、この擬似抽象クラスを継承した子クラスを作成します。&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' 子クラス&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#008000&gt;' SubClass1.cls(クラスモジュール)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Implements PseudoAbstractClass&lt;/P&gt;
&lt;P&gt;Private m_BaseClass As PseudoAbstractClass&lt;/P&gt;
&lt;P&gt;Private Sub Class_Initialize()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 擬似抽象クラスのインスタンスを作り、そのSubClassプロパティに自分を代入する。&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp; Set m_BaseClass = New PseudoAbstractClass&lt;BR&gt;&amp;nbsp;&amp;nbsp; Set m_BaseClass.SubClass = Me&lt;BR&gt;End Sub&lt;BR&gt;&lt;BR&gt;Private Sub PseudoAbstractClass_Release()&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;'&amp;nbsp;後始末。使用後、必ず実行する。&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Set m_BaseClass.SubClass = Nothing&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Set m_BaseClass = Nothing&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Private Property Set PseudoAbstractClass_SubClass(value As PseudoAbstractClass)&lt;BR&gt;&lt;FONT color=#008000&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;' 実装しない&lt;BR&gt;&lt;/FONT&gt;End Property&lt;BR&gt;&lt;BR&gt;Private Property Let PseudoAbstractClass_Message(value As String)&lt;BR&gt;&amp;nbsp;&amp;nbsp; m_BaseClass.Message = value&lt;BR&gt;End Property&lt;BR&gt;Private Property Get PseudoAbstractClass_Message() As String&lt;BR&gt;&amp;nbsp;&amp;nbsp; PseudoAbstractClass_Message = m_BaseClass.Message&lt;BR&gt;End Property&lt;BR&gt;Private Property Let PseudoAbstractClass_Count(value As Integer)&lt;BR&gt;&amp;nbsp;&amp;nbsp; m_BaseClass.Count = value&lt;BR&gt;End Property&lt;BR&gt;Private Property Get PseudoAbstractClass_Count() As Integer&lt;BR&gt;&amp;nbsp;&amp;nbsp; PseudoAbstractClass_Count = m_BaseClass.Count&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;Private Sub PseudoAbstractClass_SuperClassSub()&lt;BR&gt;&amp;nbsp;&amp;nbsp; m_BaseClass.SuperClassSub&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' ここより上は全て共通&lt;BR&gt;' この下よりこのクラスの固有の実装(override)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Private Function PseudoAbstractClass_SuperClassAbstractFunction() As String&lt;BR&gt;&amp;nbsp;&amp;nbsp; PseudoAbstractClass_SuperClassAbstractFunction = "*****" &amp;amp; m_BaseClass.Message &amp;amp; "*****"&lt;BR&gt;End Function&lt;/P&gt;
&lt;P&gt;Private Sub PseudoAbstractClass_SuperClassAbstractSub()&lt;BR&gt;&amp;nbsp;&amp;nbsp; Debug.Print "******************************" &amp;amp; vbCrLf&lt;BR&gt;&amp;nbsp;&amp;nbsp; Debug.Print "*********" &amp;amp; m_BaseClass.Message &amp;amp; "*********" &amp;amp; vbCrLf&lt;BR&gt;&amp;nbsp;&amp;nbsp; Debug.Print "******************************" &amp;amp; vbCrLf&lt;BR&gt;End Sub&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;冒頭にImplements PseudoAbstractClassとあります。これで、このクラスのオブジェクトをPseudoAbstractClassのSubClassプロパティに入れることができるようになります。このクラスのInitializeメソッド(コンストラクタ)で、擬似抽象クラスのインスタンスを作り、SubClassプロパティに自分(Me)を代入してしまいます。Message, Countプロパティはそのまま親クラスのものを引き継ぎます。PseudoAbstractClass_SuperClassSubは親クラスのものをそのまま引き継ぐため、m_BaseClassの相当関数を実行します。ここより上は全て共通です。PseudoAbstractClass_SuperClassAbstractFunction、PseudoAbstractClass_SuperClassAbstractSubで、このクラスに固有の実装(override)をします。メッセージに「*」の飾りをつけるだけという簡単なものです。&lt;/P&gt;
&lt;P&gt;「ここより上は全て共通」コメントより上の部分をコピーして、SubClass2.clsというクラスを作り貼り付けます。その下に以下のような関数を作成します。&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Private Function PseudoAbstractClass_SuperClassAbstractFunction() As String&lt;BR&gt;&amp;nbsp;&amp;nbsp; PseudoAbstractClass_SuperClassAbstractFunction = "-----" &amp;amp; m_BaseClass.Message &amp;amp; "-----"&lt;BR&gt;End Function&lt;/P&gt;
&lt;P&gt;Private Sub PseudoAbstractClass_SuperClassAbstractSub()&lt;BR&gt;&amp;nbsp;&amp;nbsp; Debug.Print "------------------------------" &amp;amp; vbCrLf&lt;BR&gt;&amp;nbsp;&amp;nbsp; Debug.Print "---------" &amp;amp; m_BaseClass.Message &amp;amp; "---------" &amp;amp; vbCrLf&lt;BR&gt;&amp;nbsp;&amp;nbsp; Debug.Print "------------------------------" &amp;amp; vbCrLf&lt;BR&gt;End Sub&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;「*」が「-」に変わっただけです(^^;。以下は使用例です。&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' Form1.frm(フォームモジュール)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Private Sub Command1_Click()&lt;BR&gt;&amp;nbsp;&amp;nbsp; Dim AbstractBaseClass1 As PseudoAbstractClass&lt;BR&gt;&amp;nbsp;&amp;nbsp; Set AbstractBaseClass1 = New SubClass1&lt;BR&gt;&amp;nbsp;&amp;nbsp; AbstractBaseClass1.Message = "継承クラス１"&lt;BR&gt;&amp;nbsp;&amp;nbsp; AbstractBaseClass1.Count = 2&lt;BR&gt;&amp;nbsp;&amp;nbsp; AbstractBaseClass1.SuperClassSub&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 後始末は必ず実行する&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; AbstractBaseClass1.Release&lt;BR&gt;&amp;nbsp;&amp;nbsp; Dim AbstractBaseClass2 As PseudoAbstractClass&lt;BR&gt;&amp;nbsp;&amp;nbsp; Set AbstractBaseClass2 = New SubClass2&lt;BR&gt;&amp;nbsp;&amp;nbsp; AbstractBaseClass2.Message = "継承クラス２"&lt;BR&gt;&amp;nbsp;&amp;nbsp; AbstractBaseClass2.Count = 3&lt;BR&gt;&amp;nbsp;&amp;nbsp; AbstractBaseClass2.SuperClassSub&lt;BR&gt;&amp;nbsp;&amp;nbsp; AbstractBaseClass2.Release&lt;BR&gt;End Sub&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;出力は以下の通りです。&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;*****継承クラス１*****&lt;BR&gt;*****継承クラス１*****&lt;BR&gt;******************************&lt;/P&gt;
&lt;P&gt;*********継承クラス１*********&lt;/P&gt;
&lt;P&gt;******************************&lt;/P&gt;
&lt;P&gt;-----継承クラス２-----&lt;BR&gt;-----継承クラス２-----&lt;BR&gt;-----継承クラス２-----&lt;BR&gt;------------------------------&lt;/P&gt;
&lt;P&gt;---------継承クラス２---------&lt;/P&gt;
&lt;P&gt;------------------------------&lt;/P&gt;
&lt;P&gt;
&lt;HR id=null&gt;
&lt;BR&gt;一見、子クラスのメンテが大変のように見えますが、擬似抽象メソッドの実装を除きほとんど共通ですので、一個作成、変更すれば後はコピペでいけます。&lt;BR&gt;基本的な考え方は、親クラスで入れ物を用意しておき、子クラスで入れ物に実装することです。新しい実装がほしくなれば、SubClass1をじゃんじゃんコピーして擬似抽象メソッドの中だけ書き換えればよいわけです。 
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;VBのInterfaceは、一回継承したものを親クラスとしてさらに継承することはできません。その代わり、一度に複数のInterfaceを継承することができます。&lt;/P&gt;
&lt;P&gt;この考え方でVB6で色々なデザインパターンを試してみると面白そうです。できないもの、複雑すぎて実用性のないものも出てくるとは思いますが、「継承」について基本に戻って考えさせてくれる良い機会になるかもしれません。&lt;/P&gt;&lt;img src ="http://blogs.sqlpassj.org/masatotaniguchi/aggbug/12756.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>たにぐち</dc:creator><title>ASPのActiveX dllを使った連動プルダウンの実装</title><link>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/07/21/12505.aspx</link><pubDate>Thu, 21 Jul 2005 02:37:00 GMT</pubDate><guid>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/07/21/12505.aspx</guid><wfw:comment>http://blogs.sqlpassj.org/masatotaniguchi/comments/12505.aspx</wfw:comment><comments>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/07/21/12505.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.sqlpassj.org/masatotaniguchi/comments/commentRss/12505.aspx</wfw:commentRss><trackback:ping>http://blogs.sqlpassj.org/masatotaniguchi/services/trackbacks/12505.aspx</trackback:ping><description>&lt;P&gt;&lt;A href="http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/07/09/12119.aspx"&gt;http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/07/09/12119.aspx&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;の続きになります。&lt;BR&gt;前回は、aspファイルからデータアクセスを分離してみましたが、そのデータアクセスオブジェクト(DAO)はaspから呼ばれるとは限りません。別のActiveX dllから呼ばれ、例えばWEBの画面を動的に構成するということも考えられます。その例として取り上げたのが連動（連結）プルダウン（コンボボックス）です。部署を選択すると、その部署に属する社員だけが選択されるといったVisual Basic 6.0やVBAのプログラミングではおなじみのインターフェースです。WEBアプリケーションでは連動プルダウンがいくつもある場合、部署を選択するたびにリクエストを行うと、ユーザーにもサーバーにも負担をかけてしまいます。&lt;BR&gt;そこで、例えばこのようなActiveX dllを作ってみました。&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;ソースファイル：linkedlist.asp&lt;BR&gt;&amp;lt;HTML&amp;gt;&lt;BR&gt;&amp;lt;HEAD&amp;gt;&lt;BR&gt;&amp;lt;TITLE&amp;gt;連動プルダウン&amp;lt;/TITLE&amp;gt;&lt;BR&gt;&amp;lt;%&lt;BR&gt;Set EmpLinkedListBox = Server.CreateObject("ScottView.clsEmpLinkedListBox")&lt;BR&gt;EmpLinkedListBox.InitFunctionName = "onInit"&lt;BR&gt;EmpLinkedListBox.ParentOnChangeFunctionName = "parentOnChange"&lt;BR&gt;EmpLinkedListBox.ParentListName = "parentList"&lt;BR&gt;EmpLinkedListBox.ChildListName = "childList"&lt;BR&gt;%&amp;gt;&lt;BR&gt;&amp;lt;%=empLinkedListBox.GetJavaScript%&amp;gt;&lt;BR&gt;&amp;lt;/HEAD&amp;gt;&lt;BR&gt;&amp;lt;BODY onLoad="onInit(document.linkedList.parentList, document.linkedList.childList)"&amp;gt;&lt;BR&gt;&amp;lt;FORM name="linkedList"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; 部署 &amp;lt;SELECT name="parentList" onChange="parentOnChange(document.linkedList.parentList, document.linkedList.childList)"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/SELECT&amp;gt;&amp;lt;BR&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; 社員 &amp;lt;SELECT name="childList"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/SELECT&amp;gt;&lt;BR&gt;&amp;lt;/FORM&amp;gt;&lt;BR&gt;&amp;lt;/BODY&amp;gt;&lt;BR&gt;&amp;lt;/HTML&amp;gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;上のようなaspが変換後、下のようになれば成功です。&lt;BR&gt;&lt;BR&gt;
&lt;P&gt;
&lt;HR id=null&gt;
&lt;BR&gt;
&lt;P&gt;&amp;lt;HTML&amp;gt;&lt;BR&gt;&amp;lt;HEAD&amp;gt;&lt;BR&gt;&amp;lt;TITLE&amp;gt;連動プルダウン&amp;lt;/TITLE&amp;gt;&lt;BR&gt;&amp;lt;SCRIPT LANGUAGE="JavaScript1.1"&amp;gt;&lt;BR&gt;&amp;lt;!--&lt;BR&gt;function onInit(parentList, childList) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[0] = new Option("CLARK", "7782")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[1] = new Option("KING", "7839")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[2] = new Option("MILLER", "7934")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parentList.options[0] = new Option("ACCOUNTING", "10")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parentList.options[1] = new Option("RESEARCH", "20")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parentList.options[2] = new Option("SALES", "30")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parentList.options[3] = new Option("OPERATIONS", "40")&lt;/P&gt;
&lt;P&gt;}&lt;BR&gt;function parentOnChange(parentList, childList) {&lt;BR&gt;&amp;nbsp;&amp;nbsp; var parentListValue = parentList.value;&lt;BR&gt;&amp;nbsp;&amp;nbsp; childList.length = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp; if (parentListValue == "10") {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[0] = new Option("CLARK", "7782")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[1] = new Option("KING", "7839")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[2] = new Option("MILLER", "7934")&lt;BR&gt;&amp;nbsp;&amp;nbsp; } else if (parentListValue == "20") {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[0] = new Option("SMITH", "7369")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[1] = new Option("JONES", "7566")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[2] = new Option("SCOTT", "7788")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[3] = new Option("ADAMS", "7876")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[4] = new Option("FORD", "7902")&lt;BR&gt;&amp;nbsp;&amp;nbsp; } else if (parentListValue == "30") {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[0] = new Option("ALLEN", "7499")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[1] = new Option("WARD", "7521")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[2] = new Option("MARTIN", "7654")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[3] = new Option("BLAKE", "7698")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[4] = new Option("TURNER", "7844")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; childList.options[5] = new Option("JAMES", "7900")&lt;BR&gt;&amp;nbsp;&amp;nbsp; } else if (parentListValue == "40") {&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;BR&gt;// --&amp;gt;&lt;BR&gt;&amp;lt;/SCRIPT&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;lt;/HEAD&amp;gt;&lt;BR&gt;&amp;lt;BODY onLoad="onInit(document.linkedList.parentList, document.linkedList.childList)"&amp;gt;&lt;BR&gt;&amp;lt;FORM name="linkedList"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; 部署 &amp;lt;SELECT name="parentList" onChange="parentOnChange(document.linkedList.parentList, document.linkedList.childList)"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/SELECT&amp;gt;&amp;lt;BR&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; 社員 &amp;lt;SELECT name="childList"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/SELECT&amp;gt;&lt;BR&gt;&amp;lt;/FORM&amp;gt;&lt;BR&gt;&amp;lt;/BODY&amp;gt;&lt;BR&gt;&amp;lt;/HTML&amp;gt;&lt;/P&gt;
&lt;P&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;この例では、連動プルダウンは一つですが、SELECTタグの名前と、それにあわせて関数を呼ぶ時の引数を変えれば部署-社員の連動プルダウンはいくつも作ることができます（ただし初期化関数は個数分繰り返して呼ぶ必要があります）。変換後のHTMLソースをじっと眺めると、onInit関数は親子の初期化、parentOnChange関数はif分の条件式と、その{}の中に特徴があります。そこで、初期化関数(onInit)のオプション生成をコレクションにしたものと、親プルダウン変更時関数(parentOnChange)のIFブロック（部署ごとにグループ化された社員のオプション生成）をコレクションにしたものを渡せば、上記JavaScriptを生成するクラスを作成してみました。ScottViewという名前のActiveX dllプロジェクトをつくり、プロジェクトメニューの参照設定で、ScottDAOを追加します。そして以下のソースファイルを追加します。JavaScript用標準モジュール以外全てクラスモジュールですがclsEmpLinkedListBox以外はInstancingプロパティをPrivateにします。エラー処理、データのチェックは省略してあります。&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' ソースファイル clsLinkedListBoxBuilder：クラスモジュール&lt;BR&gt;&lt;/FONT&gt;Private m_ParentListName As String&lt;BR&gt;Private m_ChildListName As String&lt;BR&gt;Private m_InitFunctionName As String&lt;BR&gt;Private m_ParentOnChangeFunctionName As String&lt;BR&gt;Private m_InitFunctionOptions As Collection&lt;BR&gt;Private m_ParentOnChangeIfBlocks As Collection&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' 初期化関数名&lt;BR&gt;&lt;/FONT&gt;Public Property Let InitFunctionName(strInitFunctionName As String)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_InitFunctionName = strInitFunctionName&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' 親リスト変更イベント関数名&lt;BR&gt;&lt;/FONT&gt;Public Property Let ParentOnChangeFunctionName( _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strParentOnChangeFunctionName As String)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_ParentOnChangeFunctionName = strParentOnChangeFunctionName&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' 親リスト名&lt;BR&gt;&lt;/FONT&gt;Public Property Let ParentListName(strParentListName As String)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_ParentListName = strParentListName&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;Public Property Get ParentListName() As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ParentListName = m_ParentListName&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' 子リスト名&lt;BR&gt;&lt;/FONT&gt;Public Property Let ChildListName(strChildListName As String)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_ChildListName = strChildListName&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;Public Property Get ChildListName() As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ChildListName = m_ChildListName&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT color=#008000&gt;' 初期化関数本体&lt;/FONT&gt;&lt;BR&gt;Public Property Set InitFunctionOptions(Options As Collection)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set m_InitFunctionOptions = Options&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' ParentOnChange関数用If Block&lt;/FONT&gt;&lt;BR&gt;Public Property Set ParentOnChangeIfBlocks(IfBlocks As Collection)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set m_ParentOnChangeIfBlocks = IfBlocks&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' 初期化関数作成&lt;BR&gt;&lt;/FONT&gt;Private Function CreateInitFunctionBody() As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim strRet As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim strOption As Variant&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strRet = ""&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; For Each strOption In m_InitFunctionOptions&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strRet = strRet &amp;amp; JS_INDENT &amp;amp; strOption &amp;amp; vbCrLf&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateInitFunctionBody = strRet&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;End Function&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' ParentOnChange関数作成&lt;BR&gt;&lt;/FONT&gt;Private Function CreateParentOnChangeFunctionBody() As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim strRet As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim IfBlock As clsParentOnChangeIfBlock&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Const FIRST_IF_TEMPLATE = JS_INDENT &amp;amp; "if (parentListValue == ""?"") {"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Const ELSE_IF_TEMPLATE = JS_INDENT &amp;amp; "} else if (parentListValue == ""?"") {"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Const CLOSE_IF = JS_INDENT &amp;amp; "}"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 選択されている親リストのキーをparentListValue変数に代入するjavaScriptコード&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strRet = JS_INDENT &amp;amp; "var parentListValue = " &amp;amp; m_ParentListName &amp;amp; ".value;" &amp;amp; vbCrLf&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 子リストの内容をクリア(length = 0)&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strRet = strRet &amp;amp; JS_INDENT &amp;amp; m_ChildListName &amp;amp; ".length = 0;" &amp;amp; vbCrLf&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt; ' IFブロックの作成&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim blnFirstBlock As Boolean&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; blnFirstBlock = True&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; For Each IfBlock In m_ParentOnChangeIfBlocks&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If blnFirstBlock Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strRet = strRet &amp;amp; Replace(FIRST_IF_TEMPLATE, "?", IfBlock.Key) &amp;amp; vbCrLf&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strRet = strRet &amp;amp; IfBlock.Body&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strRet = strRet &amp;amp; Replace(ELSE_IF_TEMPLATE, "?", IfBlock.Key) &amp;amp; vbCrLf&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strRet = strRet &amp;amp; IfBlock.Body&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; blnFirstBlock = False&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt; ' IFブロックを閉じる&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strRet = strRet &amp;amp; CLOSE_IF&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateParentOnChangeFunctionBody = strRet&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;End Function&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' JavaScript作成&lt;/FONT&gt;&lt;BR&gt;Public Function GetJavaScript() As String&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim strRet As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt; ' 初期化関数引数&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim strInitVar As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' ParentOnChange関数引数&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim strParentOnChangeVar As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strInitVar = m_ParentListName &amp;amp; ", " &amp;amp; m_ChildListName&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strParentOnChangeVar = m_ParentListName &amp;amp; ", " &amp;amp; m_ChildListName&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' JSタグ&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strRet = JS_START_TAG&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 初期化関数&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strRet = strRet &amp;amp; CretateJSFunction(m_InitFunctionName, _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strInitVar, CreateInitFunctionBody()) &amp;amp; vbCrLf&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' ParentOnChange関数&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strRet = strRet &amp;amp; CretateJSFunction(m_ParentOnChangeFunctionName, _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strParentOnChangeVar, CreateParentOnChangeFunctionBody()) &amp;amp; vbCrLf&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strRet = strRet &amp;amp; JS_END_TAG&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetJavaScript = strRet&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;End Function&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;ただし、親プルダウン変更時関数(parentOnChange)のIFブロックを保存するために以下のクラスを用いました。&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' ソースファイル clsParentOnChangeIfBlock：クラスモジュール&lt;/FONT&gt;&lt;BR&gt;Private m_Key As String&lt;/P&gt;
&lt;P&gt;Private m_Body As String&lt;/P&gt;
&lt;P&gt;Public Property Let Key(strKey As String)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_Key = strKey&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;Public Property Get Key() As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Key = m_Key&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;Public Property Let Body(strBody As String)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_Body = strBody&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;Public Property Get Body() As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Body = m_Body&lt;BR&gt;End Property&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;またJavaScript用の共通関数として、以下の標準モジュールを使用しています。Active X dllではグローバル変数の使用はご法度なので注意が必要です。&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' ソースファイル JavaScript：標準モジュール&lt;BR&gt;' JavaScriptタグ&lt;BR&gt;&lt;/FONT&gt;Public Const JS_START_TAG = "
&lt;SCRIPT language="" JavaScript1.1??&gt;" &amp; vbCrLf &amp; "&lt;!--" &amp; vbCrLf&lt;BR&gt;Public Const JS_END_TAG = "// --&gt;" &amp; vbCrLf &amp; "&lt;/SCRIPT&gt;
 " &amp;amp; vbCrLf&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' インデント&lt;BR&gt;&lt;/FONT&gt;Public Const JS_INDENT = "&amp;nbsp;&amp;nbsp; "&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' JavaScript関数を作成&lt;BR&gt;&lt;/FONT&gt;Public Function CretateJSFunction(strFunctionName As String, _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strVar As String, strFunctionBody As String) As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CretateJSFunction = "function " &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strFunctionName &amp;amp; "(" &amp;amp; strVar &amp;amp; ") {" &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vbCrLf &amp;amp; strFunctionBody &amp;amp; vbCrLf &amp;amp; "}"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;End Function&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' オプションを作成&lt;/FONT&gt;&lt;BR&gt;Public Function CreateJSOption( _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strSelectName As String, intOptionIndex As Integer, _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strText As String, strValue As String)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateJSOption = strSelectName &amp;amp; ".options" &amp;amp; "[" &amp;amp; intOptionIndex &amp;amp; "]"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateJSOption = CreateJSOption &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; " = new Option(""" &amp;amp; strText &amp;amp; """, """ &amp;amp; strValue &amp;amp; """)"&lt;BR&gt;End Function&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;clsLinkedListBoxBuilderを包み込むような感じで、clsEmpLinkedListBoxクラスを作成します。&lt;BR&gt;ScottDAOで作成したclsEmpDaoのほかに、部署用のclsDeptDaoが追加されています。&lt;BR&gt;clsDeptDaoの作り方はclsEmpDaoと全く同じです。&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' ソースファイル clsEmpLinkedListBox：クラスモジュール&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;Private LinkedListBoxBuilder As clsLinkedListBoxBuilder&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#9acd32&gt;&lt;FONT color=#008000&gt;' 初期化関数名&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;Public Property Let InitFunctionName(strInitFunctionName As String)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LinkedListBoxBuilder.InitFunctionName = strInitFunctionName&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' 親リスト変更イベント関数名&lt;/FONT&gt;&lt;BR&gt;Public Property Let ParentOnChangeFunctionName( _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strParentOnChangeFunctionName As String)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LinkedListBoxBuilder.ParentOnChangeFunctionName = _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strParentOnChangeFunctionName&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' 親リスト名&lt;/FONT&gt;&lt;BR&gt;Public Property Let ParentListName(strParentListName As String)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LinkedListBoxBuilder.ParentListName = strParentListName&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' 子リスト名&lt;BR&gt;&lt;/FONT&gt;Public Property Let ChildListName(strChildListName As String)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LinkedListBoxBuilder.ChildListName = strChildListName&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' clsLinkedListBoxBuilderクラス初期化&lt;BR&gt;&lt;/FONT&gt;Private Sub Class_Initialize()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set LinkedListBoxBuilder = New clsLinkedListBoxBuilder&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Public Function GetJavaScript() As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim ScottDaoFactory As clsScottDAOFactory&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim EmpDao As clsEmpDao&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim DeptDao As clsDeptDao&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim Dept As Collection&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim DeptVo As clsDeptVo&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' LinkedListBoxBuilderに渡す&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' InitFunctionOptionsプロパティと&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' ParentOnChangeIfBlocksプロパティ&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim InitFunctionOptions As Collection&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim ParentOnChangeIfBlocks As Collection&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set InitFunctionOptions = New Collection&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set ParentOnChangeIfBlocks = New Collection&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 部署リストボックスの配列のINDEX用&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim intDeptCount As Integer&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&lt;FONT color=#008000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt; &lt;FONT color=#008000&gt;' 初期化関数オプション一時保存用&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim InitFunctionOption As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' DAOFactoryインスタンス作成&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set ScottDaoFactory = New clsScottDAOFactory&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt; ' 部署、社員DAO取得&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set DeptDao = ScottDaoFactory.DeptDao&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set EmpDao = ScottDaoFactory.EmpDao&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 部署を全て選択&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set Dept = DeptDao.SelectDept&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt; ' 全選択された部署ごとのループ&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; intDeptCount = 0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; For Each DeptVo In Dept&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim Emp As Collection&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim EmpVo As clsEmpVo&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 部署（親）リスト変更イベント関数IFブロック作成&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim ParentOnChangeIfBlock As clsParentOnChangeIfBlock&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set ParentOnChangeIfBlock = New clsParentOnChangeIfBlock&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ParentOnChangeIfBlock.Key = DeptVo.DeptNo&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ParentOnChangeIfBlock.Body = ""&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; intDeptCount = intDeptCount + 1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set Emp = EmpDao.SelectEmp(DeptVo.DeptNo)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 社員番号リストボックスの配列のINDEX用&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim intEmpCount As Integer&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; intEmpCount = 0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 部署に属する社員のループ&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For Each EmpVo In Emp&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; intEmpCount = intEmpCount + 1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If intDeptCount = 1 Then&lt;BR&gt;&lt;FONT color=#008000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' 初期化関数は、社員（子）リストボックスに&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' 最初のINDEXの部署の社員をリストする&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InitFunctionOption = JS_INDENT &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateJSOption(LinkedListBoxBuilder.ChildListName, _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; intEmpCount - 1, EmpVo.Ename, EmpVo.EmpNo)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Call InitFunctionOptions.Add(InitFunctionOption)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' ParentOnChangeのIfブロック内のオプション(INDENT二つ)&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ParentOnChangeIfBlock.Body = ParentOnChangeIfBlock.Body &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; JS_INDENT &amp;amp; JS_INDENT &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateJSOption(LinkedListBoxBuilder.ChildListName, _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; intEmpCount - 1, EmpVo.Ename, EmpVo.EmpNo) &amp;amp; vbCrLf&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 初期化関数の本体を作成&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InitFunctionOption = JS_INDENT &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateJSOption(LinkedListBoxBuilder.ParentListName, intDeptCount - 1, _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeptVo.DName, DeptVo.DeptNo)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Call InitFunctionOptions.Add(InitFunctionOption)&lt;BR&gt;&lt;FONT color=#008000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' その部署の社員分のオプションをBodyにつめ終えたので、&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' ParentOnChangeIfBlocksコレクションに追加&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Call ParentOnChangeIfBlocks.Add(ParentOnChangeIfBlock)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ScottDaoFactory.CloseConnection&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set LinkedListBoxBuilder.InitFunctionOptions = InitFunctionOptions&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set LinkedListBoxBuilder.ParentOnChangeIfBlocks = ParentOnChangeIfBlocks&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetJavaScript = LinkedListBoxBuilder.GetJavaScript&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;End Function&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;もし、他の連動プルダウンがほしくなった時は、同じようにclsLinkedListBoxBuilderを使い新たにクラスを作成します。&lt;/P&gt;&lt;img src ="http://blogs.sqlpassj.org/masatotaniguchi/aggbug/12505.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>たにぐち</dc:creator><title>ASP(非ASP.NET)で、なるべくコードの変更を少なくして複数のデータベースに確実に対応できるようにする</title><link>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/07/09/12119.aspx</link><pubDate>Sat, 09 Jul 2005 02:43:00 GMT</pubDate><guid>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/07/09/12119.aspx</guid><wfw:comment>http://blogs.sqlpassj.org/masatotaniguchi/comments/12119.aspx</wfw:comment><comments>http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/07/09/12119.aspx#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://blogs.sqlpassj.org/masatotaniguchi/comments/commentRss/12119.aspx</wfw:commentRss><trackback:ping>http://blogs.sqlpassj.org/masatotaniguchi/services/trackbacks/12119.aspx</trackback:ping><description>&lt;P&gt;&lt;A href="http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/06/10/9475.aspx"&gt;http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/06/10/9475.aspx&lt;/A&gt;&lt;BR&gt;のASP版(非ASP.NET)です。ActiveX dllを使用し、ASPファイルからデータアクセス部分を分離、少ない変更で複数のデータベースに対応できるようにします。&lt;/P&gt;
&lt;P&gt;Visual Basic 6.0で、ActiveX dllを作成し、ScottDAOという名前をつけます。これは、以前にご紹介したVB6版をActiveX dll化したものです。&lt;BR&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;※以下のソースコードはエラー処理などが省略してあり、完全ではありません。&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;テーブル(OracleのScott.Empテーブルと、それをSQL Server 2000にインポートしたテーブル)のレコードを保存するために、VO(Value Object)を用意します。これはVB6版と全く同じでそのまま移植できます。&lt;BR&gt;&lt;STRONG&gt;Instancingプロパティは5-MultiUseとします&lt;/STRONG&gt;。&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' ソースコード(clsEmpVo)：クラスモジュール&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' Private 変数&lt;BR&gt;' 従業員番号&lt;BR&gt;&lt;/FONT&gt;Private m_lngEmpNo As Long&lt;BR&gt;&lt;FONT color=#008000&gt;' 従業員名&lt;/FONT&gt;&lt;BR&gt;Private m_strEname As String&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' 以下略&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' プロパティ&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Public Property Get EMPNO() As Long&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EMPNO = m_lngEmpNo&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;Public Property Let EMPNO(lngEmpNo As Long)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_lngEmpNo = lngEmpNo&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;Public Property Get Ename() As String&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ename = m_strEname&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;Public Property Let Ename(strEname As String)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_strEname = strEname&lt;BR&gt;End Property&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' 以下略（フィールド分同じものを作ります）&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;インターフェースクラスは外部に公開したいため、&lt;STRONG&gt;Instancingプロパティを5-MultiUse&lt;/STRONG&gt;とします。&lt;BR&gt;これをこのまま公開しても、中は空っぽです。後でちょっと細工をします。&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;
&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#008000&gt;' ソースコード(clsEmpDao) ：クラスモジュール&lt;/FONT&gt; 
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Public Function SelectEmp(lngDeptNo As Long) As Collection&lt;/P&gt;
&lt;P&gt;End Function&lt;/P&gt;
&lt;P&gt;Public Function InsertEmp(EmpVo As clsEmpVo) As Boolean&lt;/P&gt;
&lt;P&gt;End Function&lt;/P&gt;
&lt;P&gt;Public Function UpdateEmp(EmpVo As clsEmpVo) As Boolean&lt;/P&gt;
&lt;P&gt;End Function&lt;BR&gt;&lt;BR&gt;Public Property Set Connection(con As Object)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;End Property&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;clsEmpSQLServerDaoはVB6版とほとんど同じです（選択条件が部署番号になっている部分だけが違います）。このクラスは外部に公開しないため、&lt;STRONG&gt;Instancingプロパティを1-Private&lt;/STRONG&gt;とします。&lt;BR&gt;Oracleについても全く同じなので、ここでは省略します。VB6版をご参照ください。&lt;BR&gt;なお、nvl関数は標準モジュールにある独自の関数で動作はORACLEのNVLと全く同じです。&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' ソースコード(clsEmpSQLServerDao)：クラスモジュール&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Implements clsEmpDao&lt;BR&gt;&lt;BR&gt;Private Connection As Object&lt;/P&gt;
&lt;P&gt;Public Property Set clsEmpDao_Connection(con As Object)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set Connection = con&lt;BR&gt;End Property&lt;BR&gt;&lt;BR&gt;Public Function clsEmpDao_SelectEmp(lngDeptNo As Long) As Collection&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim cmd As New ADODB.Command&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim result As New Collection&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim rs As ADODB.Recordset&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt; ' Commandの設定&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; With cmd&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ActiveConnection =&amp;nbsp;Connection&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .CommandText = "SELECT * FROM EMP WHERE DEPTNO = ?"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .CreateParameter , adInteger, adParamInput&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Parameters(0).Value = lngDeptNo&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End With&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' SQLを実行して結果セットを取得します&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set rs = cmd.Execute&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt; ' Recordsetから、VOへ値を詰めます&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Do Until rs.EOF&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim EmpVo As clsEmpVo&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set EmpVo = New clsEmpVo&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.EmpNo = nvl(rs.Fields("EMPNO"), 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.Ename = nvl(rs.Fields("ENAME"), "")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.Job = nvl(rs.Fields("JOB"), "")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.Mgr = nvl(rs.Fields("MGR"), 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.HireDate = nvl(rs.Fields("HireDate"), 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.Sal = nvl(rs.Fields("SAL"), 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.Comm = nvl(rs.Fields("COMM"), 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EmpVo.DeptNo = nvl(rs.Fields("DEPTNO"), 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Call result.Add(EmpVo)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rs.MoveNext&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Loop&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 後始末&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rs.Close&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set rs = Nothing&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 戻り値(VOのコレクション)の設定&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set clsEmpDao_SelectEmp = result&lt;BR&gt;End Function&lt;/P&gt;
&lt;P&gt;Public Function clsEmpDao_InsertEmp(EmpVo As clsEmpVo) As Boolean&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 省略&lt;BR&gt;&lt;/FONT&gt;End Function&lt;/P&gt;
&lt;P&gt;Public Function clsEmpDao_UpdateEmp(EmpVo As clsEmpVo) As Boolean&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' 省略&lt;BR&gt;&lt;/FONT&gt;End Function&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;さて、公開したいのはEmpDaoですがASPに渡したいのは中身の詰まったクラスです。&lt;BR&gt;そこで以下のようなクラスを作成し外部に公開します（&lt;STRONG&gt;Instancingプロパティを5-MultiUse&lt;/STRONG&gt;）。&lt;BR&gt;データベースを変更する必要が出た時はここを変更します。&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' ソースコード(clsScottDaoFactory)：クラスモジュール&lt;BR&gt;&lt;BR&gt;' このクラスが生成するDAOは、clsScottDaoFactory&lt;BR&gt;' のインスタンスが存命中の場合のみ使用できます。&lt;BR&gt;' clsScottDaoFactoryインスタンスの消滅とともにDB&lt;BR&gt;' &lt;/FONT&gt;&lt;FONT color=#008000&gt;接続も自動的にCloseされるためです。&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Private&amp;nbsp;Connection As clsConnection&lt;BR&gt;&lt;BR&gt;Public Function EmpDAO() As clsEmpDao&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim emp As clsEmpDao&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;' DB変更時、コードの変更が必要な場所&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Set emp = New clsEmpSQLServerDao&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;' Set emp = New clsEmpOracleDao&lt;/FONT&gt;&lt;FONT color=#008000&gt;&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp; Set Emp.Connection = Connection.GetConnection&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp; Set EmpDAO = emp&lt;BR&gt;End Function&lt;/P&gt;
&lt;P&gt;Private Sub Class_Initialize()&lt;BR&gt;&amp;nbsp;&amp;nbsp; Dim ConnectionFactory As New clsConnectionFactory&lt;BR&gt;&amp;nbsp;&amp;nbsp; Set Connection = ConnectionFactory.GetClsConnection&lt;BR&gt;End Sub&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#008000&gt;' このメソッドは使用後、なるべく早く実行するようにします。&lt;/FONT&gt;&lt;BR&gt;Public Sub CloseConnection()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Connection.CloseConnection&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set Connection = Nothing&lt;BR&gt;End Sub&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#008000&gt;' 安全策&lt;BR&gt;&lt;/FONT&gt;Private Sub Class_Terminate()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not Connection Is Nothing Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Connection.CloseConnection&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;End Sub&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;ＤＢの接続のためのクラス、clsConnectionを定義します。これはインターフェースとして扱います（&lt;STRONG&gt;Instancingプロパティを5-MultiUse&lt;/STRONG&gt;）。&lt;BR&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' &lt;/FONT&gt;&lt;FONT color=#008000&gt;ソースコード(clsConnection)：クラスモジュール&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Public Function GetConnection() As Object&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;End Function&lt;/P&gt;
&lt;P&gt;Public Sub CloseConnection()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;End Sub&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;SQLServerのためのclsConnectionの実装クラスを定義します（&lt;STRONG&gt;Instancingプロパティを1-Private&lt;/STRONG&gt;）。Oracle用のclsOracleConnectionは省略します。&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' ソースコード(clsSQLServerConnection)：クラスモジュール&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;Implements clsConnection&lt;/P&gt;
&lt;P&gt;Private adoSQLServerCon As ADODB.Connection&lt;/P&gt;
&lt;P&gt;Public Function clsConnection_GetConnection() As Object&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set clsConnection_GetConnection = adoSQLServerCon&lt;BR&gt;End Function&lt;BR&gt;&lt;BR&gt;Public Sub clsConnection_CloseConnection()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; adoSQLServerCon.Close&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set adoSQLServerCon = Nothing&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Private Sub Class_Initialize()&lt;BR&gt;&amp;nbsp;&amp;nbsp; Set adoSQLServerCon = New ADODB.Connection&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; adoSQLServerCon.ConnectionString = _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "PROVIDER=SQLOLEDB;SERVER=ServerName;DATABASE=Scott;UID=sa;PWD=*******"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; adoSQLServerCon.Open&lt;BR&gt;End Sub&lt;/P&gt;
&lt;HR id=null&gt;
clsConnectionクラスを作成するためのクラスを定義します（&lt;STRONG&gt;Instancingプロパティを5-MultiUse&lt;/STRONG&gt;）。 
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' ソースコード(clsConnectionFactory)：クラスモジュール&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;Public Function GetClsConnection() As clsConnection&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;' DB変更時、コードの変更が必要な場所&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;Set GetClsConnection = New clsSQLServerConnection&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;' Set GetClsConnection = New clsOracleConnection&lt;BR&gt;&lt;/FONT&gt;End Function&lt;/P&gt;
&lt;P&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;以上のActiveX dllを作成しレジストリに登録します。これをテストするためのＡＳＰファイルを用意しました。&lt;BR&gt;For Eachが不安な方は、レコード数をresult.countで取得できるのでFor...Next文で書き換えてもいいと思います。&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;' ソースコード(ScottEmp.asp)：aspファイル&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&amp;lt;HTML&amp;gt;&lt;BR&gt;&amp;lt;BODY&amp;gt;&lt;BR&gt;&amp;lt;%&lt;BR&gt;Set scottDAOFactory = Server.CreateObject("ScottDAO.clsScottDAOFactory")&lt;BR&gt;Set empDAO = scottDAOFactory.EmpDAO&lt;BR&gt;Set result = empDAO.SelectEmp(20)&lt;BR&gt;scottDAOFactory.CloseConnection&lt;BR&gt;%&amp;gt;&lt;BR&gt;&amp;lt;TABLE border="1"&amp;gt;&lt;BR&gt;&amp;lt;TR&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TH&amp;gt;従業員番号&amp;lt;/TH&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TH&amp;gt;名前&amp;lt;/TH&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TH&amp;gt;職種&amp;lt;/TH&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TH&amp;gt;上司&amp;lt;/TH&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TH&amp;gt;入社日&amp;lt;/TH&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TH&amp;gt;給料&amp;lt;/TH&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TH&amp;gt;歩合&amp;lt;/TH&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TH&amp;gt;部署番号&amp;lt;/TH&amp;gt;&lt;BR&gt;&amp;lt;/TR&amp;gt;&lt;BR&gt;&amp;lt;%&lt;BR&gt;For Each empVo In result&lt;BR&gt;%&amp;gt;&lt;BR&gt;&amp;lt;TR&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TD&amp;gt;&amp;lt;%=empVo.EmpNo%&amp;gt;&amp;lt;/TD&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TD&amp;gt;&amp;lt;%=empVo.Ename%&amp;gt;&amp;lt;/TD&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TD&amp;gt;&amp;lt;%=empVo.Job%&amp;gt;&amp;lt;/TD&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TD&amp;gt;&amp;lt;%=EmpVo.Mgr%&amp;gt;&amp;lt;/TD&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TD&amp;gt;&amp;lt;%=EmpVo.Hiredate%&amp;gt;&amp;lt;/TD&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TD&amp;gt;&amp;lt;%=empVo.Sal%&amp;gt;&amp;lt;/TD&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TD&amp;gt;&amp;lt;%=EmpVo.Comm%&amp;gt;&amp;lt;/TD&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TD&amp;gt;&amp;lt;%=empVo.deptNo%&amp;gt;&amp;lt;/TD&amp;gt;&lt;BR&gt;&amp;lt;/TR&amp;gt;&lt;BR&gt;&amp;lt;%&lt;BR&gt;Next&lt;BR&gt;%&amp;gt;&lt;BR&gt;&amp;lt;/TABLE&amp;gt;&lt;BR&gt;&amp;lt;/BODY&amp;gt;&lt;BR&gt;&amp;lt;/HTML&amp;gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;基本方針は、&lt;BR&gt;&lt;BR&gt;aspファイルには画面表示ロジック以外はなるべく書かないようにする&lt;BR&gt;&lt;BR&gt;ということです。ビジネスロジックもActiveX dllでカプセル化し、aspファイルからはそれを呼ぶだけにするようにします。&lt;/P&gt;&lt;img src ="http://blogs.sqlpassj.org/masatotaniguchi/aggbug/12119.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>