2020年12月6日日曜日

スマホでATOK更新したらキーボードが表示されなくなった

 ブログの存在思い出してから半年以上ぶりの投稿ですw

日本語入力はATOK Passportを使っています(Pro版ではない)。PCとスマホ(Android)で使っているのですが、最近、Android版のATOKを更新(バージョンアップ、アップデート)してからLINE投稿しようとしたらキーボードが表示されなくなりました。正確には一瞬なにかウィンドウは表示されるのですがすぐ引っ込む。入力できないやん……。

仕方ないので一時的にATOKを切ってGBoard(Android標準の入力)にしましたが、辞書がアホすぎて入力に時間がかかるかかる……キーボードの見た目と使い勝手もイマイチです。

念のためスマホを再起動してからATOKに戻してみましたが変わらず。

このままだとLINE投稿欄などのテキスト入力部分からは何もできないのでアプリ一覧からATOKを起動。「ATOKを使える状態にするには」というのがありますがそこに表示されている「契約の有効化を行う」「入力方法にATOKを追加する」「入力方法をATOKに切り替える」はもちろん全部済んでます……。

入力方式「ケータイ入力」がいかんのかなーと思い「ジェスチャー入力」に変更してみてもやはり表示されず。

ふと、これって昔の?Windowsアプリにありがちだった
終了時にウィンドウの表示状態を(iniファイルとかレジストリに)保存 → 起動時に前回の表示状態を復元
で変な値が保存されてたりしたときに復元失敗してウィンドウが表示されない(デスクトップの外に出てたりする)というやつに近いのかなと思いつきました。

そこでATOKの起動画面から「ATOKを使える状態にするには」の下の「テーマ変更 着せ替え」を選択。テーマが表示されますがなんか未設定状態というかデフォルト? 前に使っていたのじゃない「Gray」になっています。コレジャナイので「以前のテーマ選択はこちらから」をタップ、前はこれだった(と思う)「藍」の「シンプルテイスト」で「OK」してGoogle検索を開いてみると……キーボードが出ました!

やはりテーマの取得に失敗してキーボードの表示が正しくできない状態だったのかなと思います(失敗したらとりあえずデフォルト設定で表示するようにしてればいいはずだけど)。テーマで「以前のテーマ」を使用している場合(かつ新しいテーマでの設定を一度もしていない場合?)に発生する不具合かも。新しい(「以前のテーマ」じゃない)テーマはなんか見た目しょぼいので使いませんw 慣れたらこれでもいいのかなぁ……。

GBoard(旧「Googleキーボード」)は前述のとおり辞書がダメダメなので使いませんw 「きめつのやいば」→「鬼滅の刃」が一発変換できなくて焦ったw ATOKに慣れすぎて変換できるのあたりまえと思っていた……w

【まとめ】

Android版ATOKを更新したらキーボードが表示されなくなった(一瞬出て消える)

→ ATOKを起動して「テーマ変更 着せ替え」でどれか設定する

2020年5月9日土曜日

ブログの存在を思い出した

以前はSE職だったんで Visual Studio でいろいろ(C++ とか VB.NET とか)開発してたのですが……なんやかんやありまして、今やってません。
が、最近ちょっとVBAで開発とかあるので、またブログ書いてみようかなと。
以前と同様、自分用メモになります。ググってもあんまりこれといった解決策がみつからなかったやつを書いておきます。
アクセス解析見ると、いまだに Thunderbird のタイムアウトエラー回避記事とか見られているのはなんでなんや……まだ Thunderbird 使われているんですかね。

2014年2月13日木曜日

データセットのデータテーブルの列順を変更したい

久々にVB.NET(VS2005)で開発しています。
データセットを作成した後でデータベースの設計を変更し、元のテーブルやビューの列を追加したときにその変更をデータセットに反映する方法はわかったので前に書いたのですが、追加した列が末尾になってしまいます。
別に列(フィールド)の並び順は気にしなくていい場合が多いのですが、今回はデータテーブルの列を Columns(i) で順番に処理したかったのです。この順番ってデータセットデザイナに表示される列の並び順のようなんですが、デザイナで順番を変更できない……。
データセットのファイルは ~.xsd で、デフォルトだとこれを開くアプリケーションがDataSetエディタになっているので、ソリューションエクスプローラでダブルクリックするとデザイナ画面になります。
これだと変更できないので(これで変更できる方法があるなら知りたいんですけど)、ソリューションエクスプローラで右クリックして[ファイルを開くアプリケーションの選択]-[ソースコード(テキスト)エディタ]を選択して[OK]、で同じファイルがデザイナでなくテキストエディタで開きます。
列順を変更したい列名で検索すると何箇所かヒットしますが、列順に関係あるのは
<Mappings>
 <Mapping ~/>
 <Mapping ~/>
   :
</Mappings>
のところ。
ここを修正してファイルを保存してからデザイナで開いてみると、順番が変わっています。

2013年7月10日水曜日

MP Navigator EX が起動しなくなった……IMEに関係あるとは

開発ネタじゃないんですがメモ。

久しぶりにキヤノンのスキャナを使おうとユーティリティツールMP Navigator EX 2.0を起動しようとしたら、

「MP Navigator EXは動作を停止しました。問題が発生したため、プログラムが正しく動作しなくなりました。プログラムは閉じられ、解決策がある場合はWindowsから通知されます。」

と出て起動できませんでした。解決策は通知されなかったw
あ、OSはWindows7、スキャナは CanoScan LiDE 200です。

とりあえずググったら、
C:\Users\\App Data\Roaming\Microsoft\Windows\Network Shortcuts
フォルダのファイルを削除したら起動するようになったというのが見つかったのだけど、そもそもこのフォルダは空だった……。

しょうがないのでキヤノンのサポートにメール。電話だけじゃなくメール窓口もあるのがありがたい。フォームから送信。日曜に送信したら月曜に返信が来ました。
「Microsoft Office IME 2007」を使用している環境で発生している事例があるとのこと。うーん、うちではこれは使ってない……2010はインストールしているけど。デフォルトで使っているのはATOK 2013なんだよなー。
(ちなみにOffice IME 2007の問題はマイクロソフトのアップデートで直ってる模様です。)

ん、そういえば。最後にMP Navigator EX 2.0を使用してからインストールしたプログラムが原因なんだろうなーと最初に見たんだけど、それらしいのが見あたらなくて、それからキヤノンにメールしたんだよな。でもその中にATOK 2013があったんでした。Passport版でアップデートされたんだっけか。バージョンは26.1.6.0です。

