LV_ITEM構造体のメンバlParamについて

このQ&Aのポイント
  • リストビューのカラムをクリックすると、落ちてしまいます。カラムをクリックするとソートするようにしたいです。
  • LV_ITEM構造体のポインタを取得した時に、メンバlParamの値が空のまま(0)になっているため、落ちてしまいます。
  • どのようにしたら、値を取得できるのでしょうか?環境は、Win98、MFCで作成しています。
回答を見る
  • ベストアンサー

LV_ITEM構造体のメンバlParamについて

リストビューのカラムをクリックすると、落ちてしまいます。 やりたい事は、カラムをクリックするとソートするようにしたいです。 下記の(8)でLV_ITEM構造体のポインタを取得した時に メンバlParamの値は空のまま(0)の為? 落ちてしまうのです。 どのようにしたら、値を取得できるのでしょうか?? 一部ですが、問題のあるところだけ下記に明記します。 #説明上、番号を振りました。 #下記の処理は、CListCtrlクラスを継承したCxxxxクラスの関数です。 ************(ここから)****************** (1)LV_ITEM lvItem; (2)int iTemNo; (3)for(int i = 0; i < this->GetItemCount(); i++) (4){ (5) lvItem.iItem = i; (6) lvItem.iSubItem = 0; (7) lvItem.mask = LVIF_PARAM; (8) this->GetItem(&lvItem); (9) LPITEMPARAM lpItemParam = (LPITEMPARAM)lvItem.lParam; (10) iTemNo = i; (11) this->SetItem(&lvItem); (12)} ************(ここまで)****************** 環境は、Win98、MFCで作成しています。 (8)ではGetItemの戻り値で確認したら、 正常に構造体を取得できているかと思うのですが、 lParamの値は、空なんです・・・・。 また、他に必要な情報は、ございますでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • stussy
  • ベストアンサー率100% (1/1)
回答No.1

参考になりますかねぇ。因みに私はとっても参考になりましたけど。 参考URLから「MFCトピック集」→「リストビュー(リストコントロール)」へ。 それとlParam値を設定してアイテムを追加していると思いますが、 CListCtrlクラス中なら<this>というのは必要なのですか? 下記サイトに多くのサンプルがありますので、参考にしてみてはどうでしょうか? http://www.codeproject.com/

参考URL:
http://www.athomejp.com/goldfish/
rewind
質問者

お礼

回答ありがとうございました。 違う方法で実現させました。 今回、問題のあった箇所(8)をコメントアウトしました。 必要ない処理?のようでした。 ただ、とりあえず動作させた程度なので、 バグはないにしろ、自分的にはリストビューのアイテムを 構造体のポインタに保存させたあと、 比較関数で取り出して使いたかったのですが、、、。 教えて頂いた所は、知ってる限りでは、 かなり丁寧で見やすい所だったと思います。 ありがとうございました。

