配列のデータ削除方法

このQ&Aのポイント
  • 配列のデータを削除する方法について教えてください。
  • Windows98とVC++6.0を使用して、ダイアログ上の付箋を作成し、位置データと文字データをファイルに保存しています。付箋を削除した場合に、そのデータを保存しない方法が知りたいです。
  • 付箋ウィンドウを作成し、テキストデータと位置データを取得してファイルに保存しています。削除した付箋のデータを保存しない方法について教えてください。
回答を見る
  • ベストアンサー

配列のデータ削除方法

宜しくお願いいたします。 <環境> WIN98 VC++6.0 MFC  以下コードにて、ダイアログのボタン押し下げで、ウィンドウを作成し、付箋としてデスクトップに 貼っています。 CPtrArray m_pAryDlg; void CInput::OnButton1() //ダイアログのボタン押し下げ { UpdateData (TRUE); pWnd = new CMyWnd( this); pWnd->m_iti=100; //貼り付け位置の初期値 m_pAryDlg.Add ( pWnd );  pWnd->m_moji=m_InputData; //ダイアログのテキストデータを取得 pWnd->Kado_Create(this); //ウィンドウの作成 ShowWindow(SW_HIDE); //ダイアログの非表示 } また、ウィンドウ破棄時には、こんな感じでウィンドウ(付箋)の位置データと文字データを ファイルに保存しています。 for ( iCnt = 0; iCnt < m_pAryDlg.GetSize( ); iCnt ++ ) { pDlg = (CMyWnd*)m_pAryDlg[ iCnt ]; sprintf(aa,"%d",pDlg->m_rect.left); //位置データ sprintf(aaa,"%s",pDlg->m_moji);  //文字データ aaaa=aaaa+aa+crlf+aaa+crlf; pDlg->DestroyWindow( ); delete pDlg; } fputs(aaaa,fout); //ファイルへの書き込み fclose(fout); このような場合において、5個貼られた付箋を1個はがした場合に、そのはがした付箋のデータは 保存したくないのですが、どのようにすれば実現できるのでしょうか? 宜しくお願いいたします。

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

1.剥がした付箋が何番目の要素か検索し、配列からCPtrArray::RemoveAt()で削除する 2.CMyWndのメンバ変数に削除済みフラグを持ち、フラグが立っていたら書き込まない 3.根本的なところで、ウィンドウを管理しない。 アプリが終了されるときに存在していたら、ウィンドウのOnDestroyで保存の処理をおこなう。 とか、いろいろ考えられます。他にもたくさんあるでしょう。 上に挙げたのはあくまでも案なので、自分のアプリに合う方法を 考えてください。 あとおまけ。 >sprintf(aa,"%d",pDlg->m_rect.left); //位置データ >sprintf(aaa,"%s",pDlg->m_moji);  //文字データ > >aaaa=aaaa+aa+crlf+aaa+crlf; aaaa += CString.Format("%d\r\n%s\r\n", pDlg->m_rect.left, pDlg->m_moji); とか、 aaaa += CString.Format("%d" crlf "%s" crlf, pDlg->m_rect.left, pDlg->m_moji); とかにしてみるとか。 #aaaaはCString、crlf は #define "\r\n"って勝手に想像してます。

VitaminBB
質問者

お礼

いつも本当にありがとう御座います。 基本形が全て完成したと思っていたら、今回の件でつまずき質問しました。 イメージは分かっていても今1つ手が動かず、また質問の回答をみても、簡単には行かないだろうと思っていました。 ところが、なっなんと奇跡です。一発でうまく行きました。 ようやく、C++に慣れてきたみたいです。 従来であれば、1を採用しました。 ところがCPtrArrayが今1つ分からず、剥がした付箋が何番目の要素か検索する方法が分かりません。 そこで2でやったらうまく行きました。 3は以前の仕様での方針でしたが、今回は方針を根本的に変えたので採用しませんでした。 今後のために1のもう少し具体的なコードを教えていただけると助かります。 aaaaはCStringです。crlf ="\x0a"としてます。 いただきって思いやってみたら、'CString' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。のエラーが出ました。 #CPtrArrayの良い例が本やネット上さがしても見つかりません。 CPtrArrayはある人が教えてくれたコードにあったので、便利だと思って採用しました。