Office IME 2007じゃないけどIMEが関係あるならこれかも……と既定の言語をOffice IME 2010に変更したら、無事起動できるようになりました。うーんIMEの影響とは思わなかったな。
しかしATOKは使いたいのでw しょうがないからスキャナ使うときだけIME切り換えるようにしよう……。

ジャストシステムのサポートに問い合わせようと思ったんだけど、電話窓口しかなかった……メールでも受け付けてホスイ……。ダメモトでATOKの公式ツイッターアカウントに投げときました。なんかATOK 2013では他にも不具合出てるみたいなのでそのうち修正アプデ来るでしょう。

(2013.7.20追記)ATOK2013のアップデートで直りました。IME切り換えなくてもMP Navigator EX 2.0起動するようになりました。アプデ後のバージョンは26.1.8.0になってました。

2013年4月3日水曜日

Virtual PC のゲストOSからホストOSのローカルプリンタを使いたい(まとめ)

前の投稿でだらだらと書いてしまったのですが(まぁそれはそれでどういう手順でこうなったのか自分の覚えとしては必要かと思ったのでいいかと)、昨日久しぶりにゲストPCでプリンタ使おうと思ったら使えなくて自分のブログ読み返してみたら読むのめんどくさかったのでwちょっとまとめることにしました。きれいにまとめられてるサイトは他にあるので検索するとたぶんそっちが引っかかるのでいいのではないかと思うのですが(と前の投稿書いたときも思ったのだったw)、自分で読み返すときのためにまとめておきますw

(前提)
Virtual PC 2007でホスト:Windows 7、ゲスト:Windows XPが動作していてホストに接続されたローカルプリンタ(共有)にホストから正しく出力できているものとします。

(ホストOSでの作業)
1.デバイスマネージャーで「ネットワークアダプター」を選択
2.メニュー[操作]-[レガシーハードウェアの追加]を選択
3.ウィザードが表示されたら[次へ]
4.「一覧から選択したハードウェアをインストールする」を選択して[次へ]
5.「ネットワークアダプター」を選択して[次へ]
6.製造元「Microsoft」、ネットワークアダプター「Microsoft Loopback Adapter」を選択して[次へ]
7.インストールを開始するには[次へ]
8.ウィザード完了画面が出たら終了
9.「ネットワーク」→「ネットワークと共有センター」→「アダプターの設定の変更」
10.表示されているアダプターから Microsoft Loopback Adapter を選択
11.右クリック→「プロパティ」→「インターネットプロトコル バージョン4」を選択
12.「次のIPアドレスを使う」を選択してIPアドレス「192.168.1.1」、サブネットマスク「255.255.255.0」→[OK]

(ゲストOSでの作業)
1.上記のホストの作業が終わったらゲストOS再起動
2.「新しいハードウェアが~」とか表示されて Loopback Adapter が認識されたらOK
3.Virtual PC コンソールの設定で「ネットワーク」を選択→「ネットワークアダプタ数」を1個増やす(例えば1→2)→増えたアダプタ(例えば「アダプタ2」)で「Microsoft Loopback Adapter」を選択
4.コンパネ「ネットワーク接続」→「LANまたは高速インターネット」→2個目のプロパティを開く
5.「次のIPアドレスを使う」を選択してIPアドレス「192.168.1.10」、サブネットマスク「255.255.255.0」
6.ゲストOS再起動
7.プリンタの追加→ホストOSのローカルプリンタが見つかったら通常のネットワークプリンタの追加と同様にすればOK(必要ならプリンタドライバを入れる)

以上です~。
今回、前にこのようにして設定した環境でゲストOSからプリンタ使おうとしたら「印刷スプーラサービスが実行されていません」とか出て使えず。原因は、Virtual PC コンソールの設定でネットワークアダプタ「Microsoft Loopback Adapter」を選択していたはずなのになぜか設定が変わっていて他のアダプタになってたことでした……なぜ変わったのかは不明。

2013年3月4日月曜日

Virtual PC のゲストOSからホストOSのローカルプリンタを使いたい

前の投稿で、ゲストからのインターネット接続ができるようになったのに気をよくしてw今度はこれも前やりかけててあきらめてた、ゲストOSからのプリンタ出力ですよ。環境は前と同じ、Virtual PC 2007 でホストOS:Windows 7、ゲストOS:Windows XP SP3 です。

まぁ普通にググるとまず出てくるのが、記事が古いのか、ホストOSのシリアルポートをゲストOSから使えるよというもの。一応書いとくと、Virtual PC コンソールの設定でLPT1ポートにホストOSの物理パラレルポートを割り当てるとゲストOSに繋がってるみたいに使えるよということらしい。けど……今どきシリアルで繋がってるプリンタはほとんど無いわけで……USB接続のが使いたいわけで……。

と、さらに、USB接続のプリンタを使うべくググると、今度は、ホストOSのローカルプリンタを、ゲストPCからはネットワークの共有プリンタとして使うことができる、というのが出てきた。これでできそう?
それではと、ゲストOSにプリンタの追加で、ネットワークプリンタを検索……出てきません。つか、ホストOSのPC名が出てこないよ。あたりまえか。単にホスト・ゲストの関係ではあるが同じLAN上にいることになってないのではないか?

さらにググって基本に戻るw 同じワークグループにいないといけないのじゃないか? というわけでゲストPCのグループ名をホストPCのと同じにしてみた。……駄目でしたorz
ファイヤウォールとか関係あるんじゃないかと思ったけどよくわからんのでパスw なんか他にやり方あるんじゃないかとさらにググる。

おっ? なんか有望そうな Microsoft Loopback Adapter というものを発見。これは何かというと……ホストOSがそもそもLANを構成していない(スタンドアロン)場合でも、ホストOSとゲストOSとでLANを(ハードは1台しかないけど擬似的に?)構成することができるというものみたいです。スタンドアロンでもネットワーク上のやりとりをテストしてみたりとかできて便利……らしい。とりあえず使ってみよう。タダみたいだしw

