HAMLOG プログラム開発室


新着表示
タイトル
記事No
投稿日
投稿者

データの表示方法をご教授ください
101
2009/07/16(Thu) 14:41:52
JA1RNR 吉田康太郎
HAMLOGから取得したデータの表示方法をご教授いただけませんでしょうか。

私は、Microsoft Visual Basic 2008 Express Editionを勉強中のプログラミング初心者で、Windows APIの知識はありません。(Win XP Home Edition SP3を使っています。)

HamlogMs.txtにある「Turbo HAMLOG/Win とのデータのやりとりについて」のVB6版用を参考にして下記のプログラムを書きました。
(WindowsフォームのForm1に TextBox(Multiline)を一つ Buttonを四つ その他に RadioButton と CheckBox を貼り付けています。)

ここでは、Button1クリックでHamlogからデータを取得してTextBox1に表示させ、
また、Button2クリックでHamlogへデータ転送をさせようしています。

あらかじめHamlogの入力ウインドウにデータを入れておき、このプログラムを実行し、Button1をクリックしても TextBox1に表示させようとしますが、何も表示できません。

HamlogMs.txtのご説明に、「ハムログ内部では、(cbData==0)または(lpData==NULL)で呼び出された場合、呼び出し側アプリのSendMessage()の第3引数のハンドルに文字列を返送する。」とありますが、私にはこの返送された文字列を表示する方法がわかりません。お教えいただければ幸いです。

なお、Button2をクリックしたときは、TextBox1のデータは正常にHamlogに転送できました。

********************************************************************************
以下はVisual Basic 2008用のソースプログラムです。

Public Class Form1
Public Structure COPYDATASTRUCT
Public dwData As Integer
Public cbData As Integer
Public lpData As String
End Structure
------------------------------------------------------------------------------
Public Const THW_ENTER = &H10000 ' データ送信後、ENTERキーを押したのと同じ
Public Const THW_FOCUS = &H20000 ' データ送信後、編集ボックスにフォーカス
Public Const THW_SAVEBOX_ON = &H40000 ' データ保存時、確認MessageBox表示あり
Public Const THW_SAVEBOX_OFF = &H80000 ' データ保存時、確認MessageBox表示なし
Public Const THW_APPLIHWND = &H100000 ' メインウインドウのハンドルを返す
Public Const WM_COPYDATA As Integer = &H4A
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal cName As String, ByVal wName As Integer) As Integer
Public Declare Auto Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Integer, ByVal wMsg As Integer, ByRef wParam As Integer, _
ByRef lParam As COPYDATASTRUCT) As Integer
Public Declare Function SetForegroundWindow Lib "user32" (ByVal wnd As Integer) As Integer

================================================================================
Hamlogデータを取得しようとしている部分です

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim Hwnd1, Hwnd2, cmmd As Integer
Dim cds As New COPYDATASTRUCT

Hwnd1 = FindWindow("TThwin", 0)

If Hwnd1 < 1 Then
Me.TextBox1.Text = "HAMLOGが起動していません"
Exit Sub
End If

cmmd = 115
cmmd = cmmd Or THW_APPLIHWND
cds.dwData = cmmd
cds.cbData = 0
cds.lpData = vbNullString

Hwnd2 = SendMessage(Hwnd1, WM_COPYDATA, Me.TextBox1.Handle, cds)

End Sub

ここまでがうまくいかない部分です
================================================================================
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

Dim cmmd As Integer
Dim Hwnd1 As Integer, Hwnd2 As Integer
Dim cds As New COPYDATASTRUCT
Dim cbuff As String
Dim WorkLeng, Scunt, Wcunt As Integer

If Me.RadioButton1.Checked = True Then
cmmd = 1
End If
If Me.RadioButton2.Checked = True Then
cmmd = 2
End If
If Me.RadioButton3.Checked = True Then
cmmd = 3
End If
If Me.RadioButton4.Checked = True Then
cmmd = 4
End If
If Me.RadioButton5.Checked = True Then
cmmd = 5
End If
If Me.RadioButton6.Checked = True Then
cmmd = 6
End If
If Me.RadioButton7.Checked = True Then
cmmd = 7
End If
If Me.RadioButton8.Checked = True Then
cmmd = 8
End If
If Me.RadioButton9.Checked = True Then
cmmd = 9
End If
If Me.RadioButton10.Checked = True Then
cmmd = 10
End If
If Me.RadioButton11.Checked = True Then
cmmd = 11
End If
If Me.RadioButton12.Checked = True Then
cmmd = 12
End If
If Me.RadioButton13.Checked = True Then
cmmd = 13
End If
If Me.RadioButton14.Checked = True Then
cmmd = 14
End If
If Me.RadioButton15.Checked = True Then
cmmd = 15
End If
If Me.RadioButton16.Checked = True Then
cmmd = 16
End If

