楽天証券が、楽天RSS(リアルタイムスプレッドシート)という、エクセルに株価情報を自動的に取り込むことが出来るサービスを提供しているのですが、これをエクセルを使わず、DDE(Dynamic Data Exchange)により、VBとC#上に株価情報を取り込みたいと考えております。
.netにはNDdeというDDE通信用のライブラリがあるので、そのライブラリを使い、VBとC#で下記のようなWindows Formを作成し、4桁の数字の「銘柄コード」と1文字のアルファベットの「市場コード」を入れて、「取得」ボタンを押下すると、「銘柄名称」「現在値」が表示され押下する度に「現在値」が更新するようにします(Cold Link)。「監視」ボタンをいったん押下すると、それ以後ボタンを押下せずとも株価が変動する度に「現在値」が更新するようにします(Hot Link)。
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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/04 02:23
2016/12/04 02:24