まずホストOSの作業から。
Windows 7の場合は、デバイスマネージャーで「ネットワークアダプター」を選択→メニューの[操作]-[レガシーハードウェアの追加]→ウィザードが出てくるので[次へ]→「一覧から選択したハードウェアをインストールする」を選択して[次へ]→「ネットワークアダプター」を選択して[次へ]→製造元「Microsoft」、ネットワークアダプター「Microsoft Loopback Adapter」を選択して[次へ]→インストールを開始するには[次へ]→ウィザード完了画面が出たらおしまい。
これでインストールできた……えっ? よくわからんけどスルーでw 仮想ネットワークアダプタが1個増えたということらしいです。
あとネットワークの設定も必要。Windows 7だと「ネットワーク」→「ネットワークと共有センター」→「アダプターの設定の変更」で今繋がってるアダプターの一覧が出てくるので、そこから Microsoft Loopback Adapter の接続を選択→右クリックで「プロパティ」→「インターネットプロトコル バージョン4」を選択→「次のIPアドレスを使う」を選択→IPアドレス「192.168.1.1」、サブネットマスク「255.255.255.0」→[OK]

ホストOSにインストールしてからゲストOSを再起動すると、ゲストOS上で「新しいハードウェアが~」というおなじみのが出てきてこっちでもMicrosoft Loopback Adapterが使えるようになります。
で、Virtual PC コンソールの設定で「ネットワーク」を見ます。前の投稿で、インターネット接続したいなら「共有ネットワーク(NAT)」を選べということだったけど、ここでは今入れたLoopback Adapterを使いたい……ということで、1個追加。「ネットワークアダプタ数」を「2」にすると「アダプタ2」が選択可能になるので、「Microsoft Loopback Adapter」を選択。
それからこっちでもネットワークの設定。Windows XPではコンパネの「ネットワーク接続」で「LANまたは高速インターネット」のところを見ると2つあります……たぶんw ここにはホストOSで見たときみたいにアダプタの名前が出てこないけど、Virtual PC コンソールの設定の「アダプタ1」「アダプタ2」に対応してるということでしょうか。試しに1個目のプロパティで「インターネットプロトコル(TCP/IP)を見ると、前の投稿で設定したやつ(IP自動・DNS自動)になってます。では2個目のを設定。さっきのホストOSで設定したのと同じネットワークなので、IPアドレス「192.168.1.10」、サブネットマスク「255.255.255.0」としておきます。そしてゲストOS再起動。

これであらためてゲストPCでプリンタの追加をやってみると、やったーホストPCのローカルプリンタが参照できたよ! あとは普通のネットワークプリンタの追加と同じ手順です。やれやれ。
あ、普通だとプリンタドライバも取ってきて入れてくれたりしますが(しないことも多いw)、今回自分の環境では入れてくれなかったので、メーカーサイトからDLしてゲストOSにインストールしました。ここでも前の投稿でインターネット接続しておいたのが役に立っているw 直接DL→インストールできるので便利~。

しかしなんか本当にここまでしないといけなかったのだろうか? 実はもっと簡単な方法があったのではないか? まぁできたから良しとしようw

Virtual PC のゲストOSからインターネット接続したい

いつものことですが完全に自分用の覚え書きですw
Virtual PC 2007 をホストOS:Windows 7、ゲストOS:Windows XP SP3 で使ってます。
ホストOSではもちろんインターネット接続できてるんですが、ゲストOSからができない。ゲストOS情でIE起動すると(MSNがホームなんですが)接続できないよとIEのエラー画面に。
ググってみると、Virtual PC コンソールの[設定]でゲストOSの[ネットワーク]の設定を「共有ネットワーク(NAT)」にしないと駄目とかあるんだけど、それはもうすでに設定済み……であきらめて放置してましたw
今回どうしてもネットワーク接続が必要になったのでさらに頑張ってググると(頑張るとこそこかいっw)、たぶん基本的なことだからいままで見つからなかったのねという設定を発見。やったーできたよー。

ゲストOSでコントロールパネル→ネットワーク接続 でLANとかの接続一覧が出てきます。環境によるけどたぶんローカルエリア接続のどれかwでいま繋がってるのでそれを右クリック→プロパティ→インターネットプロトコル(TCP/IP)を選択して[プロパティ]→「全般」タブで「IPアドレスを自動的に取得する」と「DNSサーバーのアドレスを自動的に取得する]を選択。これでOK。

……って、普通、これがデフォルトなんじゃないかとw だから普通は苦もなく繋がるんじゃないかとw  自分の場合は他所のLANで動いてたゲストOSを外付HDDに入れて持ってきたものだったので、そこのLANでは動く設定になってたんでした。IPとDNS固定で設定されてたのよ。そんなとこ関係あると思わなかったわw よく考えれば関係あるのわかるはずなんだがorz

2012年11月22日木曜日

データベースの修正をデータセットに反映させる

VB.NET(VS2010)でデータベース(SQL Server 2008 R2)を扱うアプリケーションを作成しています。.NETのデータベース関連のコーディング作法がやっとわかったようなわからないような……。

.NET(Framework 2.0以降だっけ?)に特有のデータベース処理として、データベースを直接操作せずに、プロジェクト内に用意したデータベースのローカルキャッシュであるデータセットというのを使ってそれに対していろいろ操作して、最後に元のデータベースに更新を反映させるという、そういう処理があります。って説明あってるのかこれw まぁ要するにデータセットというオブジェクトがありますね。あるの知ってる人は続きを読んでくださいw

で、データセットに、だいたいはテーブルを元のデータベースからコピペして追加します(って自分はそうしてるんだけど、他に一般的なやり方あったらすいませんw)。
しかしそれを使って開発進めてる途中で、データベースのテーブルに足りないフィールドに気がついて追加したり、フィールドの名前を変更したりとか結構あるわけです(ない?w)。そんなとき、例えば元のテーブルにフィールドを追加した後、データセットのそのテーブルにはフィールドの追加が反映されるわけではないんですね。最初わかんなかったので勝手に追加されるもんだと思ってたんですがw
でも当然データベースの実情とデータセットの状態が違ってると動かないわけで、データセットのテーブルに新規の列(フィールド)を追加して、名前その他のプロパティをちまちま変更して元のテーブルのフィールドと合わせる……ということをやってたんですが、フィールド数多いときとか大変だし、ちょっと間違えるとテーブルアダプタとかいろいろエラーになっちゃうときもあるので、いったん作成したデータセットを削除して、テーブル全体を再度コピーしてテーブルごとデータセット作り直したりしてw クエリ大量に作成したりしてるとこれもめんどくさいし……。

そんなこんなでいろいろめんどいなーと思ってたんですが、最近ふと、そんなことしなくてもデータベースの修正を反映させられる方法が見つかりましたのでメモがてら書いておきます。いやホントはヘルプとかMSDNのどこかに書いてあるんだろうとは思うんだけど見つけられなかったのでw

