一括表示

dbf_rcount 投稿者:JA2BQX 太田  《URL》  

こんにちは。
昨日よりVB2008を勉強中です。
WndProc を使用しての Hamlogよりのデータ取得は出来る様になりました。

次にHDBに直接アクセスするテストをしていますが入り口でつまずいています。
下記のコードで ver = GetThdllVersion() に関してはVB6と同じ値が取れました。

C:\Windows\System32\Hamlog.dll
タイムスタンプ 値
2008-06-19 331776
2009-05-23 332544

しかしレコード件数の取得がダメです。
sd = dbf_open("C:\HAMLOG\Hamlog.hdb", Th)
recno = dbf_rcount(Th)
...では ゼロ件と表示されます。


sd = Vdbf_open("C:\HAMLOG\Hamlog.hdb", log)
recno = Vdbf_rcount(log)
...ではマイナスになったり極端に大きな数値になったりでダメです。

どなたか上手く動作しておられたらご指導お願いします。
(図表モードでもインデントが取れなくて見難いですね)



Imports System
Imports System.Windows.Forms
Imports System.Runtime.InteropServices

Public Class Form1

Structure TDBFh
<VBFixedArray(4)> Dim lupdt() As Byte
Dim Rcount As Integer
Dim hsize As Integer
Dim recnm As Integer
Dim fHdl As Integer
<VBFixedArray(260)> Dim Temp() As Byte
Public Sub Initialize()
ReDim lupdt(4)
ReDim Temp(260)
End Sub
End Structure


Structure TThLog
<VBFixedArray(3927)> Dim Qso() As Byte
Public Sub Initialize()
ReDim Qso(3927)
End Sub
End Structure

<DllImport("Hamlog50.dll")> _
Private Shared Function GetThdllVersion() As Integer
End Function


<DllImport("Hamlog50.dll")> _
Private Shared Function dbf_open(ByRef s As String, ByRef d As TDBFh) As Integer 'ByValをByRefに変更
End Function

<DllImport("Hamlog50.dll")> _
Private Shared Sub dbf_close(ByRef d As TDBFh)
End Sub

<DllImport("Hamlog50.dll")> _
Private Shared Function dbf_rcount(ByRef d As TDBFh) As Integer
End Function


<DllImport("Thdll2Vb.dll")> _
Private Shared Function Vdbf_open(ByRef s As String, ByRef d As TThLog) As Integer
End Function

<DllImport("Thdll2Vb.dll")> _
Private Shared Sub Vdbf_close(ByRef d As TThLog)
End Sub

<DllImport("Thdll2Vb.dll")> _
Private Shared Function Vdbf_rcount(ByRef d As TThLog) As Integer
End Function

Public log As TThLog
Public Th As TDBFh

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

Dim ver As Int32
Dim sd As Int32
Dim recno As Int32

ver = GetThdllVersion()
Label1.Text = ver

'dbf_close(Th)

'sd = dbf_open("C:\HAMLOG\Hamlog.hdb", Th)
'recno = dbf_rcount(Th)
'dbf_close(Th)

sd = Vdbf_open("C:\HAMLOG\Hamlog.hdb", log)
recno = Vdbf_rcount(log)
Vdbf_close(log)

Label2.Text = recno

End Sub


End Class

2009/07/21(Tue) 17:17:45  [No.110]


Re: dbf_rcount 投稿者:JO1SIM 出島 

太田様
JO1SIM出島です。
私はVBではなく、VC(しかもMFC)派なので詳しくはありませんが・・・。

dbf_openやVdbf_openの返す値はどうでしょうか?
正常にオープンされていれば SUCCESS(==0) が帰ってきていると
おもうのですが、いかがでしょうか?

C++ならば、Pathの文字列の中の \ は \\じゃないとダメとか…なんですが!


