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

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

フレームワークの参照が難しすぎ

mac os用のソフトウェアを作成するためにxcodeを使ってプログラミングをしようとしていたのだけれど、いつも通りプログラミングを始める前の環境構築に苦労した。既存のフレームワークを使うことで手早くソフトを開発しようと都合のいいことを考えていたら、フレームワークの参照の設定の仕方からわからない体たらく。さらにフレームワークを設定する前にそのフレームワークを自分で作成しなければならないことがわかって、さらにその前の準備としてsubversionというソフトウェアをインストールしないといけなくて、そのsubersionというのはどうやってインストールするのかというのを調べて・・・

プログラムを組まないで半日潰れた。でもまあ、なんとなく仕組みはわかってきたので無駄骨ということにはならなかった。

mschartが表示されない

vb.netで作成したwindowsアプリケーションにグラフを表示させてみようと思って、mschartというグラフ描画コンポーネントを使うことにした。そして、実装が終わってリリースしたものを他のマシンで動作確認しようとしたら、問題が発生したためアプリケーションを終了しますということになった。エラーの原因は、mschartを動かすためのvb6ランタイムがインストールされていないことがどうもそれらしい。vb6のランライムがインストールされていれば、mschartを表示することができる。今私が作成しようとしているのはvb.net用のアプリケーションなので、動かすためには.net frameworkをインストールする必要があるけれど、それにさらにvb6のランタイムが無いと動かないアプリケーションというのはダサすぎて作りたくない。というわけで、mschartを使うのはやめて別のコンポーネントを使ってグラフを表現することにしてみる。

select文で特定のセルに文字列を挿入する

sqlのselect文で列の値へテーブルの値ではなくて、特定の文字列を挿入した場合のsql文。たとえばテーブルの合計を出したい場合などのとき、1列目のセルの値は文字列で’合計’、2列目のセルの値はsum関数で取得した合計値を入れる・・・というようなレアなケース。

サンプルコード

SELECT ‘合計’,SUM(列1) FROM テーブル1

というような具合。簡単過ぎてググっても見つからなかったので覚え書き。

データグリッドの列の並び順が変わってしまう

datagridviewへdatasetにセットされたテーブルをバインドしたとき、一度目のバインドでは思い通りの列の並び順にならぶ。次に、同じデータグリッドへ列数が少ないテーブルをバインドする。これも思い通りの列の並び順で表示される。そして次に、一度目と同じテーブルをセットしたら、2度目の並び順を引き摺ったまま表示されてしまい、思い通りの並び順になってくれない。

またこれもvisual studioのわけのわからないバグなのだろうか。とりあえずググって調べてみたら、データグリッドの列の表示順を設定することができるプロパティがあることがわかったのでそれで対処することにした。

サンプルコード

        me.datagridview1.Columns(0).DisplayIndex = 0
        me.datagridview1.Columns(1).DisplayIndex = 1
        me.datagridview1.Columns(2).DisplayIndex = 2
        me.datagridview1.Columns(3).DisplayIndex = 3
        me.datagridview1.Columns(4).DisplayIndex = 4
        me.datagridview1.Columns(5).DisplayIndex = 5

参考サイト

DataGridViewの列の並びがビルド時に変わるのを防ぎたい