とりあえずフィールドを追加・削除した場合の話です。なんかフィールド長だけ変更したとか、そういうのはこれでは反映されないっぽいのでプロパティで変更してください(それもやり方あるんだったら知りたいですけどw)。

データベースのテーブルにフィールド "Hogehoge" を追加しました。データセットデザイナの方でテーブルを見ても当然まだこのフィールドは列の一覧に表示されていません。ここでテーブルアダプタのクエリを見ます。"Fill,GetData()" というのはデフォルトで作成されていて必ずあるのでこれを右クリックして[構成]を選択。このクエリのSQLステートメントが表示されますが、これってこのテーブルの全件の全フィールドを選択するというものですね。ここで[クエリビルダー]をクリック。Accessでクエリ作成するときに見慣れたあの画面が出てきます。ここで上のテーブルのハコに表示されてるはずの列一覧を見ます。するとなんとここには "Hogehoge" が表示されてる! ここの情報はデータベース直接見に行ってるんですね。しかし "Hogehoge" にはチェックがついてなくて、要はFillの選択対象になってないわけです。ここでチェックをつけます。
(逆に削除したフィールドの場合は、ここで真ん中の列名と処理のリストのところを見ると、削除したフィールドは列名に表示されているけどテーブル名が不明になってるはずです。確認したらこのフィールドの行を選択して削除します。)
[OK]をクリックするとさっきのSQLステートメントの表示画面に戻ります。ここでよく見るとSELECTのフィールド名が追加(削除)されてるはずなので、確認したら[完了]をクリック。
ここで再度テーブルの列を見ると、たぶん末尾だと思いますが "Hogehoge" がちゃんと追加されてますよ! めでたしめでたし。なんか書くと長くなっちゃいましたが、操作は簡単なのでお試しください。そんなの知ってたという方は、よろしければMSDNのどこに書いてあったかコメントにURL貼っていただけるとうれしいですw よろしくお願いします。

2012年10月22日月曜日

マイクロソフトのUI標準ガイドみたいなのどこだっけ

業務アプリのフォーム設計を修正するにあたって、どうも使い勝手が悪い気がしたので、マイクロソフトが推奨するUI標準の資料みたいなのがどこかにあったのを思い出して探したんですが、なんかいろんなキーワードでググったんだけど見つけるのに苦労しましたw 「マイクロソフト UI 標準」「マイクロソフト ユーザーインタフェース ガイドライン」「Windows UI 推奨」とかね……いろいろ試したんだけどw

結局、自分が前に見たことあって今回探してたのは、これでした↓

Windows ユーザー エクスペリエンス ガイドライン

UIじゃなくてUX(ユーザーエクスペリエンス)がキーワードだったのね。思いつかなかった。Windows 7 と Vista 準拠となってます。Windows 8版はどこかにあるのだろうか。
MSDN内の記事なんで、ここからツリーを下っていくと細目が見られますが、上のリンクのページからPDFファイルがダウンロードできます。せっかくだからもうちょっとわかりやすいところに置いといてくれないかなぁ……。
また探しまわらなくていいように覚え書きw しかしMSDNってちょくちょく全面改定されてページのリンクが消失するんですよねー。一応タイトルが変わってなければまたMSDN内の検索で見つかるかと思いますが。

マルチスレッドにした覚えはないのに「有効ではないスレッド間の操作」でエラー

また思い出したのでメモ。

VB.NET(VS2010)で、シリアル通信接続のカードリーダーからカードの情報を読み込んでなんやかんや、というアプリケーションを作成していました。
カードリーダーとかよくわからんので、とりあえず、読み込んだデータをフォームに表示してみることに。カードリーダーの読み書きについては出来合いのライブラリがあるので、リード成功イベントのところで、読み込んだ値(String)をフォームのテキストボックスのTextプロパティにセットして表示するようにしました。ところが、Textプロパティに値をセットするところで、

有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール 'txtCardData′ がアクセスされました。

と出てしまってうまくいきません。txtCardDataというのがテキストボックスで、このTextプロパティに値を代入しようとしたところでエラーになります。
例によってググるとwこのエラーは、別のスレッドからUIコントロール(この場合、フォームに貼ってるテキストボックス)にアクセスしようとしたときに出るらしいです。でも別にマルチスレッドなコードは書いてないのですが……。

さらにググってわかったのは、シリアル通信の受信イベントは別スレッドで立ち上がるとかそういう制限(?)があるようです。自分ではマルチスレッドなコードを書いてなくても、勝手にマルチスレッドになってるらしい。となると、このコードのままじゃどうしたって駄目なのか……。

結局、リード成功のイベントからというのが駄目なんだから他からならいいだろうということで、ここのイベントからはクラスのメンバ変数に値を渡すだけにして(UIコントロールの操作をしなけりゃいいので変数セットとかはできる)、タイマ回してその変数を拾ってテキストボックスに表示させるようにしました。なんか回りくどいように思ったけど、シリアル通信関係のアプリケーションではタイマ監視して処理させるというのはなんかお決まりの処理らしいので、これでいいのか。

参照のプロパティが表示されない

ちょっと思い出したのでメモ。

VB.NET(VS2010)で、.NET Framework 4 対象のアプリケーションを作成していたとき、参照のプロパティで「相互運用型の埋め込み」をTrueに変更したいということがありました。今となってはなんで変更したかったのか思い出せないというかw結局そこ関係無かったみたいなんですけどw
で、プロジェクトのプロパティで「参照」を確認してから、プロパティを変更したいdllをソリューションエクスプローラーの「参照設定」ツリーの下から選択したんだけど……プロパティウィンドウが真っ白で何も表示されない。変更できないじゃん。

結論から言いますと、プロジェクトのプロパティを表示してるときには、ソリューションエクスプローラーで参照設定の要素を選択してもプロパティは表示されないのね。フォームのデザイナとかコードエディタを表示してから参照設定を選択し直すと、プロパティが表示されるようになります。しょうもないところでハマった……しかもこれでプロパティ変更してみたけど、やりたかったこととは関係なかったようで何にもなりませんでしたw

さらに付け加えておくと、このプロパティ「相互運用の埋め込み」は .NET Framework 4 対象の場合しか表示されないようで、こないだ .NET Framework 2.0 対象に変更したので、プロパティウィンドウにその項目が表示されなくなり、結局何がしたかったのかさっぱりw

2012年10月19日金曜日

バージョン情報ダイアログに複数行の説明を表示する


VB.NET(VS2010)で作成したアプリケーションで、バージョン情報ダイアログを表示することになりました。
とりあえずデザインはどうでもいいのでw用意されているテンプレートを使います。

