visual studioが不具合を起こした2

—————————
Microsoft Visual Studio
—————————
Microsoft Visual Basic 2005 コンパイラを作成できなかったため、プロジェクト ‘cdn_01’ を開けませんでした。Visual Studio を再インストールしてください。
—————————
OK キャンセル
—————————

orz

reportviewer はデータソースが複数あるとわけがわからない状態になる

rpds.pngvisual studioのreportviewer コントロールの設定で嵌ってしまったので備忘。reportviwerコントロールをフォーム上に配置したらレポートの設定をするためにrdlcという拡張子がついたレポート用のファイルを作成する。その作成が終わったらreportviewerのレポートとして設定しする。そのとき、データソースの設定で項目が複数あるとどうもデータのグラフへのバインドがうまくいかない。データソースには存在するデータのみを設定しなければグラフは描画されない。また、グラフへデータソースとして設定する場合に、そのデータソースのテーブルにnullが存在すると描画されない。null対策としてはIIF(isnull(field1),0,field1)というようなことで応急措置。

テーブルのデータをグラフ表示する、ただそれだけの単純なことなのにreportviewerの扱いを覚えるのに随分と時間がかかってしまった。それにしても、あらかじめdatasetをプロジェクトに作成して、そのdataset内のデータをグラフのデータフィールドとして設定しないとコンパイルができないという仕様はどうにかならんものだろうか・・・。

System.ArgumentException: 入力文字列の形式が正しくありません。列 initial_money に を格納できませんでした。 必要な型は Double です。 —> System.FormatException: 入力文字列の形式が正しくありません。

datagridviewにデータをバインドした時のこと。データグリッドへバインドされたテーブルのセルの値を変更しようと思って文字列を挿入しようとしたら

System.ArgumentException: 入力文字列の形式が正しくありません。列 initial_money に <-11809 -11809> を格納できませんでした。 必要な型は Double です。 —> System.FormatException: 入力文字列の形式が正しくありません。

(省略)

というエラーが出て挿入することができなかった。エラーの意味はわかるけれど、わからないのはいつの間にか列の型がdoubleという風に指定されていたということ。これは一体いつの間に決まってしまったのだろう。

そもそもデータグリッドの列に型が存在することをこの時に始めて知った。文字列とか数値とか画像とかいろいろ入れることができるのでobject型のようなものが設定されているかと思ったらもっと厳密に文字列ならstring型、数値ならdouble型という風にできている模様。

この今回のエラーのdouble型じゃないから数値を格納できないという、doubleという型が勝手に決められてしまったことが一番わからない。私はdouble型なんてどこにも使ってないのだから。

データグリッドにバインドした時に列の値が数値ならdouble型と判定されてしまうのか、それともdatasetを作成した時にそれは判定されてしまうのか、それとも何か他の知らないルールがあるのか。調査中。

その後

こんなエラーが発生した。

プロバイダで Double 値を特定できませんでした。たとえば、行が作成されたときに Double 列の既定値が使用できない状態で、使用者が新しい Double 値を設定していなかった場合が考えられます。

windowsアプリケーションにグラフを追加してみる

MSChartを使うことを諦めて別のグラフコンポーネントを探していたところ、visual studio 2005に標準でreportviwerというコンポーネントがあることに気づいた。reportというぐらいだから印刷用のコンポーネントと思いきや、グラフを表示することができるようになっている。vb6から.netへと変更した後でMSChartが無くなったらその代わりの物が無いとおかしいとは思っていたけれど、reportviewerという名前に変更になっていたとは今まで気づかなかった。

で、このコンポーネントを使うことにしてみたんだけれど、色々と不便なところが多い。reportviewerのレポートソースにrdlcファイルを設定するのだけれど、そのrdlcファイルというものが堅物でデータソースをあらかじめ設定しておかないといけない仕様となっている。後でコードでデータセットを作成してイベントでセットするつもりであっても。また、reportviewerからrdlc内のグラフへアクセスすることができない(今のところ私の知る限りでは)。なんかありそうなのだけれど、グラフのプロパティにアクセスをすることができない。さらに根本的な問題として、このコンポーネントは.net frameworkのコンポーネントに含まれては無い模様。利用するには別途reportviewerのdllが必要になる。