その他の回答 (1)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>従来であれば、1を採用しました。 >ところがCPtrArrayが今1つ分からず、剥がした付箋が何番目の要素か検索する方法が分かりません。 配列みたいに使えるんで、ループでまわして先頭からチェックしてみるとか for ( iCnt = 0; iCnt < m_pAryDlg.GetSize( ); iCnt ++ ) { if( this == (CMyWnd*)m_pAryDlg[ iCnt ]) { m_pAryDlg.RemoveAt( iCnt ); break; } } #m_pAryDlgはCMyWndの中では見えないと思うんでこのままでは動かないと思いますが。 >aaaaはCStringです。crlf ="\x0a"としてます。 >いただきって思いやってみたら、'CString' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。のエラーが出ました。 失礼しました。 CString::Format()が戻り値CString&だと思ったらvoidだったんでだめでしたね。 CString strBuf; strBuf.Format("%d" crlf "%s" crlf, pDlg->m_rect.left, pDlg->m_moji); aaaa += strBuf; とか、 strBuf.Format("%s%d\x0a%s\x0a", (LPCTSTR)aaaa, pDlg->m_rect.left, pDlg->m_moji); aaaa = strBuf; ってことで勘弁してください。 >#CPtrArrayの良い例が本やネット上さがしても見つかりません。 > >CPtrArrayはある人が教えてくれたコードにあったので、便利だと思って採用しました。 CArrayの方が便利かな?型チェックが効く分。 ただし、テンプレートなんで最初は苦労するかもしれませんが。 基本的な動的配列、リスト構造等を提供してくれるSTLというテンプレートライブラリが、 C++標準ライブラリとして存在します。(VC++にも入ってます) こちらならいい本もありますし、ネット上にも情報色々ありますよ。

VitaminBB
質問者

お礼

回答ありがとうございます。

