前回のDOSのプログラムを移植するにはのもうひとつの問題です。
それはPOP3受信の時に件名と差出人と差出人の送信時刻を
リストビューに表示しようとやっているのですが何度やっても
件名しかリストビューに表示されないので困っています。
どうすれば件名と差出人と送信時刻を表示できるようになりますか?
なお表示に使っている関数は猫でも分かるの以下のページのリストビューに
件名と差出人と送信時刻とメールサイズを表示するコードと同じものを使っています。
http://www.kumei.ne.jp/c_lang/sdk3/sdk_238.htm
// メールのリストを表示する(nMailサンプルcmailのlist_mailの改良)
int List_Mail(SOCKET s, char *host, char *id, char *pass, HWND hList)
{
int count, max;
char subject[TEMP_MAX], date[TEMP_MAX], from[TEMP_MAX], header[TEMP_MAX];
max = 0;
// 認証
if((max = NMailPop3Authenticate(s, id, pass, FALSE)) >= 0) {
// 受信しているメールの数分ヘッダを読み出す
for(count = 0; count < max; count++) {
if(NMailPop3GetMailStatus(s, count + 1, subject, date, from, header, FALSE) >= 0){
// 題名、日付、差出人を表示
InsertItem(hList, count + 1, 0, subject);
InsertItem(hList, count + 1, 1, from);
InsertItem(hList, count + 1, 2, date);
}
else{
break;
}
}
}
return max;
}
// カラムにタイトルをつける
void InsertColumn(HWND hList)
{
LVCOLUMN lvcol;
lvcol.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvcol.fmt = LVCFMT_LEFT;
lvcol.cx = 200;
lvcol.pszText = "件名";
lvcol.iSubItem = 0;
ListView_InsertColumn(hList, 0, &lvcol);
lvcol.cx = 50;
lvcol.pszText = "差出人";
lvcol.iSubItem = 1;
ListView_InsertColumn(hList, 1, &lvcol);
lvcol.cx = 100;
lvcol.pszText = "日付";
lvcol.iSubItem = 2;
ListView_InsertColumn(hList, 2, &lvcol);
return;
}
// リストビューに件名等を挿入する
void InsertItem(HWND hList, int iItemNo, int iSubNo, char *lpszText)
{
LVITEM item;
memset(&item, 0, sizeof(LVITEM));
item.mask = LVIF_TEXT;
item.pszText = lpszText;
item.iItem = iItemNo;
item.iSubItem = iSubNo;
if(iSubNo == 0){
ListView_InsertItem(hList, &item);
}
else{
ListView_SetItem(hList, &item);
}
return;
}
InsertItemとSetItemのhListっていらないんじゃないでしょうか?
試しに消してみてくださいな。
失礼、この場合必要でした。
ListView_SetItemに渡すLV_ITEM::iItemの値を,
ListView_InsertItemの戻り値にしてみてはどうでしょう。
>ListView_SetItemに渡すLV_ITEM::iItem(item.iItemですよね?)の値を,
>ListView_InsertItemの戻り値にしてみてはどうでしょう。
戻り値と言う事はreturnの所に置くのではないですよね?>YuOさん
どこの位置かを教えていただけると分かるかもしれないです。
こんな事書いてしまって本当にごめんなさいです。
> LV_ITEM::iItem(item.iItemですよね?)
え〜っと,引用文の中に追加しないようにしてくださいね。
引用文は読み飛ばすことが多いので。
で,LV_ITEM::iItemで正しいです。
C++の表記法で,
LV_ITEM構造体(orクラスor名前空間)に含まれるiItemメンバ
という意味です。
> 戻り値と言う事はreturnの所に置くのではないですよね?>YuOさん
> どこの位置かを教えていただけると分かるかもしれないです。
う〜ん,「どこの位置」とはなんのことでしょう……。
#「戻り値」ってわかってますよね?
>#「戻り値」ってわかってますよね?
多分return の所に置く戻り値と勘違いしてるんだと思います。
だから分からないのかもしれないです。(本当にごめんなさいです。)
そのため今も以下のような状態が続いています。
http://knekodo.hp.infoseek.co.jp/mailview.png
> 多分return の所に置く戻り値と勘違いしてるんだと思います。
とりあえず,C言語から勉強し直した方が……。
ここで言う戻り値というのは,
int func (void);
という関数があったとして,式func()の値のことです。
#関数から返す値も,返ってきた値もどちらも戻り値と言いますが。
ListView_InsertItemのヘルプを調べればわかりますが,この関数(実際にはマクロ)は,追加された項目のインデックスを返します。
これを,ListView_SetItemするときのLV_ITEM::iItemの値に使用すればみけにゃんさんがしたいことができると思います。
えっとこのプログラムはC++の機能は使ってないCとSDKのプログラムです。
なのでC++と言われてもぱっとこないです。(>_<)
戻り値と言われるとやっぱりreturnから戻ってくる値の事だと
思ってしまうようです。
まだこれについては解決していないです。(YuOさんごめんなさいです。)
とりあえず,
・ListView_InsertItemの戻り値の意味を調べる
ことをしてください。ヘルプを引けば一発でわかります。
できたら,
・使っている関数・構造体全てのヘルプを引く
こともしておくといいでしょう。
ちなみに,戻り値というのは基本的に関数を使う側から見た言葉です。
ListView_SetItem(マクロ)の戻り値はこれで言うとうしろの
const LV_ITEM FAR *pitemに当たるのでしょうか?
現在猫でも分かる〜SDK編のリストビューの基礎と言う所を見て
考えている所ですが、いまいち分からないです。
これが災いしているのか不明なのですがサーバによっては
リストビューに正常に件名が入らずそこをクリックすると
エラーが出るというバグが出ます。(猫でも分かるのメーラも同様です。)
BOOL ListView_SetItem(
HWND hwnd,
const LV_ITEM FAR *pitem
);
今ListView_SetItemの部分をデバッグしているのですが
戻り値が成功ならTRUEに対して今の状態はFALSEでSetItemに
失敗しているようなのですがこれはどうしてなのですか?
> ListView_SetItem(マクロ)の戻り値はこれで言うとうしろの
> const LV_ITEM FAR *pitemに当たるのでしょうか?
違います。
C言語の基礎を勉強し直してください。
#ちなみに,pitemは仮引数(parameter)です。
>C言語の基礎を勉強し直してください。
ではどの辺りから再勉強すればよろしいでしょうか?>YuOさん
> ではどの辺りから再勉強すればよろしいでしょうか?
関数に関わるところから。
プログラミング言語C 第2版の日本語版だと,pp.30-33や第4章など。
>関数に関わるところから。
>プログラミング言語C 第2版の日本語版だと,pp.30-33や第4章など。
私が持っているのはソフトバンクから出ているC言語プログラミングレッスン
と言う本の基本編と文法編です。これは私が専門学校の時C言語の時間使った
ものなのですがそれだったら同じような関数の所からでよろしいですか?
昨日まで作ったソースを以下の場所に載せました。
http://knekodo.hp.infoseek.co.jp/new.html
関数が呼び出し側に返す値の事を戻り値といいます。
例えば、関数fgetcはファイルから読み込んだ文字が戻り値となりますし、
関数removeは、ファイルを削除したときには0が戻り値となり、削除できな
かったときは0以外が戻り値となります。
戻り値のある関数を定義しようとする場合、戻り値は、return文で指定します。
関数の定義の中にreturn文はいくつあってもかまいません。
以上C言語プログラミングレッスン[文法編]のP.218-219の戻り値の説明の一部の引用です。
また、ListView_InsertItem(マクロ)の戻り値に関する事を見たら次のような事が分かりました。
[成功すれば新しいインデックスが、失敗すれば -1 が返ります]
と言う事は以下のような事をすれば良いのですか?
int lvitem;
[以下略]
if(iSubNo == 0){
// 戻り値をlvitemに入れる
lvitem = ListView_InsertItem(hList, &item);
}
else{
item.iItem = lvitem; // iItemにlvitemの値を代入
ListView_SetItem(hList, &item); // Itemを挿入する
}
なんとか以下のコードで差出人と日付を表示する事が出来ました。
でも他のサーバでちゃんと件名が表示されるかはまったくもって
分からない状態です。(Delphiで作っているメーラはOKでした)
// リストに件名、差出人、日付を挿入する
void InsertItem(HWND hList, int iItemNo, int iSubNo, char *lpszText)
{
LVITEM item;
int lvitem;
memset(&item, 0, sizeof(LVITEM));
lvitem = iItemNo - 1; // lvitemの初期値にiItemNo - 1の値を代入
item.mask = LVIF_TEXT;
item.pszText = lpszText;
item.iItem = iItemNo;
item.iSubItem = iSubNo;
if(iSubNo == 0){
lvitem = ListView_InsertItem(hList, &item);
}
else{
item.iItem = lvitem;
ListView_SetItem(hList, &item);
}
return;
}
VCでエクセルファイルのシート名をすべて列挙したい。
VBでの記述方法を教えて下さい。
エクセルファイルのOPEN方法は、わかります。
又、このような仕様に対し、どんな本、又は、HELPで
しれべたらいいかも教えていただけると助かります。
その後今使っているノートに作ったPOP3(SMTP)サーバで
テストメールを送信して試しましたが問題はなかったようです。
今回はYuOさんにご迷惑をかけたことを深くお詫び申し上げます。
ツイート | ![]() |