- - PR -
ZedGraphを機能そのままに保存したい(SoapSerialize)
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-11-20 14:30
はじめまして、カセイと申します。
ZedGraphとVB.net(Express Edition)を使用してグラフを作成しています。 ZedGraphWikiには下記のコードをForm1.csにコピーして使用することで、グラフの機能を保持したまま保存が出来るとありましたので試したところ**のコードで 「SerializationInfoオブジェクトに同じメンバを2回追加することは出来ません」 というエラーが出てしまいます。 Private Sub SoapSerialize(ByVal z1 As ZedGraphControl, ByVal fileName As String) If zgc IsNot DBNull.Value And Not String.IsNullOrEmpty(fileName) Then Dim mySerializer As SoapFormatter = New SoapFormatter() Dim myWriter As FileStream = New FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None) mySerializer.Serialize(myWriter, z1.MasterPane)** myWriter.Close() End If End Sub Private Sub SoapDeSerialize(ByVal z1 As ZedGraphControl, ByVal fileName As String) If zgc IsNot DBNull.Value And Not String.IsNullOrEmpty(fileName) Then Dim mySerializer As SoapFormatter = New SoapFormatter() Dim myReader As FileStream = New FileStream(fileName,FileMode.Open,FileAccess.Read, FileShare.Read) Dim master As MasterPane = mySerializer.Deserialize(myReader) z1.Refresh() myReader.Close() z1.MasterPane = master z1.Size = zgc.Size End If End Sub ZedGraphWikiではC#のコードでしたので、VBでは不可なのでしょうか。 それとも、Serializeを使用しているらしいので、新しくClassを追加すればVBでも使用できるのでしょうか。 ご存知の方がいらっしゃいましたら、なにとぞご教授の方宜しくお願いいたします。 | ||||||||
|
投稿日時: 2008-11-20 14:52
VB への移行でミスがなければ、.NET Framework の機能しか使っていないので言語の違いは関係ないです。
例外の情報を見る限り違うと思います。 元データが悪い可能性がありますので、「単純なグラフで保存できるかどうか」 を確認して原因を絞り込むのが早道かと思います。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2008-11-20 15:31
じゃんぬねっと様
お返事ありがとう御座います。 ただいま Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Graph(zgc) End Sub Public Sub Graph(ByVal zgc As ZedGraphControl) Dim myPane As GraphPane = zgc.GraphPane Dim i As Double = 0.0 Dim list As New PointPairList Dim x As Double Dim y As Double For i = 0 To 100 x = i * 5.0 + 25.0 y = Math.Sin(i * Math.PI / 25.0) * 16.0 list.Add(x, y) Next Dim myCurve As LineItem myCurve = myPane.AddCurve("Alpha", list, Color.Red) zgc.AxisChange() End Sub としてサイン波形をつくり、このグラフを保存しようとしておりますが、 エラーに変化はありません。 どうやら 「 myCurve = myPane.AddCurve("Alpha", list, Color.Red) 」 のコードに問題があるようなのですが、何の名前が問題なのか全く判っておりません。 エラーの起きている「 mySerializer.Serialize(myWriter, z1.MasterPane) 」のローカルを調べましたところ 「 Item インデックス付きのプロパティを評価するためには、プロパティが限定されていて、ユーザーにより引数が明示的に指定されていなければなりません。 ZedGraph.GraphPane 」 とありました。 何かを定義すればよいのでしょうか。 [ メッセージ編集済み 編集者: カセイ 編集日時 2008-11-20 15:47 ] [ メッセージ編集済み 編集者: カセイ 編集日時 2008-11-20 15:50 ] | ||||||||
|
投稿日時: 2008-11-21 10:50
C#で試してみましたが同様の現象になるので
ZedGraphのソースを眺めてみました。 エラーが発生する ZedGraph.Line.GetObjectData のコードは以下の通り。
ここでは基底クラス(LineBase)の GetObjectData() を呼んでますが、 そこのコードは以下の通り。
太字の箇所を見ていただけるとお判りのように"color"を二重にセットしています。 Line側の不要な info.AddValue( "color", _color ); をコメントアウトしたDLLで試したところ 当方の環境では(C#ですが)問題なく保存できるようになりました。 つまり、ZedGraph側の問題のように思えます…。 ご参考までに。 | ||||||||
|
投稿日時: 2008-11-21 12:30
Tram様
お返事ありがとう御座います。 Tram様の検証のおかげで原因がわかりスッキリしました。 スキル不足のためVBではどのように改良したらよいか思いつきませんので、 Tram様のコードを参考にしながらGetObject関数あたりを調べてみようかと思います。 | ||||||||
|
投稿日時: 2008-11-21 13:56
いえ、ZedGraph自身の問題だと思いますので、ZedGraph側を直さないとダメかと。 ソースも公開されていますのでダウンロードして Line.cs 内の前述の箇所をコメントアウトした上でビルドし直せば 少なくとも今回の問題については回避できるかと思います。 ただし、ZedGraphはLGPLライセンスですので扱いにはご注意を。 | ||||||||
|
投稿日時: 2008-11-21 17:30
Tram様
ご丁寧にありがとう御座います。 どうやら私はあさっての方向を向いていたようですね。 社内のパソコンはExpress Editionのため.csのプログラムをビルドできませんので、 家庭のパソコンで行ってみようと思います。 起動結果はまた後に書き込ませていただきます。 | ||||||||
|
投稿日時: 2008-11-25 09:45
ご指示のように.cvを変更したら正しく動作するようになりました。
(ライセンスの件ですが、このプログラムは特に配布する予定はありませんので大丈夫だとは思いますが、気をつけます。) じゃんぬねっと様、Tram様 このたびは、私の問題にお付き合いいただき誠にありがとう御座います。 本件はこれにて【解決済み】とさせていただきます。 ありがとう御座いました。 [ メッセージ編集済み 編集者: カセイ 編集日時 2008-11-25 09:47 ] |
1