If cmmd < 16 Then
If Me.TextBox1.Text = "" Then
MessageBox.Show("登録データが入力されていません。", "入力データ確認", MessageBoxButtons.OK, MessageBoxIcon.Information)
Exit Sub
End If
End If

Hwnd1 = FindWindow("TThwin", 0)

If Hwnd1 < 1 Then ' ハムログが起動していない
Me.TextBox1.Text = "HAMLOGが起動していません"
Exit Sub
End If


cbuff = TextBox1.Text


WorkLeng = Len(cbuff)

Scunt = 0
Wcunt = 0
For ch As Integer = 0 To WorkLeng - 1
If Asc(cbuff.Substring(ch, 1)) >= 0 And Asc(cbuff.Substring(ch, 1)) < 256 Then
Scunt = Scunt + 1
Else
Wcunt = Wcunt + 1
End If
Next

If cmmd <= 15 Then
cds.cbData = Scunt + (Wcunt * 2)
End If

cmmd = cmmd Or THW_FOCUS
cmmd = cmmd Or THW_ENTER
cds.dwData = cmmd
cds.lpData = (cbuff)

Hwnd2 = SendMessage(Hwnd1, WM_COPYDATA, Me.Handle, cds)

If Hwnd2 > 0 Then
SetForegroundWindow(Hwnd2)
If Me.CheckBox1.Checked = True Then
cmmd = 18
cmmd = cmmd Or THW_SAVEBOX_ON
cds.dwData = cmmd
SendMessage(Hwnd1, WM_COPYDATA, Me.Handle, cds)
End If
If Me.CheckBox2.Checked = True Then
cmmd = 18
cmmd = cmmd Or THW_SAVEBOX_OFF
cds.dwData = cmmd
SendMessage(Hwnd1, WM_COPYDATA, Me.Handle, cds)
End If
End If

End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

Me.Close()

End Sub

Public Sub New()

InitializeComponent()

Me.Text = "Tes Program"
Me.Label1.Text = "データ"
Me.GroupBox1.Text = "処理を選択する"

Me.RadioButton1.Text = "CallSign"
Me.RadioButton2.Text = "QSO Date"
Me.RadioButton3.Text = "QSO Time"
Me.RadioButton4.Text = "His RST"
Me.RadioButton5.Text = "My RST"
Me.RadioButton6.Text = "Freqency(MHz)"
Me.RadioButton7.Text = "MODE"
Me.RadioButton8.Text = "JCC/JCG"
Me.RadioButton9.Text = "Grid"
Me.RadioButton10.Text = "QSL Info"
Me.RadioButton11.Text = "Name"
Me.RadioButton12.Text = "QTH"
Me.RadioButton13.Text = "Remarks1"
Me.RadioButton14.Text = "Remarks2"
Me.RadioButton15.Text = "全部のデータを送る"
Me.RadioButton16.Text = "入力ウインドウを消去する"

Me.Button1.Text = "HAMLOGから取得"
Me.Button2.Text = "HAMLOGへ送る"
Me.Button3.Text = "閉じる"
Me.Button4.Text = "データクリア"

Me.CheckBox1.Text = "登録確認画面を表示する"
Me.CheckBox2.Text = "登録確認画面を表示せず登録する"

Me.RadioButton15.Checked = True

End Sub

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

Me.TextBox1.Clear()
If Me.RadioButton15.Checked = True Then
Me.TextBox1.Text = ControlChars.NewLine
End If
Me.TextBox1.Focus()
End Sub

Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged

If Me.CheckBox1.Checked = True Then
Me.CheckBox2.Checked = False
End If

End Sub

Private Sub CheckBox2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox2.CheckedChanged

If Me.CheckBox2.Checked = True Then
Me.CheckBox1.Checked = False
End If

End Sub

End Class

*******************************************************************************
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: コマンド115
99
2009/06/23(Tue) 16:35:32
JA2BQX 太田
済みません、タイプミスで検索してしまったようです。 失礼しました。

> ところで、180103は何かの間違いだと思います。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: コマンド115
98
2009/06/23(Tue) 15:52:32
JA2GRC/3 大塚
JA2BQX 太田さん

世の中、色々、立派な考え方の言語もたくさんありますが、
いくら、崇高な言語も慣れ親しんだものには適いませんね。

ところで、180103は何かの間違いだと思います。

私の常置場所は愛知県東海市です。今は、お袋がまだ健在ですが、既に
彼の地を離れて40年弱になります。
仕事の関係で、1エリアに行ったり、また戻ったりで、現在は大阪府
枚方市です。既にリタイアの身なので、もう動くことはないと思うので
固定局を申請しても良いのですが、慣れ親しんだコールをなかなか
手放せないでいます。

PS:ホームページ覗かせていただきました。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: コマンド115
97
2009/06/23(Tue) 14:00:32
JA2BQX 太田
Visual Basic 2008 Express Edition に移行を考えて事もありましたが
慣れ親しんだVB6の方が楽なので、そのままでいます。

総務省の「無線局免許状情報」で見ると180103にお住まいのようですね。

私は11年ほど前まで50年以上も旧1804に住んでいました。
現在は1815です。ローカルですので今後ともよろしく。

しかし/3が付いているのでQSYされたのでしょうか。
7月18、19日に行われる「関西アマチュア無線フェスティバル 2009」に今年も出かけます。


ホームページに幾つかのHamlogとzLog関連のソフトを
公開しています。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: コマンド115
96
2009/06/23(Tue) 12:25:24
JA2GRC/3 大塚
JA2BQX 太田さん

詳しい説明、ありがとうございます。
概ね理解できました。

昔のHamlogは移動の欄が分かれていたので、多分改訂されたのだろう
なと思っていました。

ところで、Visual Basic 2008 Express Edition は無料なのに、なか
なかすばらしいです。今年の2月頃からプログラミングを始めたのです
が、4本ほど作って、ただいま完全にプログラミングの泥沼に嵌ってい
ます。

それから、Th505apiの仕様書の存在は知りませんでした。早速、DLし
てみました。素晴らしい資料ですね。これから、じっくり読み込んで
勉強してみます。

ざっと読んだところ、HamlogMs.txtの207,208行に明示されていますね。
だだ、15行となっていますが。これは、まだ、DXの項目追加の改訂が
されていないんでしょうね。
------------------
 115 = コールサインからRemarks2までが、それぞれ改行された15行のテキスト
    として得ることができる。1行目は空改行。
------------------

いずれにしましても、まずは、お礼まで。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: コマンド115
95
2009/06/23(Tue) 08:43:26
JA2BQX 太田
こんにちは、初めまして。
正確には浜田さんからフォローがあると思いますが、

> 浜田さんのホームページにあるWM_COPYDATAの説明、および、sample_wm_copydataを参考に、Hamlogとのデータ交換プログラムをVisual Basic 2008 Express Edition で作っています。

私はいまだにVB6です。 

> コマンド115で読み出されるデータについての質問です。
> 以下の部分が、浜田さんのホームページにあるWM_COPYDATAの説明と違っていますが、これで正しいでしょうか?

「説明」とは http://homepage2.nifty.com/mou/copydata.html の
下記の部分でしょうか。

--------------------  引用開始  ----------------------------
* COPYDATASTRUCT 構造体メンバー dwData について

●コマンドを数値で指定し、Turbo HAMLOG/Winの入力ウインドウに文字列を送る。
  0 = コールサイン
  1 = 移動エリア
  2 = 日付
    ・・0~14まで、Turbo HAMLOG/Winの入力欄の並びのとおり・・
 12 = QTH
 13 = Remarks1
 14 = Remarks2
 15 = コールサインからRemarks2までが、それぞれ改行された15行のテキスト
    ただし、改行のみのデータは転送されない。
 16 = ハムログの入力バッファをクリアする。ハムログ内部では、SendMessage()の
    三つ目のパラメータを引数にして、SetForegroundWindow()を呼び出す。