追加→Windowsフォーム→共通項目→Windows Forms→情報ボックス を選択
デフォルト名の AboutBox1.vb で[追加]

フォームをデザイナで開くとこんなのができてます。


マルチラインのテキストボックスのところに、

説明:
(ランタイムに、ラベルのテキストはアプリケーションのアセンブリ情報に置き換えられます。
プロジェクト デザイナーの[アプリケーション]ペインで、アプリケーションのアセンブリ情報をカスタマイズします。)

とあり、一応このフォームの説明のようです(しかし後述しますが、ここのテキストボックスに表示される項目の名前も「説明」なのでそのことを指して「説明:」と書いているのかも……よくわからないw)。
ここにある通り、特にコードを書かなくても、アセンブリ情報で設定した値を参照して表示するようになってます。
このフォームのコードをみると、フォームのLoadイベントで、アプリケーションのアセンブリ情報 My.Application.Info の各項目から、このフォームのタイトルや各ラベル・テキストボックスに値がセットされているのがわかります。

で、アセンブリ情報を見てみると、


デフォルトではこうなってます。
適当に空欄を埋めてから実行して AboutBox1 フォームを表示すると、こうなります。


アセンブリ情報にあってここには表示されていない項目もありますがそれはおいといて。
説明欄はマルチラインのテキストボックスです。せっかくなので複数行表示したいのですが、アセンブリ情報の「説明」には1行しか入力できません……。
で、またググったんですがw それらしいものがヒットせず。しかたないので自分で考えることにw

バージョン情報ダイアログに表示できさえすればいいのであれば、AboutBox1 のコードを修正し、当該テキストボックス(TextBoxDescription)のTextプロパティに固定値でもセットしてしまえばOKです。しかしなんか釈然としない……。

AboutBox1_Load のソースを見ると、テキストボックスに渡されている値は、My.Application.Info.Description であることがわかります。ということで、なんとなく "Description" で現在のプロジェクトを検索。それらしいのがヒットしました。

' アセンブリに関する一般情報は以下の属性セットをとおして制御されます。
' アセンブリに関連付けられている情報を変更するには、
' これらの属性値を変更してください。
' アセンブリ属性の値を確認します。
<Assembly: AssemblyTitle("WindowsApplication1")>
<Assembly: AssemblyDescription("説明ですよ")>
<Assembly: AssemblyCompany("会社ですよ")>
<Assembly: AssemblyProduct("WindowsApplication1")>
<Assembly: AssemblyCopyright("Copyright c  2012")>
<Assembly: AssemblyTrademark("商標ですよ")>

さっきアセンブリ情報に入力した値がここ AssemblyInfo.vb に出ています。
この AssemblyDescription の "説明ですよ" のところに複数行の内容を書けば、My.Application.Info.Description にも反映されるのでしょうか? 早速やってみます。

<Assembly: AssemblyDescription("説明ですよ" & vbCrLf & _
                                "ほげほげ" & vbCrLf & _
                                "なんやかんや" & vbCrLf & _
                                "あれやこれや")>

複数行といっても文字列としては1つなわけですが、文字列の途中に改行コード(改行定数?) vbCrLf を入れるとそこで表示のときに改行されます。
見やすいように複数行にしていますが(行末に _)、別に1行で書いてもOKです。
実行して表示してみると、こうなりました。


できたよやったー。
念のため、アセンブリ情報も見てみます。


なんかさっき AssemblyInfo.vb で書いたのが、改行コードと継続行記号(_)も含めてそのまま表示されてます。これって、最初からここに改行コード入りの1行で記入すればよかったってことなんじゃ……orz まいっかw

対象のフレームワークを変更したら環境設定が読めなくなった

VB.NET(VS2010)で作成していたプロジェクトですが、そろそろ完成という段になり、対象のフレームワークを2.0にしてくれと言われました。4で作ってたのに……。
まぁ別に .NET Framework 4 特有のクラスとか使ってないはずなのでいいか、と、2.0に変更してコンパイルは通ったのですが、実行してみたら環境設定(My.Settings)を参照するところでエラーになってます。だめじゃん。

対象のフレームワークの変更手順は次のとおり。
1.プロジェクトのプロパティの「コンパイル」タブの[詳細コンパイルオプション]ボタンをクリック
2.「対象のフレームワーク」を「.NET Framework 4 Client Profile」から「.NET Framework 2.0」に変更
3.[OK]すると、
---------------------------
ターゲット フレームワークの変更
---------------------------
ターゲット フレームワークを変更するには、現在のプロジェクトを閉じてからもう一度開く必要があります。
プロジェクト内の保存していない変更は自動的に保存されます。
ターゲット フレームワークを変更すると、ビルドのためにプロジェクト ファイルを手動で変更する必要が生じることがあります。
このプロジェクトのターゲット フレームワークを変更しますか?
---------------------------
はい(Y)   いいえ(N)   ヘルプ
---------------------------
と言われるけど他にどうしようもないので[はい]をクリック
4.ビルド

ビルドではエラーが出ないんですけどね……。
とりあえずいつものようにググるw
まずは参照設定も確認が必要とのことなので、プロジェクトのプロパティの「参照」タブを確認。
いくつかの参照で、
<システムでは、指定された参照が見つかりません。>
と表示されています。これを削除。これは Framework 4 にはあったけど 2.0 には対応するものがないもののようです。これがないとビルドも通らないようだと、2.0 にはできないことになるのかな? 他のクラスに置き換えるとか必要になるんでしょう。今回はOKだったので、削除だけしときます。

ここで一応再ビルドして実行してみるけど、やっぱり環境設定読むとこでエラー。

さらにググると、configの記法が2.0と4では違うのだみたいなことも書いてありましたが、最終的には関係なかったみたいなので割愛w
しかし環境設定のファイル(config)が読めないのはたしかなので、そのへんがあやしいとは思います。で、app.config を調べます。
なんか頭の方に、Framework 4 であることを示すらしいところがあるので、これかな?


    <configSections>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
            <section name="Hogehoge.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false"/>
        </sectionGroup>
    </configSections>

試しに、新規のVBプロジェクトを作成し、ひとつ環境設定を定義して、内容をフォームに表示するだけのものを、最初から対象のフレームワークを2.0にしてビルドしてみます。そして app.config を見てみると、

    <configSections>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="WindowsApplication1.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
        </sectionGroup>
    </configSections>

2.0であるっぽい記述になってます。ので、エラーになってたプロジェクトの 4.0.0.0 を 2.0.0.0 に変更してビルドして実行したら、エラーが出なくなりました。わーい。
しかしこの程度の変更ですむのなら、最初から自動的に変更してくれてもいいんジャマイカ。
ちなみに、同じく app.config の末尾の方には、

<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/></startup>

というのがあったのですが(使用するランタイムのバージョンを定義しているっぽい)、ここは勝手に

<startup><supportedRuntime version="v2.0.50727"/></startup>

こうなっていたのですよ。なんでついでにさっきのところも変えといてくれないのかw


2012年10月9日火曜日

テーブルアダプタの検索クエリにパラメータを渡すときの注意

VB.NET(VS2010)でテーブルの検索処理をするので、テーブルアダプタに検索クエリを作成、フォームで入力された値をキーにして検索するというごく普通の処理を作成。文字列の部分一致で検索させたかったので、入力値の前後にワイルドカードの % をつけてLIKE検索としました。すると完全一致のとき検索に失敗……あるはずのデータにヒットしない。よく調べてみると、検索対象のフィールド長より2文字少ない長さまでは部分一致検索できてるのが、それより長くなると失敗している。

検索対象の文字列フィールド Hogehoge の長さ:16
検索キーの入力欄(テキストボックス)のMax長さ:16

のとき、入力欄に1~14文字入力しているときはうまくヒットするんだけど、15~16文字だと失敗。
前後につけた % の2文字分というのがなんとなくあやしいとはあたりがつきましたが、さてそれってどこを直せば……。

と、先週末ハマっていたのですが、休み明けの今日、データセットのソース(~designer.vb)をゆっくり見てみると、クエリの定義のところに引数(@~)の長さ定義とかもあるのに気がつきました。ソースを直接直すのは危険なので、デザイナのどこかに設定箇所があるはず……と探して、ありました。テーブルアダプタのクエリを選択して、プロパティの Parameters のコレクションを展開すると、@引数の一覧が表示されます。当該パラメータの Size で2桁分増やしてやればOK。
例でいうと @hogehoge とかの Size が 16 になってるのを 18 にしてやる。

これってフィールド長いっぱいの検索キーを使用するときには常に起こりうる現象なんですが、そもそも入力したキーの前後に % つけてLIKE検索するというのがおかしいというか一般的でないのかな? 入力欄にワイルドカードとか含めた正規表現の記法で書いてもらえば(入力欄の文字数Maxがフィールド長と同じならば)問題ないんでしょうが、入力する人に正規表現覚えてもらわなきゃならないというのもなんかなーと思い……まぁ % (あるいは *) のワイルドカードぐらい覚えてもらってもいいかもですが。

2012年9月14日金曜日

プロフィールの画像変えました

ずっとデフォルト画像でほっといたんですが、いくらなんでもあんまりかと思ってようやく変えましたw
自分で描けばいいんだけど、めんどくさかったのでw化け猫アイコンメーカーさんのお世話になりました。パーツを組み合わせていくと猫の顔アイコンが完成……って有名どころなので説明とかいまさらですがw

化け猫アイコンメーカー

ブログのアバターなどに使用するのはOKということなので、これは大丈夫ですよね。その他いろいろに利用可能ですが、商用や再配布は不可なので、サイトの説明を参照の上、正しく利用させていただきましょう。

なお「月の輪猫」なので月の輪熊的に首のとこに三日月模様がある想定なんですが、アイコンは首から上なので見えてませんw

2012年8月29日水曜日

プロジェクトに追加したリソースが参照できない


慣れない Visual Studio 2010 でVBの開発をしています。既存プロジェクトの修正が多くて、開発環境がバラバラw

ボタンに画像を貼るので、画像をリソースに追加。ボタンコントロールのプロパティで Image の参照ボタン[...]をクリックすると「リソースの選択」ダイアログが表示されるので、プロジェクトリソースファイルを選択。一覧から画像を選択……と思ったら、さっき追加したはずの画像が表示されてないので選択できない。うーむ。

ソリューションエクスプローラーでResourceフォルダを確認すると、貼り付けたかった画像ファイルはちゃんと表示されているし、ダブルクリックすると内蔵の画像エディタ(?)で開きます。

ここで例によってググるw なんかヘルプ検索するよりググったほうが解決策が見つかりやすい……。

どうやらそもそもの「画像をリソースに追加した」つもりでいたところからして間違っていたようですw
追加したつもりの手順はこう。

ソリューションエクスプローラに表示されている、プロジェクトのResourceフォルダに画像ファイルをコピー
(Windowsのエクスプローラから当該フォルダに画像ファイルをコピー)
ソリューションエクスプローラのResourceフォルダにファイル名が表示されたけど無地のアイコン表示
右クリックして[プロジェクトに含める]を選択
アイコンが画像ファイルのものに変わる

これだけじゃ「リソースの選択」ダイアログから選択できないのでした。
(これはこれでプロジェクトに関連するファイルの管理としては必要だと思うけど)
以下、追加手順。

プロジェクトのプロパティで[リソース]タブを選択
(画像の追加ができそうにない画面が表示されるけど、これは文字列リソースの画面)
左上の[文字列]と表示されているドロップダウンリストから[イメージ]を選択
イメージ(画像)の一覧が表示される
[リソースの追加]のドロップダウンリストを開いて[既存のファイルの追加]を選択
([リソースの追加]はボタンとしてクリックできるけど、ここでクリックすると新規リソースの追加になってしまうので、今回はしない)
ファイル選択ダイアログが表示されるので、追加したいファイルを選択
(ここでさっきコピーしておいたResourceフォルダのファイルを選択するとよい)

これで「リソースの選択「ダイアログで、プロジェクトリソースファイルの一覧にファイルが表示されるようになります。

ただしファイル名に注意。リソースに追加されると、通常、リソースの名前(Name プロパティ)はファイル名になりますが、リソース名に使用できない名前があり、追加時にエラーが出たり、名前が自動的に変更されたりします。

「~」が含まれているとNG。他にもあるかも。
ファイル名 hogehoge~hoge.png の画像を追加してみると、

---------------------------
Microsoft Visual Studio
---------------------------
リソース 'hogehoge~hoge' の名前には 1 つまたは複数の無効な文字 '~' が含まれているので、有効な識別子として使用できません。これらの文字を削除するか別の文字に置き換えてからもう一度やり直してください。
---------------------------
OK   ヘルプ
---------------------------

とエラーダイアログが表示されるので、ファイル名を変更してからやり直し。

エラーは出ないけどファイル名が自動的に変更されるのは次の場合(これも、他にもあるかも)。