なんというかこれっていうグラフコンポーネントはないものだろうか・・・。

datagridの内容をmschartに表示

ボツになった案。vb6用のランタイムが無いとmschartは表示することができないので自分は使うことができないけど、誰かほかの人の参考になればと思って。やろうとしてたことのサンプルコードは下記に載せてあります。画像ファイルを貼り付けてグラフを表示するという方法もあるらしいけれど、都度データを送るだけで表示することができる分こっちの方が筋は良いと思う。ちなみに下記コードの大まかな内容は、datagrid1というデータグリッドがあって、その中にデータが既にバインドされてて、セルの1番目には日付が有り、セルの5番目には数値があり、日付と数値を対応付けてグラフ表示をさせようとしたもの。

vb.net用のアプリケーションでは使えないため、vb6用のアプリケーションを作成している方向け・・・って、今の時期にいるのだろうか?

サンプルコード

        Dim j As Integer = mainForm.datagrid1.RowCount
        Dim arrData((j - 1), 2) As Object


            For j = 0 To (mainForm.datagrid1.RowCount - 1)

                arrData(j, 1) = mainForm.datagrid1.Rows(j).Cells(0).Value.ToString
                arrData(j, 2) = mainForm.datagrid1.Rows(j).Cells(4).Value.ToString

            Next j


        mainForm.chart1.ChartData = arrData

wordpressのダッシュボード画面にあるその他の情報を削除

wordpressの管理画面にログインすると、ダッシュボード内にその他のサイトの更新情報が標準で表示されるようになっている。毎回ログインするたびにrssを読み込んでいるようなので必要ないから表示されないようにしてみる。wp-admin以下のindex.phpファイルを覗いてみると3つのrssを読み込んでいることがわかる。wp-admin/index.phpの8行目〜12行目に以下のコードがある。これを見るとindex-extra.phpから引数をつけて呼び出しているのがわかる。

function dashboard_init() {
	var update1 = new Ajax.Updater( 'incominglinks', 'index-extra.php?jax=incominglinks' );
	var update2 = new Ajax.Updater( 'devnews', 'index-extra.php?jax=devnews' );
	var update3 = new Ajax.Updater( 'planetnews', 'index-extra.php?jax=planetnews'	);
}

では、今度はwp-admin/index-extra.phpファイルを覗いてみる。ダッシュボード内でその他の情報として表示されている部分のrssは、index-extra.phpファイルの42行目〜48行目の部分、”planetnews”という部分がどうもそれらしい。そこに
http://r.hatena.ne.jp/WordPress-Japan/WordPress/rssからfetch(取得)するという風にある。それではその部分を修正してrssを取得しないようにしてみる。ただ単にアドレスの部分を削除するだけ。

変更前

case 'planetnews' :
$rss = @fetch_rss('http://r.hatena.ne.jp/WordPress-Japan/WordPress/rss');

変更後

case 'planetnews' :
$rss = @fetch_rss('');

修正箇所はwp-admin/index-extra.phpの46行目のアドレス部分を削除するだけ。これで、とりあえずはその他の情報としてダッシュボードに表示されることはなくなった。

objective-cがなぜ難しいか

ここ数日mac os用のアプリケーションを作成するためにobjective-cの勉強をしているのだけれど、どうもプログラムのコードの内容が理解できない。コードを読んでどのような処理が起こっているのかという流れがわからないのが一番の原因だと思う。何かイベントが起こったときにメソッドが呼び出されて、その際に付随するように呼び出されるメソッドがあり、その付随されるようにして呼び出されているメソッドがコードを見ただけではわからないということが理解することを遠ざけている。暗黙的に知っておかなければならない知識というものがobjective-cには必要で、それが今の私にはないためにコードの流れが理解できないのだろう。ゆえに、他人の書いたコードで何が起こっているのかということがわからない。

メソッドの呼び出しについて

objective-cのメソッドの呼び出し方について調べてみたけれど、どうもよくわからない。定義されたメソッドがいつ、どこで呼ばれているのかということがコードを見渡しただけでは把握することができないためとっつきにくい。たのしいCocoaプログラミングという本についているサンプルコードに以下のコードがある。

#import “AppController.h”

@implementation AppController

– (void)dealloc
{
(省略)
}

– (IBAction)readUrl:(id)sender
{
(省略)
//テーブルビューにデータを読み込み
[tableView reloadData];
}

– (int)numberOfRowsInTableView:(NSTableView*)tableView
{
(省略)
}

//NSTableViewデータソース
– (id)tableView:(NSTableView*)tableView objectValueForTableColumn:(NSTableColumn*)tableColumn row:(int)row
{
(省略)
}

@end

上記の4つのメソッドがサンプルのプログラムには実装されている。
– (void)dealloc はオブジェクトの解放時に呼び出すメソッド
– (IBAction)readUrl:(id)sender はインターフェース上に配置しているボタンをクリックしたときに呼び出すメソッド
– (int)numberOfRowsInTableView:(NSTableView*)tableView はxmlドキュメントのノードの数を取得するときに呼び出すメソッド
– (id)tableView:(NSTableView*)tableView objectValueForTableColumn:(NSTableColumn*)tableColumn row:(int)row はtableviewにデータソースを設定するときに呼び出すメソッド

プログラムは単純なRSSリーダーで、インターフェース上のボタンをクリックしたらテキストフィールドに入力されたRSSのアドレスを読み込んで内容をテーブルビューに表示させるというもの。ただ、コードを見ただけではメソッドがどのようにして呼び出されているかというのがわからない。インターフェース上のボタンをクリックすると- (IBAction)readUrl:(id)senderが呼び出される。呼び出された後はXMLの解析がされてメソッドの最後に[tableView reloadData];を呼び出す。この部分で- (int)numberOfRowsInTableView:(NSTableView*)tableViewと- (id)tableView:(NSTableView*)tableView objectValueForTableColumn:(NSTableColumn*)tableColumn row:(int)rowを呼び出している。[tableView reloadData];を呼び出すとさっきの二つのメソッドが呼び出されるということを知らないとコードを見ただけでは迷子になってしまう。さらにtableViewがインターフェース上に表示された時点でも先ほどの二つのメソッドが呼び出される。ちょっとわかりにくいなぁ・・・。

dyld: Library not loaded: @executable_path

dyld: Library not loaded: @executable_path/../Frameworks/Connection.framework/Versions/A/Connection
Referenced from: /Users/nakahira/testApp/build/Debug/testApp.app/Contents/MacOS/testApp
Reason: image not found

ftp test はシグナル 5(SIGTRAP)により終了しました。

今度は上記のようなエラーが出た。ダイナミックライブラリが読み込むことができなかった模様。
@executable_path/../Frameworks/ に /Connection.framework が無いよということなのだろう。@executable_path/../Frameworks/はどこのことかというと、システムのライブラリのFrameworks(/System/Library/Frameworks)になる。その場所に、/Connection.framework があれば読み込むことができるようになる。実体でもシンボリックリンクでも。環境を構築するのも大変だ。

ZeroLink: unknown symbol '_NSApplicationMain'

[Session started at 2008-03-21 00:22:13 +0900.]
ZeroLink: unknown symbol ‘_NSApplicationMain’
testApp はシグナル 6(SIGABRT)により終了しました。

macのxcodeでcocoaアプリケーションを作成中に上記エラーが出た。 何のことやら・・・と思っていたら作成しようとしているプロジェクトにフレームワークの追加がされてなかったことが(私の場合は)原因だった。

プロジェクトのアイコンを右クリックして追加を選択し、そして既存のフレームワークを選択して開発に必要なフレームワークを追加することでこのエラーは消えた。