FC2ブログ
googleで
カスタム検索
プロフィール

けろ&ひな

Author:けろ&ひな
大阪在住。
親ばか。
最近、転職したよ。でも、やってることは一緒なんだけどね。;-P

最近の記事
カテゴリー
月別アーカイブ
最近のコメント
最近のトラックバック
スポンサード リンク

スポンサーサイト--------(--)

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[C#] [Chart] グラフにイメージを表示する2015-07-22(Wed)

連投。
折れ線グラフにイメージを表示したい。ただし、イメージはResourcesに追加して、そこから引っ張ってくる。

chart.Sereise[].MarkerImage を使用すればいいのはすぐにわかる。
分かるのだが、MarkerImage は String だ。。

いろいろググると、ここにはパスを入れるみたいだった。
ググって出てきたのはこれくらい。あとは地道にリファレンスを眺めながらだ。。

どうやら、MarkarImage にはパスのみでなく、Resourceのキーでも行けるみたいだ。
それから、Chart内で使用するImageは、 chart.Images に名前付きで登録する必要があるらしい。

というわけでこんな感じ。

まずはChartに使用するイメージを登録。
Image mark = new Bitmap(Resources.イメージ, 横, 縦);
NamedImage imark = new NamedImage("イメージキー", mark);
chart.Images.Add(imark);


それから、登録したイメージを使用する。
chart.Series[].MarkerImage = "イメージキー"


最初にResourcesから引っ張ってきた画像をそのまま使用したら、えらくでかい画像がババーンと出てきて参った。。
なので、Bitmapを使用してサイズ変更して NamedImage で登録することで回避した。

情報が少なくて、これだけやるのにも時間が掛かった。。。orz


スポンサーサイト

[C#][Chart] Chart のX軸ラベルの位置2015-07-22(Wed)

MS Chartで グラフX軸のメモリの中間にラベルとグラフを表示したい。
ググってみた。。。。答えが見つからなかった。。。orz

リファレンスを眺めて考えた結果、解決した。

使用したプロパティは
    A.グラフの表示位置に影響
  1. ChartAreas[].AxisX.Interval
  2. ChartAreas[].AxisX.IntervalOffSet

    B.X軸メモリの表示位置に影響
  1. ChartAreas[].AxisX.LabelStyle.Interval
  2. ChartAreas[].AxisX.LabelStyle.IntervalOffset

      1. C.ラベルをずらす
      2. CustomLabelを使用する

      ポイントはAとBで値をずらしてやることでグラフとメモリの表示位置をずらすこと。
      そして、表示位置がずれることによりグラフの表示開始位置もずれるので
      AxisX.Minimum, AxisX.Maxmum もずらしてやる。


      具体的には
      chart.ChartAreas[0].AxisX.Minimum = -0.5;
      chart.ChartAreas[0].AxisX.Maximum = {DataCount}-0.5;
      chart.ChartAreas[0].AxisX.Interval = 1;
      chart.ChartAreas[0].AxisX.IntervalOffset = 1;
      chart.ChartAreas[0].AxisX.LabelStyle.Interval = 1;
      chart.ChartAreas[0].AxisX.LabelStyle.IntervalOffset = 0.5;

      これで、グラフの表示位置とメモリの表示位置がずれ、ちょうどメモリの真ん中に表示される。

      Interval と IntervalOffset の説明を読んでいろいろ試してみたら、LabelStyle の Interval と IntervalOffset は弄らなくてもできた。

      chart.ChartAreas[].AxisX.Minimum = -0.5;
      chart.ChartAreas[].AxisX.Maximum = {DataCount}-0.5;
      chart.ChartAreas[].AxisX.Interval = 1;
      chart.ChartAreas[].AxisX.IntervalOffset = 1;


      そもそも、 Axis の Interval と IntervalOffset だけで
      「ラベル、目盛り、またはグリッド線の Interval プロパティ値が NaN に設定されている、つまりこのプロパティが設定されていない場合に、軸に関連付けられたラベル、目盛り、およびグリッド線を描画する頻度を決定します」
      と説明されている。 さらに、ラベル位置を動かすだけなら CustomLabel を使用するだけでいいと。

      あとはラベルの表示位置をずらす。
      これには、"CustomLabel"を使用する。
      chart.ChartAreas[0].AxisX.CustomLabels.Add(new CustomLabel(from, to, "ラベル", rowIndex, LabelMarkStyle));

      メモリを中心にラベルを表示したい場合はfrom, to に 0.5 刻みで差をつけるといいらしい。(<=これはDeveloper Networkのhttps://msdn.microsoft.com/ja-jp/library/system.windows.forms.datavisualization.charting.customlabel.fromposition%28v=vs.110%29.aspxを参考にした。)
      なので、メモリの間に挟みたいなら、from, to を いじってあげればいい感じにできる。

      最初、これが分からずに、AxisLabel の文字列の最後に空白(スペース)を追加したり改行入れたりしてみたけど、ラベルでは前後のスペースは強制的に排除されるため徒労に終わった。。

      もう少し、情報がほしい。。。

      続きを読む

[C#] const と static readonly2014-12-09(Tue)

ソースチェックを行っていた際に、議論になったこと。

チェック項目に「static」はできる限り使用するな、とあった。
その心は?と問いたい気持ちは置いておく。

で、議論対象となったのは
定数に「static readonly」を使用しています。
ということだった。

では、なぜ「const」でなく、「static readonly」にしたのか。
その心は?と問うと
「今の流行は、const よりも static readonly ですぜ。」
と。

意味不明。。。
※ const は、そもそも static なのでは?ということは横に置いておこう。。

ということで、「const」 と 「static readonly」 の違いとは?
const(MSDN C#リファレンスより)

「const」
 ・定数式は、コンパイル時にすべて評価されます。 (switch~case文で使用可能。)
 ・static 修飾子は、定数宣言では使用できません。
 ・初期化のタイミングは、宣言時のみ。
 ・定数には、数字、ブール値、文字列、または null 参照が含まれます。
 
「static readonly」
 ・宣言またはコンストラクターのどちらかで初期化できます。
 ・使用するコンストラクターに応じて異なる値を持つことができます。
 ・実行時定数として使用できます。


また、「const」の値は「静的」な値として、コンパイル時に使用している先に埋め込まれます。
それに対して、「static readonly」の値は、実行時に決定するので埋め込まれることはありません。

では、今回議論になったことを考えてみると。

そもそも、なぜ「static readonly」にしたのか。
理由が「主流」だからというのは、意味不明。
なら「staitc readonly」にしているとは、どういうことか。

実行時、コンストラクタにおいて変更する必要がある。(宣言時に決定することができない。)
または
変更されることが頻繁に起こりうる。

なので、「static readonly」であって

宣言時に決定している。
かつ
変更されることは、まずない。(変更時には影響範囲が大きいので調査工数が発生するほど。)
(というか、実行時に変更されるとマズイ。)

なら、「const」を使ったほうが後のメンテナンス時にも混乱が起きにくいのではないか。
であれば、「const」と「static readonly」は明確に使い分けるべきなのではないのか。

ということで、落ち着いた。

[C#]sgen.exe が Releaseビルドの際のみエラーを吐く2014-06-02(Mon)

プロジェクトで使用しているのは、VisualStudio 2010だけど、同じだった。

VS2008 のVBのビルドで、"sgen.exe" exited with code 1. のエラーが出ます。 (http://social.msdn.microsoft.com/Forums/ja-JP/128800ac-5e94-43a9-a117-8e1eada93ba0/vs2008-vbsgenexe-exited-with-code-1-?forum=vbexpressja)

"sgen.exe" exited with code 1 (http://social.msdn.microsoft.com/Forums/vstudio/en-US/f7f4c51f-daf6-44c5-b214-cf312b8f625f/sgenexe-exited-with-code-1?forum=msbuild)

C#は、ReleaseビルドとDebugビルドでコンパイル結果が違うことがよくあるらしい。
C系をやっている人にとっては当たり前なことなのかな?

ということで、ビルドエラーが出る「プロジェクトのプロパティ」⇒「ビルド」⇒「シリアル化アセンブリを生成」を「オフ」に設定することで回避できました。

ただ、問題の本質がそこにあるのかは別問題ですが。
今回の問題については、確かにビルドエラーは回避できましたが
そもそもの原因は partial化したクラスにあったというオチ。。
工事中
RSSフィード
リンク

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。