一括表示

hdb append 時の DX Falg 投稿者:JA2BQX 太田  《URL》  

こんばんは。
JT65 の HB9HQX 版のソース修正で直接 Hamlog へQSOデータの転送する
基本機能のテストは完了しました。
過去ログにも HAMLOG50.txt にも説明は無いように思うので質問させて下さい。
Free Pascal で、

sd := THW_append(Th, IsQSOdata, mes); を使用時に

StrPCopy(Th.QSO.Calls,'JA2BQX'); で各項目をセットして Hamlog.hdb に直接書き込む際に
DX Flag を 0 や 8 にするにはどうしたら良いでしょうか?

[FLAG 2 DXの場合8〜10 数値で保存] とありますが
StrPCopy(Th.QSO.Flag,'8'); とかでは書き込まれないようです。

2017/08/03(Thu) 20:10:19  [No.795]


Re: hdb append 時の DX Falg 投稿者:JG1MOU浜田 

> [FLAG 2 DXの場合8〜10 数値で保存] とありますが
> StrPCopy(Th.QSO.Flag,'8'); とかでは書き込まれないようです。

Th.QSO.Flag := 8;

です。

2017/08/03(Thu) 21:38:33  [No.796]


Re: hdb append 時の DX Falg 投稿者:JA2BQX 太田  《URL》  

浜田さん、ありがとうございます。

> Th.QSO.Flag := 8;

まだつまずいています。

StrPCopy(Th.QSO.Flag,8); でも StrPCopy(Th.QSO.Flag:=8); でもエラ−。

Hwnd2 := SendMessage(Hwnd1, WM_COPYDATA, Form1.Handle, LPARAM(@cds));
で送る時はどう書いたら良いですか。
ttmp:= ttmp + '8' + #$0D; //転送されない。

TH.QSO. として出てくる項目リストには var Flag1 : Word があります。

2017/08/03(Thu) 21:59:17  [No.797]


Re: hdb append 時の DX Falg 投稿者:JA2BQX 太田 

こんにちは。
Hwnd2 := SendMessage(Hwnd1, WM_COPYDATA, Form1.Handle, LPARAM(@cds));  の方は

.... callsign から順にセットしてから
ttmp:= ttmp + thw_rkm2 + #$0D;
ttmp:= ttmp + '' + #$0D;
ttmp:= ttmp + '8' + #$0D; で出来ました。

2017/08/04(Fri) 05:27:44  [No.798]


Re: hdb append 時の DX Falg 投稿者:JG1MOU 浜田 

> 浜田さん、ありがとうございます。
>
> > Th.QSO.Flag := 8;
>
> まだつまずいています。
>
> StrPCopy(Th.QSO.Flag,8); でも StrPCopy(Th.QSO.Flag:=8); でもエラ−。

え? 太田さんらしくない勘違いですね。
文字列ではなく数値の代入です。

Flag は、16ビットの整数です。文字列ではありません。

Th.QSO.Flag := 8; // Pascal
Th.QSO.Flag = 8  ' VB
Th->QSO.Flag = 8; // C言語

2017/08/04(Fri) 07:07:06  [No.799]


Re: hdb append 時の DX Falg 投稿者:JA2BQX 太田 

浜田さん、度々ありがとうございます。出来ました。

> 文字列ではなく数値の代入です。

StrPcopy() にこだわっていました。文字列では無いのでStrPcopy() は使えない、 Hi

> Th.QSO.Flag := 8; // Pascal <== これだとエラーになる。

Th.QSO.Flag1: = 8;  <== これだとエラーにならない。DXフラグにレ点が付く。 OK

StrPCopy(Th.QSO.Calls,thw_call); の書式にばかりこだわっていましたが
Th.QSO.Calls:=thw_call; でもテストしてOKでした。
どちらでも良いのでしょうが何か差が出るでしょうか?


Pascal 講座みたくなってしまいましたが、もう一つ教えて下さい。

function HamlogOpen(Func: Pointer; var Th: TThLog; const fname: PChar; const isComp: Integer): Integer;

Hamlog.hdb のパスは PChar で与えるとなっています。
そこで hamlog_hdb_path:= 'C:\Hamlog\Hamlog.hdb'; の時に

var
buffs: array [0..255] of Char;

Begin
StrPCopy(buffs,hamlog_hdb_path);

sd := HamlogOpen(nil, Th, @buffs[0], 0); ...としても転送されません。

Hamlog.hdb のパスを直接 sd := HamlogOpen(nil,Th, 'C:\Hamlog\Hamlog.hdb', 0); とするのでは無くて
変数で指定するにはどう書けば良いのでしょうか?

2017/08/04(Fri) 08:57:53  [No.800]


Re: hdb append 時の DX Falg 投稿者:je6lao 

こんにちは、長野です。

StrPcopy(fname: PChar, hdb_file: string)

なのでシンプルにファイル名の変数をstringで宣言し
そこにファイル名を代入すればいいと思います。
ポインタを使う必要があるのでしょうか。

var
hdb_file: string;
fname: PChar;

Begin
hdb_file := 'c:\hamlog\hamlog.hdb';

StrPCopy(fname, hdb_file);

sd := HamlogOpen(nil, Th, fname, 0);

end;

2017/08/04(Fri) 15:08:15  [No.801]


Re: hdb append 時の DX Falg 投稿者:JA2BQX 太田 

長野さん、こんにちは。ありがとうございます。

> StrPcopy(fname: PChar, hdb_file: string)

ここでコンパイルは通るけど実行時にエラーで落ちます。

例外クラス External.SIGSEGV を発生させました...。

2017/08/04(Fri) 17:51:20  [No.802]


Re: hdb append 時の DX Falg 投稿者:je6lao 

こんばんは。

GetMem(), FreeMem() を追加して文字数に応じたメモリを確保する必要があるようです。どうでしょうか。

var
hd_file: string;
fname: PChar;

begin
hd_file := 'c:\hamlog\hamlog.hdb';

GetMem(fname, length(hd_file) + 1);

StrPCopy(fname, hd_file);

sd := HamlogOpen(nil, Th, fname, 0);

FreeMem(fname);

end;

2017/08/04(Fri) 22:14:24  [No.803]


Re: hdb append 時の DX Falg 投稿者:JA2BQX 太田 

長野さん、ありがとうございます。 おかげさまでできました。

> GetMem(), FreeMem() を追加して文字数に応じたメモリを確保する必要があるようです。どうでしょうか。

そのようですね、実際には hdb のパスを ini にファイルから hamlog_hdb_path に取っているので
下記の様にして上手く行きました。

GetMem(fname, length(hamlog_hdb_path) + 1);
StrPCopy(fname, hamlog_hdb_path);
sd := HamlogOpen(nil, Th, fname, 0);

2017/08/05(Sat) 07:13:08  [No.804]


Re: hdb append 時の DX Falg 投稿者:je6lao 

すでにうまくいっているよう時に、前に戻りますが、

sd := HamlogOpen(nil, Th, buffs, 0);

でいいのではないでしょうか。
ただし、buffsが255文字なのでこれを超えるファイル名になると
エラーが出ると思います。

> Pascal 講座みたくなってしまいましたが、もう一つ教えて下さい。
>
> function HamlogOpen(Func: Pointer; var Th: TThLog; const fname: PChar; const isComp: Integer): Integer;
>
> Hamlog.hdb のパスは PChar で与えるとなっています。
> そこで hamlog_hdb_path:= 'C:\Hamlog\Hamlog.hdb'; の時に
>
> var
> buffs: array [0..255] of Char;
>
> Begin
> StrPCopy(buffs,hamlog_hdb_path);
>
> sd := HamlogOpen(nil, Th, @buffs[0], 0); ...としても転送されません。
>
> Hamlog.hdb のパスを直接 sd := HamlogOpen(nil,Th, 'C:\Hamlog\Hamlog.hdb', 0); とするのでは無くて
> 変数で指定するにはどう書けば良いのでしょうか?

2017/08/05(Sat) 08:05:47  [No.805]


Re: hdb append 時の DX Falg 投稿者:JA2BQX 太田 

こんにちは。 ありがとうございます。

> sd := HamlogOpen(nil, Th, buffs, 0);
> でいいのではないでしょうか。

はい、これでも行けました。

> ただし、buffsが255文字なのでこれを超えるファイル名になると
> エラーが出ると思います。

倍の 511 にしてもOKのようなので buffs を使う時は増やしておきます。

昨日の問題が解決して一安心ですが、まだ課題がありまして、別スレッドにします。

2017/08/05(Sat) 08:34:00  [No.806]


Re: hdb append 時の DX Falg 投稿者:je6lao 

太田さん、Delphiはどのバージョンをお使いですか?

IDEでTh.と打った時点で次の選択肢の一覧が表示されませんか。
次にQを押すと一覧がQsoのみになりそれを選択し .を押すとまた一覧が表示されます。そこにFlag1があります。構造体の中にFlagはありませんので、エラーになると思います。

構造体がすでに宣言されていれば、そのツリーにしたがって入力補助の選択肢が出るのですが。

ちなみにDelphi6 personal を使っています。


> > 文字列ではなく数値の代入です。
>
> StrPcopy() にこだわっていました。文字列では無いのでStrPcopy() は使えない、 Hi
>
> > Th.QSO.Flag := 8; // Pascal <== これだとエラーになる。
>
> Th.QSO.Flag1: = 8;  <== これだとエラーにならない。DXフラグにレ点が付く。 OK
>
> StrPCopy(Th.QSO.Calls,thw_call); の書式にばかりこだわっていましたが
> Th.QSO.Calls:=thw_call; でもテストしてOKでした。
> どちらでも良いのでしょうが何か差が出るでしょうか?

thw_callの型は何でしょうか? 
> Th.QSO.Calls:=thw_call; でもテストしてOKでした。

こちらではNGでした。
thw_callがstringでもarray[0..20] of charでもNGでした。
stringにして、StrPCopyはOKでした。
なので、StrPCopyをお勧めします。

var
a1, a2: array[0..8] of char;
begin

a1 := a2;

end;

たしか、これはOKでした。
a1とa2を同時に宣言するとOKです。

型のキャストは本当に面倒ですね。

2017/08/05(Sat) 08:38:38  [No.807]


Re: hdb append 時の DX Falg 投稿者:JA2BQX 太田 

長野さん、こんにちは。色々とありがとうございます。

> 太田さん、Delphiはどのバージョンをお使いですか?

JT65-HF-HB9HQX-Edition のソースを自分なりに修正したいだけが目的なくで
JT65-HF-HB9HQX-Edition のソース関係に説明されていた Lazarus-1.6.4 ( Free Pascal ) です。

https://sourceforge.net/projects/jt65hfhb9hqxedi/files/ のページの中の [ Lazarus Project ]
しかしこの手順でインストールをしたのですが(数回やりなおした)結構面倒で...。
あれこれWebを見て回っているうちに下記にたどりつきました。こちらは非常に楽でした。
【32bit版】 」[ タイプ−2 ] を使っています。
http://lazpas.e-hiyori.org/wp/lazarus-windows

> IDEでTh.と打った時点で次の選択肢の一覧が表示されませんか。
> 次にQを押すと一覧がQsoのみになりそれを選択し .を押すとまた一覧が表示されます。そこにFlag1があります。構造体の中にFlagはありませんので、エラーになると思います。

はい、そうですね、だんだんと分る様になって来て Flag1 を使っています。


> thw_callの型は何でしょうか? 

String です。

昔にCも少しかじったのですがデータ型、ポインター辺りで挫折して VB ばかりやって来ました。
今回は目的があっての事なのですが試行錯誤の繰り返しで時間ばかりが掛かっています。

JT65 関係のソフトは Hamlog に直接QSOデータを転送する機能がありません。
JAの方が作成した JT_Linker のみと思います。

ここ2週間程前から JTDX , WSJT-X 用には JT65toThw.exe を VB2010 で作成して
JA1の方にテストしてもらっています。

JT65-HF-HB9HQX-Edition はQSOデータが SQLite なので苦労して読める用にして自宅では使えるのですがJA1の別の方のテストでは SQLite が読めていないそうです。

そこでソースは OpenSource で修正・コンパイルツールも入手出来たので
直接 Hamlog にQSOデータ転送をする事にしたのです。
ほぼ初期の仕様としては出来たのでJA1の方にテスト依頼をします。

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

2017/08/05(Sat) 14:54:58  [No.811]


Re: hdb append 時の DX Falg 投稿者:je6lao 

太田さん、ご紹介をありがとうございます。

Freeでもなかなか使えそうですね。
いまDelphiもFreeがあるのですが、このような開発環境に対応するためなのかもしれませんね。

2017/08/06(Sun) 08:57:00  [No.814]