「-」(ハイフン)、「.」(ピリオド)、空白→「_」(アンダースコア)に置き換えられる
(ピリオドは拡張子の区切り以外に使用されている場合。例:hoge.hoge.png → hoge_hoge.png)
数字で始まるファイル名→先頭に「_」(アンダースコア)が追加される
既に同名のリソースがある場合→末尾に1(以下連番)が追加される

2012年8月24日金曜日

データセットデザイナからクエリを編集できない

Visual Studio 2010 の VB.NET でデータベースを使ったプロジェクトを修正中。他の開発環境(他のPC)で他の人が修正したプロジェクトのソースを自分の開発環境に持ってきました。ビルドは通るし実行もできるんだけど、テーブルアダプタのクエリの中身を見ようと、データセットデザイナのテーブルアダプタ右クリックから[構成]を選択すると、下のようなエラーダイアログが出て、クエリ編集画面が開きません。


---------------------------
エラー
---------------------------
TableAdapter V_HOGEHOGE の構成 に失敗しました。
オブジェクト 'MySettings' の接続 'HogehogeConnectionString1' が見つかりませんでした。接続文字列がアプリケーション設定に見つからなかったか、または接続文字列に関連付けられているデータ プロバイダーが読み込めませんでした。
---------------------------
OK
---------------------------

プロジェクトのプロパティから設定を見ても、HogehogeConnectionString というのはあるけど ~1 というのは無し。修正作業した人に聞いてみると、件のテーブルアダプタは修正版なんだけど、ソース(データベースのビュー V_HOGEHOGE)を大幅修正したのでいったん削除して同名のものを作りなおしたらしい。そのときには既存の接続名(HogehogeConnectionString)を選択しているはずなんだけど、なぜか ~1 という名前になってしまったようです。(でもあとで聞いたら本人の開発環境でも前述のエラーが出てたそうなのでなんかおかしいんですけどw)
他のデータアダプタは差し替えていないので、エラーが出ずにクエリの構成画面は表示されます。

いつものようにいろいろググったんだけどよくわからないw
~1 の設定がないのを怒られているので、その設定を追加してやるのも手ですが、なんかやだし……。
試しに HogehogeConnectionString と同じ内容で名前を HogehogeConnectionString1 とした接続設定を一度作成してみましたが、これだとデータセットデザイナの構成は実行できます。これを追加しなくてもプログラム自体のビルド・実行はできるので、データセットデザイナだけの問題のようです。
ん、ということは、データセット関連のファイルだけ修正すればいいのか。

(追記:以下ダラダラ書いてますがもっと簡単な方法があるのに気付きましたw 手っ取り早く知りたい人は途中すっ飛ばしてこの投稿の一番下を読んでねw)

現在のプロジェクトを対象に HogehogeConnectionString1 を検索してみると、データセットの xsd ファイルのコードにヒットします。データセット名が ds だとすると ds.xsd ファイル。これを普通にソリューションエクスプローラーからダブルクリックで開くとデータセットデザイナ画面が開きますが、実体はテキストファイルなわけですね。
ソリューションエクスプローラから ds.xsd を右クリック→[ファイルを開くアプリケーションの選択]から「XML(テキスト)エディター」などを選択すると、検索結果からでなくても直接開くことができます。

このコードの最初の方の <Connections> のところに、

<Connection AppSettingsObjectName="MySettings" AppSettingsPropertyName="HogehogeConnectionString1" ~(以下略)


みたいなのがあるのでこの行を削除。
同じところに元の名前の HogehogeConnectionString の行もあると思いますがもちろんこれは削除しないw

あとは検索でヒットした HogehogeConnectionString1 の部分を HogehogeConnectionString に変えて保存すればOK。データセットデザイナでクエリの編集ができるようになりました。

(補足)
調べ始めたときにはビルドで HogehogeConnectionString1 がどうとか指摘されるエラーが出たこともあったのですが、なんか再現しなくなったので詳細が書けませんw
そのエラーの箇所だけ HogehogeConnectionString に直すとビルドは通るようになったのですが、データセットデザイナの方は直らなかったので、データセットとは別のところで出てたのか? データセットのファイルだけどビルドにひっかかったのが1行だけだったので修正し足りなかったのか? 不明です。また再現したら追記しときます。

(さらに補足、というかここが本文でもいいw)
投稿直後にいろいろやってたらもっと簡単な方法を見つけたので追記しますw
データセットデザイナから V_HOGEHOGE のテーブルアダプタ V_HOGEHOGETableAdapter のクエリを右クリックして[構成]を選択してもエラーが出てクエリ編集画面が開かなかったわけですが、このとき、クエリでなくテーブルアダプタ名 V_HOGEHOGETableAdapter をクリックします。
このテープルアダプタのプロパティで Connection を見ると、上記の例ではエラーの元である "HogehogeConnectionString1 (MySettings)" になってますが、ここのドロップダウンリストを展開すると、一覧に元の(本来選択したかった)接続設定の名前 "HogehogeConnectionString (MySettings)" があるはず。これを選択すればOK! ソースコード編集しなくてすみますw 内部的には同じことをやってるんだろうけど。

2012年8月22日水曜日

ツールボックスにActiveReportsのコントロールが表示されない

VisualStudio2010の開発で、初めてActiveReports(.NET 6.0J Standard)を使うことになりました。レポート出力関係の開発に便利なグレープシティのコンポーネントです。
普通はインストールすればVSのツールボックスにアイコンが表示され、ActiveReportsのカスタムコントロールを他のコントロールと同じようにフォームに配置して使うことができるようになるはずなのに、アイコンが表示されない。ActiveReportsのレポートデザインのときには「ActiveReports 6」グループのタブとその配下のアイコンが表示されるけど、フォームのデザインのときにはそのグループが表示されません。ビューアが配置できない……。

こういう場合によくあるのが参照に追加されていないというやつ。プロジェクトのプロパティの[参照]タブの参照一覧を確認、しかしちゃんとActiveReports関連のは追加されています。
(追加されていない場合はここで[追加]の[.NET]からActiveReports関連のを追加しないと先に進みませんw)
いったん削除して再度追加したり、VS終了して再起動したりといろいろやってみたのですが、出ない……。