関連するQ&A

  • ウィンドウ位置情報の取得

    <環境> WIN98 VC++6.0 MFC  宜しくお願いいたします。 数個のダイアログが付箋として張られているアプリにて、アプリ終了時にダイアログの位置情報を以下のコードにて取得することが出来ます。 数個の付箋がダイアログでは無く、ウィンドウの場合は、下記コードをどのように変更すれば良いのでしょうか? 自分で分かる範囲でダイアログに関するところをウィンドウに変えたところ、m_rectはメンバではない というエラーが出ました。 ************************************** void Cxxx::OnDestroy() //Cxxxは付箋ダイアログの親ダイアログ { CDialog::OnDestroy(); // TODO: この位置にメッセージ ハンドラ用のコードを追加してください int iCnt; CTestDlg *pDlg; for ( iCnt = 0; iCnt < m_pAryDlg.GetSize( ); iCnt ++ ){ pDlg = (CTestDlg*)m_pAryDlg[ iCnt ];//iCnt番目のダイアログを指すポインタ // 今はTRACEで出力 TRACE ( "X1(%d) Y1(%d) X2(%d) Y2(%d)\n", pDlg->m_rect.left, pDlg->m_rect.top, pDlg->m_rect.right, pDlg- >m_rect.bottom ); pDlg->DestroyWindow( ); delete pDlg; } }

  • 子ウィンドウから親ウィンドウへデータを渡すには?

    宜しくお願いします。 <環境> WIN98 VC++6.0 MFC  ダイアログのボタン押し下げでウィンドウを生成し、ダイアログのテキストボックスに入力した文字をウィンドウに表示しています。 また、ウィンドウ生成後はダイアログを非表示にしています。 void CInput::OnButton1()//ウィンドウの生成 { UpdateData (TRUE); pWnd = new CMyWnd( this); pWnd->m_moji=m_InputData; //テキストボックスの文字をウィンドウに表示されるう変数m_mojiに代入 pWnd->Kado_Create(this); ShowWindow(SW_HIDE); //ダイアログの非表示 } ウィンドウをダブルクリックすると、ダイアログを非表示から表示にし、ウィンドウに表示されている文字をダイアログのテキストボックスに表示させるために以下のようにしましたが、文字は表示されません。 どのようにすれば表示されるようになりますか? void CMyWnd::OnLButtonDblClk(UINT nFlags, CPoint point) { CInput* pInput = (CInput*)GetParent(); // CInputは親ダイアログのクラス pInput->m_InputData=m_moji;//変数に正しい文字が代入されていることは確認できました UpdateData(FALSE); pInput->ShowWindow(SW_SHOW); CWnd::OnLButtonDblClk(nFlags, point); }

  • ダイアログの再表示について

    宜しくお願いします。 <環境> WIN98 VC++6.0 MFC  ダイアログのボタン押し下げでウィンドウを生成し、 生成後はダイアログを非表示にしています。 void CInput::OnButton1()//ウィンドウの生成 { UpdateData (TRUE); pWnd = new CMyWnd( this); pWnd->m_left=100; pWnd->m_top=100; m_pAryDlg.Add ( pWnd ); //m_pAryDlg2.Add ( &m_InputData ); pWnd->m_moji=m_InputData; pWnd->Kado_Create(this); ShowWindow(SW_HIDE); //ダイアログの非表示 } ウィンドウをダブルクリックすると、ダイアログが非表示から 表示になるように以下のコードを書きましたが、表示されません。 どのようにすれば表示されるようになりますか? void CMyWnd::OnLButtonDblClk(UINT nFlags, CPoint point)  //ウィンドウのダブルクリック { CInput* pInput = (CInput*)GetParent(); // CInputは親ダイアログのクラス pInput->ShowWindow(SW_SHOW); CWnd::OnLButtonDblClk(nFlags, point); }

  • 一度に2個づつのデータを取得するには?

    お願いします。環境 WIN98 VC++6.0 MFC にて 今、下記のようにファイルから文字データを1行づつ読出して、ウィンドウを生成し読み出した文字を表示しています。 今度はデータを表示文字だけではなく、 1行目:ウィンドウ位置データ(とりあえず左上のみ)、 2行目:表示文字データ ・ ・ というように、位置データと文字データの繰り返しのデータにしました。 そこで2行づつ読み出すたびに、ウィンドウを1個作成するようにしたいのですが、スマートな方法はないでしょうか? if((fin=fopen("d:\\qqq.txt","r"))==NULL){ AfxMessageBox("読み込みファイルオープン出来ません"); return; } while((fgets(buf,256,fin))!=NULL) { n=strlen(buf); buf[n-1]='\0'; pWnd = new CMyWnd(this); pWnd->m_moji=buf; m_pAryDlg.Add ( pWnd ); m_pAryDlg2.Add ( &buf ); }

  • 終了時と同じウィンドウ位置で表示するには?

    付箋紙ソフトもどきを作っています。 ダイアログのボタン押し下げにて新たなウィンドウが何個も生成されるようになっています。 アプリを終了して再度起動すると、終了前に表示されていたウィンドウが終了前と同じ位置に表示されるようにしたいと思っています。 以下のコードでは、全てのウィンドウが同じ場所に表示されてしまいます。 どのようにすれば、各ウィンドウがそれぞれの元の位置に表示されるようにできますか? 各ウィンドウ毎に位置情報を保存、読出しするにはどうすれば良いのでしょうか? よろしくお願いします。 BOOL CMyWnd::kado_Create(CWnd* parent,CString m_InputData){ int nX,nY;//ウィンドウの位置を格納する変数 nX = GetPrivateProfileInt("Pos","X",0,"TSHANG2.INI"); nY = GetPrivateProfileInt("Pos","Y",0,"TSHANG2.INI"); 略 CreateEx( dwExStyle, lpszClassName, _T("Test"), dwStyle, rect, parent, NULL, NULL); 略 } void CMyWnd::OnDestroy() { int nX,nY;//ウィンドウの左上の座標を格納する変数 WINDOWPLACEMENT wp;//WINDOWPLACEMENT構造体 char szBuffer[32];//キーの値を格納する wp.length = sizeof(WINDOWPLACEMENT); ::GetWindowPlacement(m_hWnd,&wp); nX = wp.rcNormalPosition.left; nY = wp.rcNormalPosition.top; wsprintf(szBuffer,"%d",nX); WritePrivateProfileString("Pos","X",szBuffer,"TSHANG2.INI"); wsprintf(szBuffer,"%d",nY); WritePrivateProfileString("Pos","Y",szBuffer,"TSHANG2.INI"); 略 }

  • データ移行ツール探してます。

    windows7 → windows10に PC引っ越しがあるのですが、 電源設定・ユーザプロファイル・デスクトップのアイコンの位置・付箋のデータ(位置)・IEのお気に入りの順番・など、データ以外にもコピーできるようなソフト探してます。引っ越し方法はLANで接続でも、USBHDDに落とすでもどちらでも可です(できれば早い方)。 いろいろがさしてるのですが、どれも横一線で同じようにしか見えない感じです。 お分かりの方ご教授いただけると幸いです。

  • ウィンドウのフレームの色変更

    <環境> Win98 VC++6.0 MFC よろしくお願いします。 ダイアログのボタン押し下げにて、新規にウィンドウを作成しています。 新規に作成したウィンドウのクライアント領域の色は、 CPaintDC dc(this); // 描画用のデバイス コンテキスト CRect cr; GetClientRect( &cr); dc.FillSolidRect( cr, RGB( 250, 250, 0)); dc.DrawText( moji,cr, DT_SINGLELINE | DT_VCENTER | DT_CENTER); にて変更することが出来ました。 クライアント領域の外側にあるフレームの色も変更したいのですが、 どのようにすれば実現可能でしょうか? ご存知の方、教えてください。お願いします。

  • CPtrArrayクラスの使い方

    CPtrArrayクラスを勉強しています。 以下コードを見つけたので、pElementに444が入っているのだろうと思ってAfxMessageBoxで見ようとしたら、でたらめな数字が表示されます。 どうしてなのでしょか? void CXxxView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください // 配列の宣言 CPtrArray m_PtrArray; // 配列への要素の追加 int* pi = new int; *pi = 444; m_PtrArray.InsertAt(m_PtrArray.GetSize(), pi); // 配列の要素の取得 int* pElement = (int*)m_PtrArray.GetAt(0); //ここから追加 char aa[10]; sprintf(aa,"%d",pElement); AfxMessageBox(aa); //ここまで追加 CView::OnLButtonDown(nFlags, point); }

  • クリックした位置の値が正確に表示できません。

    マウスでクリックした位置の値が正確に表示されないのですが、どうしたらよいでしょうか?何かいいアドバイスがあればよろしくお願いします。    ax=(int)(point.x/1.4);    ay=(int)(point.y/1.4);    sprintf("buf,"クリックした位置:%d",ax);    PDC->TextOut(x0+130,y0+250,buf);    sprintf("buf,"クリックした位置:d",ay);    pDC->TextOut(445,y0+250,buf); これは、クリックした位置の表示のしかたです。ax,ayはクリックした位置、正確にいうとpoint.xとpoint.yですが、都合により1.4で割りax.ayに格納しています。 // オーバーレイウィンドウの作成 // Create overlay window if(hWndOverlay == NULL) CreateOverlayWindow(); // オーバーレイウィンドウの作成 // Create overlay window enc_return = ENC_Create_Overlay_Window(ENC_ID, m_hWnd, &hWndOverlay, 0, 0, rc.right, rc.bottom); 一応、これがオーバーレイウィンドウの作成部分のプログラムです。抜粋して載せたのでわかりにくいかもしれませんがお願いします。 カメラから静止画をキャプキャして行っていたときは、うまくいったのですが、オーバーレイではうまくいきません。

  • Warning: initial dialog data is out of range. と言う警告について

    VC++ 6.0 MFC ダイアログベースです。 メインダイアログで、あるボタンをクリックすると、別のダイアログが開くと言う物を作っているのですが、 「F5キー」でデバックし、メインダイアログから別のダイアログを開くと、 Warning: initial dialog data is out of range. と言うメッセージがデバックのメッセージウィンドウにでていました。 これはどういった警告なのでしょうか?よろしくお願い致します。 また、どこを見る必要があるのでしょうか? (1)警告メッセージが出るのは selectingdlg->DoModal(); で出ていました。 (2)OnInitDialog()の中身を全部削除しても、(下記状態)同様の警告が出ました。 (3)最初のころはこのような警告はなく、最近になって見つけたのですが、何を追記した時かが自分でももお解らなくなってしまいました・・・。 よろしくお願い致します。 void CMainDlg::Onbutton1() {   selectingdlg->DoModal(); } BOOL CChildDlg::OnInitDialog() {   CDialog::OnInitDialog();   // TODO: この位置に初期化の補足処理を追加してください   return TRUE; // コントロールにフォーカスを設定しないとき、戻り値は TRUE となります          // 例外: OCX プロパティ ページの戻り値は FALSE となります }

専門家に質問してみよう