HAMLOG プログラム開発室


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

Re: idx_search
659
2015/02/08(Sun) 07:52:07
JA2BQX 太田
おはようございます。
試しているのですが , DATE と DATE+TIME のレコード番号が取れません。
CALLS と CODE は上手く取れるのですが、先に提示したコードでの
search_date には search_date = "01/02/03" 形式で良いでしょうか?
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: idx_search
658
2015/02/07(Sat) 16:32:52
JA2BQX 太田
浜田さん、こんにちは。
早速の返信ありがとうございました。

> ゼロで大丈夫なはずですよ。
> ゼロを指定すれば、内部で Length(search_date) でサーチします。

分かりました。自宅に戻ったらテストして見ます。
今は山シャックでK1Nの追っかけ中です。
JAからは中央アメリカ、カリブは遠い....。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: idx_search
657
2015/02/07(Sat) 16:03:36
JG1MOU浜田
> idx_search 関数の使い方ですが下記の ? には幾つを指定すれば良いでしょうか?
> rec_no_1st = idx_search(THindx, search_date, ?)

ゼロで大丈夫なはずですよ。
ゼロを指定すれば、内部で Length(search_date) でサーチします。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

idx_search
656
2015/02/07(Sat) 13:53:27
JA2BQX 太田
こんにちは。 何時もお世話になります。

VB2010にて日付けを指定してレコード番号を取得しようとしています。
ソースの一部抜粋が下記です。

Declare Function MakeIndex Lib "Hamlog50.dll" (ByVal s As String, ByVal k As String, ByVal i As String) As int32
Declare Function idx_open Lib "Hamlog50.dll" (ByVal s As String, ByRef p As TIDXh) As Int32
Declare Sub idx_close Lib "Hamlog50.dll" (ByRef p As TIDXh)
Declare Function idx_search Lib "Hamlog50.dll" (ByRef p As TIDXh, ByVal s As String, ByVal l As Int32) As Int32

MakeIndex(hamlogpath, "DATE", "C:\Hamlog\Date.Ndx")
Ret = idx_open("C:\Hamlog\Date.Ndx", THindx)
search_date = "15/02/03"
rec_no_1st = idx_search(THindx, search_date, 8)
Call idx_close(THindx)


idx_search 関数の使い方ですが下記の ? には幾つを指定すれば良いでしょうか?
rec_no_1st = idx_search(THindx, search_date, ?)

Th524ap の Hamlog50.txt にて下記の様に記載されている len です。
search_date = "15/02/03" なら 8 で良いと思いますが、今は山シャックなのでテスト出来ない...。

コールサインの時には ゼロ で上手くサーチ出来ましたが。
 
MakeIndex(hamlogpath, "TIME", "C:\Hamlog\Time.Ndx") の時には
"12:34U" なら 6 で良いでしょうか。



引 数:idx
dBASE互換インデックスファイルの構造体

key
検索するキー。THW_seek()と同様。

len
検索するキーの長さを指定する。コールサインの文字列が全部一致するキーを検索する場合は6。


プリフィックスだけ一致の場合は3。ゼロの場合は、key が通常のヌルターミネート文字列であるとして検索する
 
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: データ新規登録イベント
655
2015/01/05(Mon) 23:47:29
JP7CZE 川辺
JA7UDE 大庭さん,

> 出島OM、太田OM、
>
> アイディアをありがとうございました。定期的なポーリングが必要ということと理解いたしました。
>
> 73
> 大庭
> JA7UDE

もう解決されたかもしれませんが,
私も同様にHamlog のデータが更新されたかどうかのチェックをおこない,更新されていたら交信データを取り込んで処理をするプログラムを作りました.

もともと,入力画面のQTHのデータが変化するのを検知して,変化したら取り込んで処理をさせる目的で,500msごとにコマンドの112でQTHのデータを取り込んでいる処理をしていました.

この入力画面で,QTHのデータが空白になったタイミングというのは,入力データがSAVEされたかキャンセルされたかのいずれかです.

そこで,QTHのデータが,有意な文字列から空白文字列に変化した時点で,初めて交信データの総数を読みに行くようにしました.

直接毎回交信データの総数を読みに行くよりは,Hamlogおよび自作ソフトの負担が軽くなるのではないかということです.

参考にはならないかもしれませんが.

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

