質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

5436閲覧

【C#】EventHandlerにメソッドを登録できない!

monolith_91

総合スコア18

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2016/12/04 01:59

楽天証券が、楽天RSS(リアルタイムスプレッドシート)という、エクセルに株価情報を自動的に取り込むことが出来るサービスを提供しているのですが、これをエクセルを使わず、DDE(Dynamic Data Exchange)により、VBとC#上に株価情報を取り込みたいと考えております。

.netにはNDdeというDDE通信用のライブラリがあるので、そのライブラリを使い、VBとC#で下記のようなWindows Formを作成し、4桁の数字の「銘柄コード」と1文字のアルファベットの「市場コード」を入れて、「取得」ボタンを押下すると、「銘柄名称」「現在値」が表示され押下する度に「現在値」が更新するようにします(Cold Link)。「監視」ボタンをいったん押下すると、それ以後ボタンを押下せずとも株価が変動する度に「現在値」が更新するようにします(Hot Link)。

![イメージ説明(Windows Formのイメージ)

VB.netに関しては、下記のコードにより、目的の動作を果たしていることを確認しております。

VB.net

1Imports NDde.Client 2Imports System.Text 3 4Public Class Form1 5 6 'Cold Linkで「取得」ボタンを押下した時のみ、株価の現在値を取得する。 7 Private Sub 取得_Click(sender As Object, e As EventArgs) Handles 取得.Click 8 9 'トピック名の作成 10 Dim topic As String = 銘柄名称コード.Text & "." & 市場コード.Text 11 'DDEクライアントをインスタンス化 12 Dim client As New DdeClient("RSS", topic) 13 '接続 14 client.Connect() 15 '銘柄名称のバイト配列を取得 16 Dim meigaraMeishoByte As Byte() = client.Request("銘柄名称", 1, 60000) 17 'バイト配列を文字列に変換して画面に取得 18 銘柄名称.Text = Encoding.Default.GetString(meigaraMeishoByte) 19 '現在値のバイト配列を取得 20 Dim praceByte As Byte() = client.Request("現在値", 1, 60000) 21 'バイト配列を文字列に変換して、空白文字削除 & 小数点以下を切り捨てて画面に表示 22 Dim priceText As String = Encoding.Default.GetString(praceByte).Trim 23 Dim dotIndex As Integer = priceText.IndexOf(".") 24 If dotIndex > -1 Then 25 '小数点があれば小数点以下を破棄 26 priceText = priceText.Substring(0, dotIndex) 27 End If 28 現在値.Text = priceText 29 'DDEクライアントの破棄 30 client.Dispose() 31 32 End Sub 33 34 'Hot Linkで「監視」ボタンを押下した後、株価が変化する度に更新される。 35 Private Sub 監視_Click(sender As Object, e As EventArgs) Handles 監視.Click 36 37 'トピック名の作成 38 Dim topic As String = 銘柄名称コード.Text & "." & 市場コード.Text 39 'DDEクライアントをインスタンス化 40 Using client As New DdeClient("RSS", topic) 41 '接続 42 client.Connect() 43 '銘柄名称のバイト配列を取得 44 Dim meigaraMeishoByte As Byte() = client.Request("銘柄名称", 1, 60000) 45 'バイト配列を文字列に変換して画面に取得 46 銘柄名称.Text = Encoding.Default.GetString(meigaraMeishoByte) 47 End Using 48 49 '現在値の監視を開始 50 Dim adviceClient As DdeClient = New DdeClient("RSS", topic, Me) 51 adviceClient.Connect() 52 AddHandler adviceClient.Advise, AddressOf PriceChange 53 adviceClient.StartAdvise("現在値", 1, True, 60000) 54 55 End Sub 56 57 Private Sub PriceChange(ByVal sender As Object, ByVal e As DdeAdviseEventArgs) 58 59 '現在値のバイト配列を取得() 60 Dim praceByte As Byte() = e.Data 61 'バイト配列を文字列に変換して、空白文字削除 & 小数点以下を切り捨てて画面に表示 62 Dim priceText As String = Encoding.Default.GetString(praceByte).Trim 63 Dim dotIndex As Integer = priceText.IndexOf(".") 64 If dotIndex > -1 Then 65 '小数点があれば小数点以下を破棄 66 priceText = priceText.Substring(0, dotIndex) 67 End If 68 現在値.Text = priceText 69 70 End Sub 71 72End Class

同様に、上記のコードをc#用に下記のように移植したのですが、コードを走らせると、
「No overload for 'PriceChange' matches delegate 'System.EventHandler」
とメッセージが表示されます。どのようにエラーを解消させれば良いのでしょうか?

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10 11using NDde.Client; 12 13namespace RakutenRSS_CSharp 14{ 15 public partial class Form1 : Form 16 { 17 public Form1() 18 { 19 InitializeComponent(); 20 } 21 22 //Cold Linkで「取得」ボタンを押下した時のみ、株価の現在値を取得する。 23 private void 取得_Click(object sender, EventArgs e) 24 { 25 //トピック名の作成 26 String topic = 銘柄コード.Text + "." + 市場コード.Text; 27 28 //DDEクライアントをインスタント化 29 DdeClient client = new DdeClient("RSS", topic); 30 31 //接続 32 client.Connect(); 33 34 //銘柄名称のバイト配列を取得 35 Byte[] meigaraMeishoByte = client.Request("銘柄名称", 1, 60000); 36 37 //バイト配列を文字列に変換して画面に表示 38 銘柄名称.Text = Encoding.Default.GetString(meigaraMeishoByte); 39 40 //現在値のバイト配列を取得 41 Byte[] praceByte = client.Request("現在値", 1, 60000); 42 43 //バイト配列を文字列に変換して、空白文字削除 & 小数点以下を切り捨てて画面に表示 44 String priceText = Encoding.Default.GetString(praceByte).Trim(); 45 int dotIndex = priceText.IndexOf("."); 46 if (dotIndex > -1) 47 { 48 priceText = priceText.Substring(0, dotIndex); 49 } 50 現在値.Text = priceText; 51 //DDEクライアントの破棄 52 client.Dispose(); 53 } 54 55 //Hot Linkで「監視」ボタンを押下した後、株価が変化する度に更新される。 56 private void 監視_Click(object sender, EventArgs e) 57 { 58 //トピック名の作成 59 String topic = 銘柄コード.Text + "." + 市場コード.Text; 60 61 //DDEクライアントをインスタント化 62 using (DdeClient client = new DdeClient("RSS", topic)) 63 { 64 //接続 65 client.Connect(); 66 67 //銘柄名称のバイト配列を取得 68 Byte[] meigaraMeishoByte = client.Request("銘柄名称", 1, 60000); 69 70 //バイト配列を文字列に変換して画面に表示 71 銘柄名称.Text = Encoding.Default.GetString(meigaraMeishoByte); 72 } 73 DdeClient adviceClient = new DdeClient("RSS", topic, this); 74 adviceClient.Connect(); 75 76 /*** ★★ ここと ★★ ***/ 77 adviceClient.Advise += new EventHandler(PriceChange); 78 /*** ★★ ここの間でエラーが発生している模様。 ★★ ***/ 79 80 adviceClient.StartAdvise("現在値", 1, true, 60000); 81 } 82 83 private void PriceChange(object sender, DdeAdviseEventArgs e) 84 { 85 //現在値のバイト配列を取得 86 Byte[] praceByte = e.Data; 87 88 //バイト配列を文字列に変換して、空白文字削除 & 小数点以下を切り捨てて画面に表示 89 String priceText = Encoding.Default.GetString(praceByte).Trim(); 90 int dotIndex = priceText.IndexOf("."); 91 if (dotIndex > -1) 92 { 93 priceText = priceText.Substring(0, dotIndex); 94 } 95 96 現在値.Text = priceText; 97 } 98 99 } 100} 101

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

adviceClient.Advise += new EventHandler(PriceChange);

adviceClient.Advise += new EventHandler<DdeAdviseEventArgs>(PriceChange);

投稿2016/12/04 02:09

ozwk

総合スコア13512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

monolith_91

2016/12/04 02:23

迅速なご回答ありがとうございます! いや~、お恥ずかしい。プログラミングに詳しくないため、この程度のことでも分からず、 Googleで調べて何日間も格闘しても解決できなかったので途方に暮れていたので本当に助かりました! 重ねて深く感謝いたします。本当にありがとうございました!
monolith_91

2016/12/04 02:24

あ、済みません。肝心の結果を申し上げていなかったのですが、教えて頂いた通りに修正して無事エラーが解消しております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問