> こんにちは。
> 昨日よりVB2008を勉強中です。
> WndProc を使用しての Hamlogよりのデータ取得は出来る様になりました。
>
> 次にHDBに直接アクセスするテストをしていますが入り口でつまずいています。
> 下記のコードで ver = GetThdllVersion() に関してはVB6と同じ値が取れました。
>
> C:\Windows\System32\Hamlog.dll
> タイムスタンプ 値
> 2008-06-19 331776
> 2009-05-23 332544
>
> しかしレコード件数の取得がダメです。
> sd = dbf_open("C:\HAMLOG\Hamlog.hdb", Th)
> recno = dbf_rcount(Th)
> ...では ゼロ件と表示されます。
>
>
> sd = Vdbf_open("C:\HAMLOG\Hamlog.hdb", log)
> recno = Vdbf_rcount(log)
> ...ではマイナスになったり極端に大きな数値になったりでダメです。
>
> どなたか上手く動作しておられたらご指導お願いします。
> (図表モードでもインデントが取れなくて見難いですね)

2009/07/21(Tue) 22:05:55  [No.111]


Re: dbf_rcount 投稿者:JA2BQX 太田  《URL》  

JO1SIM出島さん、ありがとうございます。

> dbf_openやVdbf_openの返す値はどうでしょうか?
> 正常にオープンされていれば SUCCESS(==0) が帰ってきていると
> おもうのですが、いかがでしょうか?

上手くオープンしていません。 返値が5です。

> C++ならば、Pathの文字列の中の \ は \\じゃないとダメとか…なんですが!

下記のサンプルを見ると \ や / を使っていたりするので
大丈夫と思います。

http://hanatyan.sakura.ne.jp/dotnet/index.html

2009/07/22(Wed) 06:46:30  [No.113]


Re: dbf_rcount 投稿者:jr1cpb/稲村 

こんばんは、
やってみましたらうまくレコード件数取得できているようです。
構造体の定義を下記のようにしています。

Structure TThLog
<VBFixedArray(3927), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=3927)> Dim Qso() As Byte
Public Sub Initialize()
ReDim Qso(3927)
End Sub
End Structure
Structure TDBFh
<VBFixedArray(4), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=4)> Dim lupdt() As Byte
Dim Rcount As Integer
Dim hsize As Integer
Dim recnm As Integer
Dim fHdl As Integer
<VBFixedArray(260), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=260)> Dim Temp() As Byte
Public Sub Initialize()
ReDim lupdt(4)
ReDim Temp(260)
End Sub
End Structure

2009/07/21(Tue) 23:22:16  [No.112]


Re: dbf_rcount 投稿者:JA2BQX 太田  《URL》  

jr1cpb 稲村さん、ありがとうございます。

> やってみましたらうまくレコード件数取得できているようです。
> 構造体の定義を下記のようにしています。

今回、ご提示いただいた宣言に近いものはWeb検索で見たりもしましたが
完全なコードに書き換えが出来ないでいました。
まだHDBのオープンに失敗しているようです。
他にコードミスなど、お気づきでしたら教えて下さい。

2009/07/22(Wed) 06:50:23  [No.114]


Re: dbf_rcount 投稿者:jr1cpb/稲村 

おはようございます。
私がテストしたコードをそのまま書きます。
Formを1つ、そこにButtonを一つ貼り付けます。
オープン/クローズ、レコード数取得、hdbからの読み出し(詳細は書きませんでしたが)
もできています。

Public Class Form1
Declare Function dbf_open Lib "Hamlog50.dll" (ByVal s As String, ByRef d As TDBFh) As Integer
Declare Sub dbf_close Lib "Hamlog50.dll" (ByRef d As TDBFh)
Declare Function dbf_rcount Lib "Hamlog50.dll" (ByRef d As TDBFh) As Integer
Declare Function Vdbf_open Lib "Thdll2Vb.dll" (ByVal s As String, ByRef d As TThLog) As Integer
Declare Sub Vdbf_close Lib "Thdll2Vb.dll" (ByRef d As TThLog)
Declare Function Vdbf_rcount Lib "Thdll2Vb.dll" (ByRef d As TThLog) As Integer
Declare Function HamlogOpen Lib "Hamlog50.dll" (ByVal h As Integer, ByRef th As TThLog, ByVal f As String, ByVal v As Integer) As Integer
Declare Sub HamlogClose Lib "Hamlog50.dll" (ByRef th As TThLog, ByVal i As Integer)
Declare Function ThwString Lib "Thdll2Vb.dll" (ByVal s As String, ByRef th As TThLog, ByVal n As Short) As Integer
Declare Function THW_read Lib "Hamlog50.dll" (ByRef h As TThLog, ByVal n As Integer, ByVal i As Integer) As Integer

Structure TDBFh
<VBFixedArray(4), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=4)> Dim lupdt() As Byte
Dim Rcount As Integer
Dim hsize As Integer
Dim recnm As Integer
Dim fHdl As Integer
<VBFixedArray(260), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=260)> Dim Temp() As Byte
Public Sub Initialize()
ReDim lupdt(4)
ReDim Temp(260)
End Sub
End Structure

Structure TThLog
<VBFixedArray(3927), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=3927)> Dim Qso() As Byte ' Ver5.03で変更
Public Sub Initialize()
ReDim Qso(3927)
End Sub
End Structure

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim sd As Integer
Dim recno As Integer
Dim tdbfh As TDBFh
Dim th As TThLog
Dim f As String

f = "C:\Hamlog.hdb"
sd = dbf_open(f, tdbfh)
recno = dbf_rcount(tdbfh)
dbf_close(tdbfh)
sd = Vdbf_open(f, th)
recno = Vdbf_rcount(th)
Vdbf_close(th)
sd = HamlogOpen(0, th, f, 0)
Call HamlogClose(th, 1)
End Sub
End Class

2009/07/22(Wed) 08:20:51  [No.115]


Re: dbf_rcount 投稿者:JA2BQX 太田  《URL》  

ありがとうございました。
お陰様でレコード件数表示ができました。

> 私がテストしたコードをそのまま書きます。

こちらでのテストではそのままのコピー・ペーストでは幾つかのエラーがでましたので

> Dim tdbfh As TDBFh を
    Dim th As TDBFh に書き換え。


> Dim th As TThLog を
Dim log As TThLog に書き換え。

私のコードで何が悪かったのかは後で考えて見ます。
まずは Hamlog.hdb を直接読み書き出来る入り口にたどり着きました。
HDBの全てをCSVに書き出しとか、色々試して見ます。
分からない事があったらまた書き込みさせて頂きますので
今後ともよろしくお願いします。

MNI TNX and FB DX   CUL

2009/07/22(Wed) 08:44:01  [No.116]


Re: dbf_rcount 投稿者:JA2BQX 太田  《URL》  

HDBの全てをCSVに書き出しも出来るようになりました。

2009/07/22(Wed) 10:04:21  [No.117]


Re: dbf_rcount 投稿者:jr1cpb/稲村 

おめでとうございます!
当局は、HAMLOG50.BASを.NET用に手を加えました。
でもまだ全てのインターフェースの動作確認はしていません。Hi

2009/07/22(Wed) 12:38:08  [No.118]


Re: dbf_rcount 投稿者:JO1SIM 出島  《URL》  

JA2BQX 太田様

JO1SIM出島です。
うまくいったようですね!

ちなみに私はHamlogOpen関数を使っております。
APIの説明書で説明があるとおり、HamlogOpenで開き、THW_???()でレコードを読みこんでいます。

> HDBの全てをCSVに書き出しも出来るようになりました。

2009/07/22(Wed) 12:40:27  [No.119]


Re: dbf_rcount 投稿者:JA2BQX 太田  《URL》  

JO1SIM出島さん、こんにちは。
jr1cpb/稲村さんのコードで非常に助かりました。

> うまくいったようですね!

お陰様でどうにか入り口にたどり着けました。

> ちなみに私はHamlogOpen関数を使っております。
> APIの説明書で説明があるとおり、HamlogOpenで開き、THW_???()でレコードを読みこんでいます。

はい、CSVにするには同じ関数を使っています。
現在は idx_open() HamlogOpen() idx_search() idx_next() を使い
特定コールサインや特定CodeとのQSOデータを抜き出す..に
取りかかっています。

VB6で公開してある THW_QSOs.exe をVB.netに置き換える
形でVB.netの勉強といったところです。
諸々の処理(データの重複削除、ソートなど)の書き換えをして
Tipsをため込んでおく必要がありますので。

2009/07/22(Wed) 13:12:27  [No.120]