Re: WM_COPYDATAについて
654
2014/12/19(Fri) 00:27:43
JP7CZE 川辺
> 今回の川辺さんのソースでは lpData As String * 3927 となっていた
> lpData As String に変えたらTHWから取れましたので。

私が定義していたのが,

Type COPYDATASTRUCT
dwData As Long
cbData As Long
lpData As String * 3927 ' void * のつもり
End Type

です(コメントは悪銭苦闘の残骸ですね...Hamadaさんのオリジナルの消し忘れ).

あちこちのページを参考に,色々弄くってみて,
期待する結果が出るように,力ずくで弄くり倒した結果,
なんとかちゃんと結果は得られたか,と思っていたのですが,
Hamadaさんからダメだしをくらいまして(^^;

Dim cds As COPYDATASTRUCT

Call CopyMemory(cds, ByVal lParam, Len(cds))

で取得していたのですが,問題は cds.lpDataの中身.

THWからはcbDataの長さの文字列が帰ってきて最後はOx00が入ってくることはわかっていたのですが,うまく取れないので,戻り値をダンプしてみたら,14バイトの最後が0で終わるデータが本来のlpDataの前にくっついていることがわかりました.

その後は,VBの場合,文字列がunicode で2byteですが,(cbData-1)+1 で切り出してもなぜかうまく取り出せませんでした???

なので強引に先頭の14byteを除去して,0x00までを取得するようにしたわけです.

変数等の内部構造も何も知らずに,Web上の先人たちの情報と結果だけを頼りに弄くっているだけなので....

それでも,みなさんのおかげで,正しくWM_COPYDATA の結果が取れるようになりました.

ほんとにありがとうございました.
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: WM_COPYDATAについて
653
2014/12/18(Thu) 22:14:05
JA2BQX 太田
浜田さん、こんばんは。
私はWindowProcは理解して使っているでは無くて、他からのコピーで
動かしている状態。


> VBの場合の lpData は、Stringでいいのでしょうか。
> Longがいいのでしょうか。

私のVB6のソースでは Long を使っています。
今回の川辺さんのソースでは lpData As String * 3927 となっていた
lpData As String に変えたらTHWから取れましたので。

VB2010では lpData As String で使っています。

.....動作などを理解しての使用では無いので動けば良い...と言うレベルです、Hi。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: WM_COPYDATAについて
652
2014/12/18(Thu) 21:51:03
JG1MOU浜田
VBの場合の lpData は、Stringでいいのでしょうか。
Longがいいのでしょうか。

私が書いたドキュメントでは、
 lpData As String ' void * のつもり
としましたが、本家では Long になってました。

http://support.microsoft.com/kb/176058/ja

ポインタが素直に使えない言語体系だと考えると、Longでアドレスを
直接渡した方がいいのかな、と考えました。

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

Re: WM_COPYDATAについて
651
2014/12/18(Thu) 21:12:09
JA2BQX 太田
こんばんは。
ソースを送っていただいたので試して見ました。
結論としては修正出来たようです。

> Type COPYDATASTRUCT
> dwData As Long
> cbData As Long
> lpData As String * 3927 ' void * のつもり
> End Type

lpData As String で良く、以下が余分だったかと。
[ * 3927 ' void * のつもり ] <== この部分は余分。

下記で切り出しをしていたのですが lpData As String にすれば
cds.lpData に THW からの情報が普通に取れていました。

For i = 1 To 3927
a = Mid(cds.lpData, i, 1)
      ...以下省略
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: WM_COPYDATAについて
650
2014/12/18(Thu) 20:55:52
JP7CZE 川辺
JA2BQX 太田さん,
さっそくのメールの返答ありがとうございました.

プログラムを拝見させて頂きまして,私の理解不足の点がわかりました.
COPYDATASTRUCT構造体の定義自体が違ってたのですね.
単なる文字列でいいのかと思っていましたが,
アドレスでの受け渡しなのですね.

Type COPYDATASTRUCT_02
dwData As Long
cbData As Long
lpData As Long
End Type

CopyMemory bytReceiveDataBuffer(0), ByVal .lpData, .cbData

で,受け取りをbyte配列にして,bytReceiveDataBuffer(0)で受け取りアドレスの先頭を指定できるというのは,
知りませんでした.
また,Byte配列をVisualBasicの文字列の内部形式であるunicodeに変換する StrConv関数 も知りませんでした.

ということで,ありがとうございました.
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop