前からの続きで皆様のおかげでかなり進む事ができるようになりました。
またもや今回困ってしまいまして。
前と同じツールを引き続き作成しているのですが相手に自分のデータ(ホスト名)を送信し、相
手がそれを受け取って相手の方にあるリストボックスに表示させると言うもの。
なのですがホスト名を相手に送るボタンを何度押しても押した回数分リストボックスに表示され
てしまいます。
何度押してもユーザー名は一つのみ表示させたいのですが、中々うまくいきません。
どの処理の時に一度しか表示させない処理を書けばいいのかわかる方いらっしゃいましたら、ご
教授お願いします。
今回使用しているOSはWINDOWSXPで言語はVC++.NET、当然MFCは未使用です。
> どの処理の時に一度しか表示させない処理を書けばいいのかわかる方いらっしゃいましたら、
ご
> 教授お願いします。
普通に考えれば、リストボックスに表示させている部分で、
既に表示済みか確認してから、リストボックスに追加するようにすればよいのでは?
KING・王さん早速ご返事ありがとうございます。
そうなんですよね、普通に考えて表示済みかそうでないかをわからせる為に印(!マーク)を
つけて表示させて認識させてたりもしたんですけど何度押しても押した回数分表示させられてし
まうんですよ・・・。
> 前からの続きで
どれ?リンク張ってもらえるとありがたいです。
> そうなんですよね、普通に考えて表示済みかそうでないかをわからせる為に印(!マーク)を
> つけて表示させて認識させてたりもしたんですけど何度押しても押した回数分表示させられて
し
> まうんですよ・・・。
これだけでは、どのような判定をしているかがさっぱり分からないため、
回答のしようがありません。
ソースを掲載するなりすれば、有益な回答が得られるかもしれませんが。
とりあえず、表示する側でデバッグしたらどうですか?
\nさんへ
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200605/06050038.txt
と
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200605/06050021.txt
です。
KING・王さんへ
そうですね、一応表示側でデバッグしてみてそれでも駄目ならソースを書くことにします。
表示の方で色々試したのですができなかったのでリストボックスの判定をしている部分のみ
ソースを書きます。
///////////////////以前はメールスロットを受け取るプログラム/////////////////////
ZeroMemory(szBuff1, sizeof(szBuff1)); //送信準備の初期化(スロット内容初期化)
bErr1 = ReadFile(//メール受信チェック
hMailslot1,
szBuff1,
sizeof(szBuff1)-1,//-1
&dwReaded1,
NULL);//OVERLAPPED構造体?? にて読み取り操作
//今後、自動取得する
lpszComp1 = strtok(szBuff1, ); //送信者のホスト名を取得
lstrcpy((LPSTR)szComp1, lpszComp1); //データをコピー(ホスト名)
//SendMessage(hList1,LB_ADDSTRING,0,(LPARAM)szComp1+1 );//リスト名の表示
//メッセージの判別
if(szComp1[0][0] == '!')//頭に!がついていたら、リストボックスにホスト名の表示
{
//リストボックスに文字列挿入,'!'を見えなくするため+1して、消した
SendMessage(hList1,LB_ADDSTRING,0,(LPARAM)szComp1+1 );
//ここで、重複しないようにチェック
if(szComp1 == szComp1)
{break;}
}
else if(szComp1[0][0] =='#')//頭に#がついていたら、リストボックスのホスト名を削除
{
//リストボックスから文字列を削除
//'#'を見えなくするため、+1して、消した
//ここで、リストボックスの検索が必要になる
SendMessage(hList1,LB_SELECTSTRING,-1,(LPARAM)szComp1);//文字列の検索
SendMessage(hList1,LB_DELETESTRING,0,(LPARAM)szComp1+1 );
}
//////////////////////////以降はこの上の処理プログラム////////////////////////
となっています。
ZeroMemoryは受信した相手のアドレスを受け取った後、初期化するコマンドです。
猫でもわかるネットワークプログラムというのを参考にして作ったのですが・・・。
もし、こうした方が良いというのやこの本が解りやすいとかHP等がありましたら教えて頂けると
ありがたいです。
>if(szComp1 == szComp1)
この無意味なif文は?
!や#はどちらが、どの条件でつけるのでしょう?
一番素直な、追加する前にその名前をリストから探してみるという手段はだめなのです
か?
> //ここで、重複しないようにチェック
> if(szComp1 == szComp1)
この条件って、常に真なのでは?
#単なるtypo?
またszComp1の型等が分かりらないため、確定はできませんが、
“==”で単純に比較できるものなのですか?
あと
> SendMessage(hList1,LB_ADDSTRING,0,(LPARAM)szComp1+1 );
これより後で重複チェックしても無駄なのでは?
既に追加したあとだし。。。
REEさんご返事ありがとうございます。
えぇと、そのif文に関してはそこに比べるプログラムを付け加え様としていた残骸です。
判定に関してなのですが、!がオンライン、#がオフラインです。
追加する前に名前をリストから探してみる手段と言うのはどういったもので・・・。
KING・王さんご返事ありがとうございます。
SendMessage(hList1,LB_ADDSTRING,0,(LPARAM)szComp1+1 );
についてなんですが、前の方にあるのはコメントになっていて初めて宣言されたのはその次にな
っているものになります。
>追加する前に名前をリストから探してみる手段と言うのはどういったもので・・・。
そのままですが・・・
探してあったら追加をやめるだけです。
どこが分からないのですか?
>SendMessage(hList1,LB_ADDSTRING,0,(LPARAM)szComp1+1 );
>についてなんですが、前の方にあるのはコメントになっていて初めて宣言されたのはそ
の次にな
>っているものになります。
「重複しないようにチェック」の前にあることには変わりないでしょう。
(このコメントも残骸?)
もしかして!の有無が重複のチェックになっているのですか?
送信側で!を付けて2回以上送ることはないんですか?
一通りレスがついているようなので、別件のツッコミ。
> SendMessage(hList1,LB_SELECTSTRING,-1,(LPARAM)szComp1);//文字列の検索
> SendMessage(hList1,LB_DELETESTRING,0,(LPARAM)szComp1+1 );
MSDNでそれぞれのメッセージをちゃんと調べてください。
使い方むちゃくちゃです。
# LB_SELECTSTRINGでなくLB_FINDSTRINGの方が適切では?
# 戻り値受け取らなければどっちにしろ無意味ですが。