関連するQ&A

  • 構造体配列ポインタを引数で使うには

    いつもお世話になってます。 C言語を使って、構造体配列を引数として使って、サブ関数で取得した値(配列)をメイン関数に渡したいと思っているのですが、受け渡しが上手くできません。 現在以下の様に組んでいます。 /* 構造体宣言 */ typedef struct EXP1 { char sTime[17]; /* 開始日時 */ struct { int num; /* データ数 */ float data[96]; /* データ */ } getdata[5]; } EXP1 ; /* メイン関数 */ int func1( EXP1 ex1; for( loop = 0 ; loop < 5 ; loop++){ ans = funcGet( array1, &ex1.getdata[loop].data ); } if( ans = 0 ){ for( loop = 0 ; ; loop++){ printf("%f",ex1.data[count].pvdata[loop] ); } } } /* サブ関数 */ static int funcGet(int array, float *fvalue) { ans = calcvalu( array, fvalue ); //←float型で値が取得される。 for( i = 0 ; i < 10 ; i++ ) { printf("%f", *(fvalue + i); } return 0; } サブ関数で"fvalue"を確認したところ、正常に値が取得できているのですが、メイン関数では取得できていません。 どうかアドバイスをよろしくお願いします。

  • 構造体について

    私は今プログラミング(C++)を勉強しているのですが、構造体に苦戦しています。分からないことがいくつかあります。もし知っていたらどれでもいいですので、よろしければ教えてください。 1、たとえば構造体を宣言するときに struct abc{ int s; struct abc xx; struct abc yy; }; と宣言するときがあります。でも上記の例と下記の例との違いが分かりません。 struct abc{ int s; struct abc xx; struct abc yy; }abc; 2、たとえばメインの最初にこのように宣言されているとします。 int j, i; struct abc *kk, *nn, *mm; これはここに宣言したものがローカルで、1のときに宣言したものがグローバルと考えていいのでしょうか? 3、メインの中に次のようなプログラムがあったとします。 kk->xx = j; kk->yy = j; nn->yy = NULL; i = kk->xx; i = kk; これらがそれぞれどのような意味があるのでしょうか。 これらでわかることがあればぜひ教えてください。よろしくお願いいたします。

  • 異なる複数の構造体のスマートな使用方法

    構造体のビットフィールドを複数作成し、 条件によってどの構造体を使用するかを決定し データ取得しようとしています。 同じ型の構造体の配列はできますが、 異なる構造体が複数ある場合、配列のように 参照する方法はないでしょうか? スマートなやり方があれば、ご教授お願い致します。 以下、やろうとしていることの簡易版、 /* ----例----------------------------------*/ int test = 1; if( test == 1){ /* 構造体test01を使用し値参照 */ } else if( test == 2){ /* 構造体test02を使用し値参照 */ } else if( ........ /* 以下同じような処理 */ struct test01{ unsigned int bit01: 1; unsigned int bit02: 15; } struct test02{ unsigned int bit01: 2; unsigned int bit02: 14; } struct test03{ unsigned int bit01: 3; unsigned int bit02: 13; } /* 同様の構造体がつづく*/ /* --------------------------------------*/

  • 構造体 アドレス

    VC++6 こんにちは。構造体のアドレスを文字列ポインタで操作することに悩んでいます。下にソースの一部を書きます。 typedef struct{   char code[100];   int type; }AAA; typedef struct{   double method[4][3];   int area; }BBB; 複数の構造体があり、 BOOL CTestApp::File_Check(){  AAA aaa; ~  db.DB_regi(2, (char *)&aaa); ~ } void CData::DB_regi(int key, char *buff) {  switch(key){ ~  case 2:   sss.push_back(buff);  //vector<char *> sss;   break; } で、データを登録し、 int CTestApp::Data_Check() { ~  AAA aaa;  db.DB_get(2, (char *)&aaa); ~ } void CData::DB_get(int key, char *buff) {  switch(key){ ~  case 2:   buff = sss[i];   break; ~ } で、構造体のアドレスを取得しようと思ったら、取得できませんでした。 //DB_getの中では、aaa = (AAA *)buff;とすれば指定の構造体を取得できる。 DB_get関数をどのようにしたら、Data_Check()で、登録した構造体を取得できるのか教えてください。長くなってすみません。

  • 別ファイルの構造体の値を読み込む、変えるには?

    別のファイルに下の構造体があったとして、どのように書けば構造体のデーターを読み込んだり、値を変えたり出来ますか? static struct{ char *name[2]; double d_data[2]; int i_data[4]; double s_data[2]; int state[2][3]; int regi[5]; }kya_data[2]={ {   { "奈美" , "爆弾" },   {    43.0000 ,    54.0000 ,   } , {    50 , 50 , 50 , 50   } , {    0.100,    0.100,   } , {   { 0 , 0 , 0 } ,   { 0 , 0 , 0 }   } , {    100 , 0 , 0 , 0 , 0   } },{   { "由美" , "湖" },   {    23.0000 ,    76.0000 ,   } , {    50 , 50 , 50 , 50   } , {    0.100,    0.100,   } , {   { 0 , 0 , 0 } ,   { 0 , 0 , 0 }   } , {    0 , 0 , 0 , 0 , 100   } } };

  • 構造体の初期化方法について

    こんばんわ。 何度も申し訳ありません。 VC++.NET 2003を用いてコンソールプログラミングを行っています。前回この掲示板を利用して複数回実行するプログラムを作成し、そこに構造体を用いたプログラムを作成しました。以下に概要を示します。 グローバルで構造体を宣言しているため、複数回実行を行うプログラムでは前回の値が格納されたままであると思い、毎回実行時に構造体の初期化を行いたいと思っています。 そこで、以下に示します構造体の初期化はどのように記述すればよいのでしょうか?0で初期化したいと思っています。 よろしくお願い致します。 #define MAX 2000 //グローバル struct tag{ int Npkt; int gettime; int rPkt; int lossPkt; }rdata[MAX]; main(){   //for文で複数回実行処理   for(i=0;i<=5;i++){   //ここで構造体の初期化を記述する //例として、5回プログラムを実行する   } }

  • pthread_createでタスクの構造体にて

    pthread_createという関数でeventというスレッドタスクを作成したく、次のように宣言しました。 if(pthread_create(&thread03 , NULL , thread_func03 ,(void*)&pth) !=0) perror("pthread_create()"); ちなみに、pth_argは次のような構造です。 typedef struct{ char *c; int i; long l; }pth_arg; /* thread_func関数に値を渡すときの構造体 */ 実際のタスク void *event(void *param) { pth_arg *this_arg; this_arg = param; -----(中略)------------------------- } このような形ビルドも正常に完了し、this_argの構造をそのままこのタスク内で使用することも可能なのですが、その後に typedef struct{ char *c; int i; long l; }env_t; /* 次のような構造体もこのタスク内に追加したくなり、 実際のタスク env_t * pEnv; //グローバル宣言 void *event(void *param) { pth_arg *this_arg; this_arg = param; pEnv->i = 0x01; -----(中略)------------------------- } このように、env_t * pEnv;でグローバル宣言で宣言して 値を代入するようなコードを書くと、ビルドはOKなのですが、実行すると Segmentation fault (core dumped) このエラーが出てきて動作が停止してしまいます。 これを解決方法などありませんでしょうか? どうぞ、ご教示頂きますようお願い致します。

  • ポインタが指す構造体メンバの値の表示について

    ポインタが指す構造体メンバの値の表示について 下記のプログラムの*pは、saのエイリアスで、pが指すオブジェクトのメンバxは(*p)..xと表示されているが、*p.xまたは、*(p.x)は、文法的正しくないと書かれいる本が多いのでその理由を教えて頂きたい。 ****************************************************************** int main(void) { struct xyz { int x ; long y ; double z; } sa = {50, 99999999L ,3.14}; struct xyz *p =&sa; printf("(*p).x %d\n", (*p).x);

  • LVM_SETITEMSTATEでListViewのアイテムを選択するには?

    C#でSendMessageを使用してListViewのアイテムを選択する方法で悩んでいます。 [StructLayout( LayoutKind.Sequential, CharSet = CharSet.Auto )] public struct LVITEM { public uint mask; public int iItem; public int iSubItem; public uint state; public uint stateMask; public IntPtr pszText; public int cchTextMax; public int iImage; public int lParam; public int iIndent; // (_WIN32_WINNT >= 0x501) public int iGroupId; public uint cColumns; public IntPtr puColumns; } ・・・・ public void HogeHoge() { LVITEM lvi = new LVITEM(); lvi.state = LVIS_FOCUSED | LVIS_SELECTED; lvi.stateMask = 0x000F; SendMessage( hLV, LVM_SETITEMSTATE, 0, ref lvi ); } LVM_SETITEMSTATEでは選択できないのでしょうか? OSはXPです。

  • シンボルが解釈できない???

    ファイルは全て同じディレクトリ中に入っています。 ItemS.javaというファイルをコンパイルするとシンボルを解釈処理できません,というエラーが表示されます。ソース内容は以下です。 //商品ID指定による商品の検索 public Item getItem(int id) { Item item = null; for(int i = 0; i < items.size(); i++) { item = getItemByIndex(i); if(item.getId() == id) { return item; } } return null; } <エラー内容MS-DOSより> Items.java:39:シンボルを解釈処理できません。 シンポル : クラス Item 位置 :Itemのクラス public Item getItem(int id) {     ^ という内容です。 ちなみにItem.javaの一部ソース内容です。 private int id; public class Item { public Item(int id, String name, double price) { this.id = id; }  //商品IDプロパティ public void setId(int id) { this.id = id; } public int getId() { return id; }   以上です。なぜ解釈処理されないか原因が分かりません。アドバイスお願い します。

    • ベストアンサー
    • Java

専門家に質問してみよう