------------------  引用終わり  ------------------------------------


> 読み込んだデータを表示した画像を添付します。

貴局が読み込んだデータで正しいです。
Hamlogのver4.*の時には移動の場合に / の左右で
データエリアが別でしたが現在は1ケにまとめられています。

  0 = コールサイン ===> 空白に変更。
  1 = 移動エリア ===> コールサインに変更。


ですから最初に空白行が来ています。
Hamlogのコールサインエリアに JA2BQX/3 などとして見ると分かります。

Th505api の中の THDLL2VB.txt の
Sub SetThBuffer(Th As TThLog, ByVal s As String, ByVal n As Integer)
も参照されて下さい。



0,1 = Callsignをコピーする場合
                  ....途中を省略


16 = DXフラグ


ミスがあれば訂正をお願いします。 > ALL
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

コマンド115
94
2009/06/22(Mon) 23:59:59
JA2GRC/3 大塚
こんにちは、初めまして。
浜田さんのホームページにあるWM_COPYDATAの説明、および、sample_wm_copydataを参考に、Hamlogとのデータ交換プログラムをVisual Basic 2008 Express Edition で作っています。
コマンド115で読み出されるデータについての質問です。
以下の部分が、浜田さんのホームページにあるWM_COPYDATAの説明と違っていますが、これで正しいでしょうか?
1行目が空白
2行目がコールサイン
3行目から15行目までは説明通り
16行目にDXのチェックと思われるデータが追加
なお、コマンド15でHamlogへ転送する時もこの形式に合わせて送出すると正しく転送されるようです。
読み込んだデータを表示した画像を添付します。
pagetop
タイトル
記事No
投稿日
投稿者

Re: 7MHz 拡張バンド対応
93
2009/05/20(Wed) 23:23:40
JO1SIM 出島
長野様

貴重な情報ありがとうございます。
USB-IOもUSBIF4CWと同じ原理なんですね。
加えて、Windows7の64bit版での情報もありがとうございます。

安心して手を出せそうです!!(笑)

ありがとうございました。

> USB-IOは、Windows標準のHIDデバイスとして扱われると思います。
>
> 私もUSB-IOの仲間のUSB-Anを使っています。
> 試しにWindows7 RC64bit版で、USB-AnとXP32bit用に自作したプログラムを
> 走らせてみましたが、問題なく動作するようです。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: 7MHz 拡張バンド対応
92
2009/05/20(Wed) 21:05:37
je6lao長野
USB-IOは、Windows標準のHIDデバイスとして扱われると思います。

私もUSB-IOの仲間のUSB-Anを使っています。
試しにWindows7 RC64bit版で、USB-AnとXP32bit用に自作したプログラムを
走らせてみましたが、問題なく動作するようです。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: 7MHz 拡張バンド対応
91
2009/05/19(Tue) 23:57:49
JO1SIM 出島
Houさん
情報ありがとうございます。

タイマーイベントでWM_COPYDATAで読み取っているんですね。
コントロールソフトの存在を意識せずに利用できそうですね。
すばらしいです。

USB-IOですね。知りませんでした。。
USB内蔵マイコンも大いに興味があるのですが、私はメインのPCでは64bitOSを使っているので、ドライバの関係で手を出せないかもしれませんね。

マイコンでも、USBIF4CWみたいに標準デバイスとして認識させられるものは運よく使えています。

USB-IOもこの手のデバイスだとよいのですが!


> > ・ハムログから周波数情報をもらう方法
> WM_COPYDATAを使ってソフト間でデータを転送しております。
> ハムログとリンク出来るソフトはほとんどこの方式ではないかな??
> タイマーコマンドで変更の都度データ伝送しております。
>
> >  (リアルタイム?ポーリング?)
> > ・コントロールボックスの制御方法
> コントロールボックスの制御は、USB-IOという1500円のキットでコントロールボックスのリレー制御し、さらにアンテナ直下のリレーを制御する方式としております。1KWに耐えれるよう大きめなリレーを使用しております。
>
> >  (COMポート経由??)
> 上記のとおりUSB経由です。
> >
> > よろしければ教えてください。
> jarl.com にもう少し詳しい内容をアップいたしました。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop