各局皆様、こんにちは。アマチュア無線局、JS2IIUです。
前回作成した、FT8コールサイン表示ツール(過去記事参照:FT8 コールサイン表示ツール)に、Twitterのフォロワーさんかどうか、がわかる機能を入れたいと思います。フォロワーさんのコールサインを書き込んだCSVファイルを用意したので、それを読み込んで、交信中の局のコールサインと照合するようなアプリに改造したので、手順を残します。
- 前提
- 過去記事の続きです(FT8 コールサイン表示ツール)
- Visual Studio 2022
- Visual BasicでWPFアプリ
- FT8にはJTDXを使っています。JTDXが動いているのと同じパソコンで動作させます。
なお、JS2IIUのTwitterはこちら(@Js2Iiu)を参照してください。アマチュア無線の局長様各位のフォローをお待ちしております。
目次
アプリのイメージ
Twitterフォロワーさんでない局との交信の場合はこちらのような表示。(以前のアプリと見た目変わりません)残念ながら8J1RL局はJS2IIUのフォロワーさんではありません。コールサインの文字色は黒です。
フォロワーさんと交信している場合には、こちらのようにフォント色が赤に変わります。またWindowsのシステムサウンドが再生されるようにしています。
CSVファイルのイメージ
CSVファイルには一行に一つのコールサインが書かれています。こんな感じです。2エリアのレピータリストからコールサインを引用させていただきました。
JS2IIU
JP2YFT
JP2YFV
JP2YFX
JP2TGS
つづく・・・
CSVファイルを読み込み配列に格納する
CSVファイルの読み込みはStreamReaderで行います。Microsoftのドキュメントページにサンプルコード付きで説明されています。CSVファイルには一行に一つのコールサインが書かれているので、StreamReader.ReadLine メソッドで一行ずつ読み込みしています。
readCSVtoArrayという関数を定義して、CSVファイルのフルパスを引数で渡しています。また、格納する配列CallArray()は関数の外でPublicで宣言することにしました。(もっとスマートなやりかたがありそうですが・・・)
細かいところですが、今回CSVファイルはMicrosoft Excelで作成したのでエンコーディングがUTF-8でした。最初Shift-JISにしていたため気づくまで少々てこずりました。
Public CallArray() As String
Private Sub readCSVtoArray(ByVal strFilePath As String)
Dim ExtentionName As String
Dim numCallsign As Integer = 0
Try
ExtentionName = Path.GetExtension(strFilePath)
If ExtentionName = ".csv" Then
Using sr As New StreamReader(strFilePath, Encoding.GetEncoding("UTF-8"))
Do While (sr.Peek() > -1)
CallArray(numCallsign) = sr.ReadLine()
numCallsign += 1
Loop
sr.Close()
End Using
End If
Catch ex As IO.FileNotFoundException
'File not found exception
Catch ex As Exception
' do something here
End Try
End Sub
配列を検索して存在チェックする
フォロワーさんのコールサインが配列に無事格納できました。配列を検索して、特定のキーワードが存在しているかどうかをチェックするにはArray.IndexOfメソッドを使いました。Microsoftのドキュメントに詳しく説明があります。
Array.IndexOf メソッド
https://docs.microsoft.com/ja-jp/dotnet/api/system.array.indexof?view=net-6.0
定義
名前空間: System
アセンブリ: System.Runtime.dll
指定されたオブジェクトを 1 次元の配列または配列の要素範囲内で検索し、最初に見つかったオブジェクトのインデックスを返します。
一致する要素が見つからなければ、Array.IndexOf(CallArray, strCBText) = -1となります。
If Array.IndexOf(CallArray, strCBText) = -1 Then
'テキストブロックの書式変更を戻す
CB_TextBlock.Foreground = New SolidColorBrush(Colors.Black)
Else
'テキストブロックの書式を変更する(リストにコールサインある場合)
CB_TextBlock.Foreground = New SolidColorBrush(Colors.Red)
End If
TextBlockの文字色を変更する
TextBlockの文字色はTextblock.Foregroundプロパティで指定できます。こちらもMickrosoftのドキュメントを参照してください。 Textblock.Foregroundプロパティ はBrushオブジェクトなので、SolidColorBrush()で色を指定します。
TextBlock.Foreground Property
Definition
Namespace: System.Windows.Controls
Assembly: PresentationFramework.dll
Gets or sets the Brush to apply to the text contents of the TextBlock.https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.controls.textblock.foreground?view=windowsdesktop-6.0
Public Property Foreground As Brush
TextBlock.Foreground = New SolidColorBrush(Colors.Red)
フォロワーさん配列を検索して、コールサインが見つかった時には赤色、そうでなければ黒色の文字色です。細かいところですが、フォロワーさん以外だった場合に文字色を黒に戻すのを忘れないように・・・
システムサウンドを再生する
システムサウンドはSystem.Media.SystemSounds.Asterisk.Play()で再生できます。Asteriskのところを変えると別のシステムサウンドが再生できます。
System.Media.SystemSounds.Asterisk.Play()
ソースコード
ソースコード全体です。冗長なところが多々ありますが、ご容赦願います。
'タイマー処理
Imports System.ComponentModel
Imports System.Windows.Threading
Imports System.IO
Imports System.Text
Class MainWindow
Public Const CALL_MAX_LEN As Integer = 9
Public Const STR_NOT_CALL As String = "STBY"
Public Const MAX_CALL_ARRAY As Integer = 450
Public Const CALL_CSV_FNAME As String = "(ここにCSVファイルのフルパス)JS2IIU_FOLLOWER.csv"
Public CallArray() As String
Public strMemCall As String = ""
Public Sub New()
' この呼び出しはデザイナーで必要です。
InitializeComponent()
' InitializeComponent() 呼び出しの後で初期化を追加します。
SetupTimer()
ReDim CallArray(MAX_CALL_ARRAY)
' コールサインの読み出し -> CallArray()に読み込む
readCSVtoArray(CALL_CSV_FNAME)
End Sub
Private Sub WatchButton_Click(sender As Object, e As RoutedEventArgs) Handles WatchButton.Click
Dim strCBText As String
If Clipboard.ContainsText() Then
If Clipboard.GetText.Length < CALL_MAX_LEN Then
strCBText = Clipboard.GetText()
Me.CB_TextBlock.Text = strCBText
'フォロワーリストとの照合
If Array.IndexOf(CallArray, strCBText) = -1 Then
'テキストブロックの書式変更を戻す
CB_TextBlock.Foreground = New SolidColorBrush(Colors.Black)
Else
'テキストブロックの書式を変更する(リストにコールサインある場合)
CB_TextBlock.Foreground = New SolidColorBrush(Colors.Red)
End If
Else
Me.CB_TextBlock.Text = STR_NOT_CALL
End If
End If
End Sub
'タイマメソッド
Private Sub MyTimerMethod(sender As Object, e As EventArgs)
'Me.CB_TextBlock.Text = DateTime.Now.ToString("HH:mm:ss")
Dim strCBText As String
Dim flgSound As Boolean = False
If Clipboard.ContainsText() Then
If Clipboard.GetText.Length < CALL_MAX_LEN Then
strCBText = Clipboard.GetText()
Me.CB_TextBlock.Text = strCBText
'システム音再生(コールサインが新しくなった時だけ再生させる)
If strMemCall = strCBText Then
'音を鳴らさない
flgSound = False
Else
strMemCall = strCBText
'システム音再生フラグ
flgSound = True
End If
'フォロワーリストとの照合
If Array.IndexOf(CallArray, strCBText) = -1 Then
'テキストブロックの書式変更を戻す
CB_TextBlock.Foreground = New SolidColorBrush(Colors.Black)
Else
'テキストブロックの書式を変更する(リストにコールサインある場合)
CB_TextBlock.Foreground = New SolidColorBrush(Colors.Red)
' クリップボード読み込みのたびに音が鳴らないようにする
If flgSound = True Then
System.Media.SystemSounds.Asterisk.Play()
' System.Media.SystemSounds.Beep.Play()
flgSound = False
End If
End If
Else
Me.CB_TextBlock.Text = STR_NOT_CALL
End If
End If
End Sub
'タイマのインスタンス
Private _timer As DispatcherTimer
'タイマの設定
Private Sub SetupTimer()
'タイマのインスタンス生成
_timer = New DispatcherTimer()
'interval 1sec
_timer.Interval = New TimeSpan(0, 0, 1)
'タイマメソッド
AddHandler _timer.Tick, New EventHandler(AddressOf MyTimerMethod)
'タイマを開始
_timer.Start()
'画面閉じられるときに、タイマを停止する
AddHandler Me.Closing, New CancelEventHandler(AddressOf StopTimer)
End Sub
Private Sub StopTimer(sender As Object, e As CancelEventArgs)
_timer.Stop()
End Sub
'CSV読み込み
' strFilePath = (String)csvファイルのパス
'
Private Sub readCSVtoArray(ByVal strFilePath As String)
' Dim FSO As Object
' FSO = CreateObject("Scripting.FileSystemObject")
Dim ExtentionName As String
Dim numCallsign As Integer = 0
Try
ExtentionName = Path.GetExtension(strFilePath)
If ExtentionName = ".csv" Then
Using sr As New StreamReader(strFilePath, Encoding.GetEncoding("UTF-8"))
Do While (sr.Peek() > -1)
CallArray(numCallsign) = sr.ReadLine()
numCallsign += 1
Loop
sr.Close()
End Using
End If
Catch ex As IO.FileNotFoundException
'File not found exception
Catch ex As Exception
' do something here
End Try
End Sub
Private Sub CloseButton_Click(sender As Object, e As RoutedEventArgs) Handles CloseButton.Click
Me.Close()
End Sub
End Class
参考
- 文字コードを指定してテキストファイルを読み込む
- 【VB.NET】テキストファイルのデータを1行ずつ読み込むには?
- VBAでCSVファイルを二次元配列に格納する
- VB.NET 配列を検索して存在チェックを行う
- システムサウンドを再生する
最後まで読んでいただきありがとうございました。