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



ORCA入手するのめんどい……と思ったらもう入手していた

ORCAというのはマイクロソフトのインストールデータベースファイルである .msi ファイルの中身を見たり編集したりするためのツールですが(そうか?)、マイクロソフトのダウンロードセンターで検索しても単体では配布されてないようです。Windows SDKの各バージョン(全部かどうか知らないんですが)に含まれているので、SDKをインストールすればいいのですが、結構サイズも大きいし、実際ORCA使いたいだけなのに使わないツール入れるのもなんだし。
SDKのカスタムインストールで要るとこだけ入れればよさそうなんですが、オプション多すぎてどこにORCA入ってるのかわからないしw Installerとかっぽいですが未確認です。
で、ふと気がつくと(このパターン多いなw)なんかSDKもう入ってるじゃないですか。インストールした覚えないけど。
スタートメニュー見ると[Microsoft Windows SDK 6.0A]というグループがありました。念のため中を見たけど[Tools]の下にORCAは無い……。しかしそもそもORCAってSDKインストールしても一緒にインストールされるわけではなく、インストール先のbinフォルダにmsiファイルがコピーされてるのをまた自分でインストールしなきゃいけない仕様なんですよ。なのでここに無いのもわかる。
というわけで、インストールされているらしいSDK 6.0Aのフォルダを探します。[Tools]の下のショートカットをどれでもいいから右クリックして[ファイルの場所を開く]とやると、
C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin
が開きました。binなのでこのフォルダを探すと……ありましたよORCA.msiが!
さっそくORCA.msiを実行してインストールします。めでたしめでたし。

ところでSDKの6.0Aというのはいつインストールされたのか?
ググってみるとこれはVisual Studio 2008に含まれているものらしいです。VS2008インストールするときに、全部入りにしたか、なんか途中で選択肢が出てきて入れたのかもしれない。覚えてないけどw
Microsoft Windows SDK - Wikipedia, the free encyclopedia

というわけで、ORCAが必要になったけど入手めんどいという人は、VS2008インストール済みだったらまずは見てみると別途入手しなくてもインストールだけですむかもしれませんよ。
他のバージョンのVisual Studioだったらどうなのか? というのは未確認なのでわかりません……。他のバージョンのVSなら他のバージョンのSDKが入りそうなので、さっきのSDKsフォルダのところにv6.0Aじゃないフォルダがあったらそっちも見てみるといいかもしれません。
しかし結局いつまでもORCA必要になってるので、マイクロソフトもORCA.msiだけを単体配布してくれてもいいと思うんですけど。どうせずっとバージョンも変わってないんでしょうにw