ここでやっと、ツールボックスの表示はカスタマイズできることを思い出しましたw
ActiveReportsのレポートデザインではツールボックスに「ActiveReports 6」が表示されているのでここで右クリック、コンテキストメニューから[アイテムの選択]を選択すると、「ツールボックス アイテムの選択」ダイアログが表示されます。
[.NET Framework コンポーネント]タブを見ると、ActiveReportsのコンポーネントが表示されている(アセンブリ名の列でソートすると探しやすい)けどチェックがついていない。ツールボックスに追加したいアイテムにチェックをつけて[OK]するとツールボックスの「ActiveReports 6」グループにアイコンが追加されている……はず。違うグループに入ってしまったらドラッグして移動できます。そもそも「ActiveReports 6」タブが無いという場合は[タブの追加]で新規作成できるので、それ用のタブを作成してから追加(移動)すればOK。

普通はインストールするだけでツールボックスにも反映されるはずなんですが、そういえばActiveReportsインストールするとき、VS終了させるの忘れてて、インストール開始してからあわてて終了させたんでしたw これが怪しい。ちゃんと終了させてからインストールしましょう。

2012年8月2日木曜日

インストーラで作成されたショートカットにドロップできない

前回の記事で、アプリケーションやそのショートカットにドロップするとそのファイル名を受け取って起動して処理するというのができるようになりました。
さて、完成したプロジェクトからセットアッププロジェクトを作成し、それでインストールして、インストール時に作成されたデスクトップアイコンにドロップしようとしたら、ドロップ禁止マーク(?)が出てドロップを受け付けない……。自分で作成したショートカットへはドロップできるし動作もするんですが。
ショートカットのプロパティを見てみると、インストーラが作成したのと自分で作成したのとでは違いがあります。

インストーラが作成したのは[リンク先]が使用不可になっていて、表示されてる内容もファイルパスじゃなくなってます。[ファイルの場所を開く]と[アイコンの変更]ボタンも使用できません。特殊なショートカットで「アドバタイズショートカット」と呼ばれるものらしいです。こうなってるとファイルのドロップを受け付けないようです。
このショートカットをどうこうしてもドロップできるようにはならないみたいです。
そもそもインストーラが作成するショートカットを普通の(アドバタイズじゃない)ショートカットにする必要があるわけです。ということでまたググるw

アドバタイズショートカットではなく、普通のショートカットを作成する: .NET Tips: C#, VB.NET 

これによると、セットアッププロジェクトで生成されたmsiの中身を修正してやればよいとのこと。それには今の環境ではORCAが必要になるので、ちょっと前の記事の話になるわけですw
ショートカットは1個だけなので、DISABLEADVTSHORTCUTS プロパティを追加する方法にしました。これで成功~。ファイルのドロップができるようになりました。
ところでこの方法だと、セットアップビルドのたびにmsiを修正しなければいけないのでは……しかしこれはかつて通った道w 自分のブログの過去記事見て対応しましたw


Windows フォーム アプリケーションに引数を渡す

VB.NETよくわからないのですが仕事で使うことになったのでw 練習がてら、自分で使うためのログビューアを作っています。VS2008です。
詳細仕様は割愛しますが、要はテキストファイルを開いて中身を表示させるものです。一応、ファイル選択ダイアログから開くというのはできるようになったのですが、せっかくなのでデスクトップのショートカットアイコンにドロップして開くというのもやってみようかと。
なんかググったらいろいろ出てきたのですが、コマンドラインで実行する(コンソールアプリケーションですね)のに引数を渡すというのは多いけど、Windowsフォームアプリケーションに渡すというのはあんまりない。
断片的な情報をつなぎあわせて一応できたので、自分用メモw
間違いご指摘とかアドバイスとかあればコメントいただけるとうれしいです。
適当なテストなのでエラー処理とかはしていません。

簡単なサンプルとして、アプリケーションのスタートアップフォームにボタンとファイル選択ダイアログ(OpenFileDialog)とテキストボックスがあって、ボタンクリック→ダイアログ表示→ファイル選択→テキストボックスにファイルパス表示、というのを作ってみました。ここまではまぁわかると思うので説明は割愛w
ダイアログから選択するかわりにファイルをドロップしたいわけです。
ドロップしたファイルのパスの取得については文字通りのやつを見つけたんですが、

実行ファイルにドロップされたファイルのパスを取得する: .NET Tips: C#, VB.NET 

なんかピンと来ないのでここからリンクをたどって、

起動時のコマンドライン引数を取得する: .NET Tips: C#, VB.NET 

を見ると、
「.NET Framework 2.0以降のVB.NETで、My.Application.CommandLineArgs を使用する方法」
というのがあるのでこれが使えそうです。ではこれをどこで使えばいいのか?
さらにググって、フォームアプリで引数を取得する例のようなものを発見。

方法 : Windows フォーム アプリケーションのバッチ モードを有効にする 

これと、参照リンク先の、

方法 : アプリケーション イベントを処理する (Visual Basic) 

を見ると、プロジェクトのプロパティから[アプリケーション イベントの表示]をクリックして出てきた AppricationEvents.vb で、スタートアップフォームが作成される前のアプリ起動イベントが拾えるらしいことがわかりました。
ここでさっきの My.Application.CommandLineArgs を使って引数を取得すればいいようです。

プロジェクトのプロパティページの説明はこのへんが参考になります。

連載! とことん VB: 第 33 回 C# とは異なる、Visual Basic のアプリケーション モデル 言語: VB.NET 


というわけで、できたサンプルのソースはこんな感じ。


(ApplicationEvents.vb)
StartUpイベントで起動時の引数を拾う

Namespace My
    Partial Friend Class MyApplication
        Private Sub MyApplication_Startup(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles Me.Startup
            If My.Application.CommandLineArgs.Count > 0 Then
                Form1.OpenFileDialog1.FileName = My.Application.CommandLineArgs(0)
            End If
        End Sub
    End Class
End Namespace

(Form1.vb)
ボタンクリックでダイアログからファイル選択して表示
その前にフォームのロード時にファイル名がセットされてたらそれを表示

Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If DialogResult.OK = OpenFileDialog1.ShowDialog Then
            TextBox1.Text = OpenFileDialog1.FileNames(0)
        End If
    End Sub
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not OpenFileDialog1.FileName = "" Then
            TextBox1.Text = OpenFileDialog1.FileNames(0)
        End If
    End Sub
End Class

デザイナで、OpenFileDialog1のFileNameプロパティは空にしておきます。
これで、ビルドしたexeやそのショートカットにファイルをドロップすると、パスがテキストボックスに表示されます。
ドロップしたらexeが起動するというのはどうやるのかとかも疑問に思ってたんですが、それについては特別何かのコードを追加しなくてもちゃんと起動してくれました。理屈はあとで調べておこうw