C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

<< 0 >>
■10322  Re[3]: キーコード送信
□投稿者/ とっちゃん -(2007/11/15(Thu) 17:12:57)
>
    No10301 (zin さん) に返信
    > 上記を完全に置き換えると、どんな感じになるのでしょうか?
    >
    keybd_event ってAPIのですよね?
    であれば、置き換えは不可能というか代替手段そのものがありません。

    keybd_event API は、キーボード上のキーを押したということを
    ソフトウェア的にエミュレーションするAPIです。
    そのため、どのキー(KEY_CODEに当たる部分)を押した、離した
    ということを実際にキーボードを押す代わりに機械的に行うようにする
    というAPIです。

    .NET Framework には類似の機能として、System.Windows.Forms.SendKeys という
    クラスのSendメソッドで代用することができますが、
    残念ながら、このクラスには、キーを押すだけ、キーを離すだけという
    仕組みが用意されていません。

    そのため、現状のコードを別のAPIなどを使って完全に置き換えることは不可能となります。

    ようするに、何をしたいのかが明確になっていないとどうにもならんということですw
記事No.10240 のレス /過去ログ23より / 関連記事表示
削除チェック/

■77972  Re[2]: Dictionaryのジェネリック変換
□投稿者/ びーふ -(2015/12/05(Sat) 14:58:34)
    ありがとうございます。助かりました。
記事No.77970 のレス / END /過去ログ132より / 関連記事表示
削除チェック/

■95114  仕様?誤使用?
□投稿者/ chobi -(2020/06/24(Wed) 11:18:26)

    分類:[C#] 

    * 開発ツール
    Microsoft Visual Studio Express 2017 for Windows Desktop
    Version 15.9.23
    VisualStudio.15.Release/15.9.23+28307.1146
    Microsoft .NET Framework
    Version 4.8.03752
    * .NET Framewoek 4.6.1
    * C#
    * Windows10 64bit

    いつもお世話になっております。
    panelに張り付けたコントロール(Name==AccountElement)
    をチェックが入っていたら消していくプログラムを作っています。
    以下のようにforeachで列挙しながらチェック、削除していますが、
    削除対象が連続すると2個目が列挙されないという現象があります。
    削除しているので、削除対象controlのインッデクスが一つ減算されるのが
    理由だと思いますが、使いにくいですよね・・・・
    皆さんどうしているのでしょうか?

    int RemoveCnt = 0;
    foreach (Control ctr in Controls)
    {
    if (ctr.Name == "AccountElement")
    {
    AccountElement ae = (AccountElement)ctr;
    if (ae.Checked)
    {
    Controls.Remove(ctr);
    //++RemoveCnt;
    }
    //ae.Top -= ae.Height * RemoveCnt;
    }
    }
親記事 /過去ログ165より / 関連記事表示
削除チェック/

■95115  Re[1]: 仕様?誤使用?
□投稿者/ 魔界の仮面弁士 -(2020/06/24(Wed) 11:32:56)
    2020/06/24(Wed) 11:34:02 編集(投稿者)

    No95114 (chobi さん) に返信
    >  if (ctr.Name == "AccountElement")
    >  {
    Controls 内に、同じ Name を持つコントロールが複数あるのでしょうか。
    デザイナー画面で貼った場合、同名コントロールは同時に存在できないハズです。
    (デザイナーを用いず、コードで生成していた場合は、同名コントロールや無名コントロールも配置可能です)

    もし、 "AccountElement" なコントロールがひとつだけなら、
    発見した時点で break; して、ループを抜けてしまえば良いと思います。



    > Controls.Remove(ctr);

    ctr.Dispose(); が漏れているように見えます。

    Panel に貼ったコントロールは、親フォームが閉じられたときに、
    一緒に Dispose されるのですが、Remove や RemoveAt した場合は、
    Controls の管理下から外れてしまうので、明示的に Dispose(); する必要があります。


    > 以下のようにforeachで列挙しながらチェック、削除していますが、
    > foreach (Control ctr in Controls)


    // 修正案1: 後ろから前に探索するようにする
    for ( int i = Controls.Count - 1 ; i >= 0 ; i-- )
    {
     Control ctrl = Controls[i];


    // 修正案2: Controls そのものではなく、そこから取り出した「削除前のコントロール一覧」を列挙する
    foreach (var ctrl in Controls.Cast<Control>().ToArray() )
記事No.95114 のレス /過去ログ165より / 関連記事表示
削除チェック/

■95116  Re[2]: 仕様?誤使用?
□投稿者/ chobi -(2020/06/24(Wed) 11:46:57)
    魔界の仮面弁士さま
    
    適切な回答ありがとうございます。
    コードで生成しているので同名です。diposeは追加しました。
    とりあえず大した要素数ではなかったので、頭からやり直すようにしました。
    後ろからアクセスする、事前に列挙す
    
            retry:
            foreach (Control ctr in Controls)
            {
                if (ctr.Name == "AccountElement")
                {
                    AccountElement ae = (AccountElement)ctr;
                    if (ae.Checked)
                    {
                        Controls.Remove(ctr);
                        ctr.Dispose();
                        goto retry;
                    }
                }
            }
    
    
    
    
    ■No95115 (魔界の仮面弁士 さん) に返信
    > 2020/06/24(Wed) 11:34:02 編集(投稿者)
    > 
    > ■No95114 (chobi さん) に返信
    >> if (ctr.Name == "AccountElement")
    >> {
    > Controls 内に、同じ Name を持つコントロールが複数あるのでしょうか。
    > デザイナー画面で貼った場合、同名コントロールは同時に存在できないハズです。
    > (デザイナーを用いず、コードで生成していた場合は、同名コントロールや無名コントロールも配置可能です)
    > 
    > もし、 "AccountElement" なコントロールがひとつだけなら、
    > 発見した時点で break; して、ループを抜けてしまえば良いと思います。
    > 
    > 
    > 
    >>Controls.Remove(ctr);
    > 
    > ctr.Dispose(); が漏れているように見えます。
    > 
    > Panel に貼ったコントロールは、親フォームが閉じられたときに、
    > 一緒に Dispose されるのですが、Remove や RemoveAt した場合は、
    > Controls の管理下から外れてしまうので、明示的に Dispose(); する必要があります。
    > 
    > 
    >>以下のようにforeachで列挙しながらチェック、削除していますが、
    >>foreach (Control ctr in Controls)
    > 
    > 
    > // 修正案1: 後ろから前に探索するようにする
    > for ( int i = Controls.Count - 1 ; i >= 0 ; i-- )
    > {
    >  Control ctrl = Controls[i];
    > 
    > 
    > // 修正案2: Controls そのものではなく、そこから取り出した「削除前のコントロール一覧」を列挙する
    > foreach (var ctrl in Controls.Cast<Control>().ToArray() )
記事No.95114 のレス / END /過去ログ165より / 関連記事表示
削除チェック/

■95123  Re[3]: 仕様?誤使用?
□投稿者/ PANG -(2020/06/24(Wed) 15:50:46)
    No95116 (chobi さん) に返信
    > Controls.Remove(ctr);

    ctr.Visible = false;
    がオススメです
    foreach が使えるし、Disposeも気にする必要がありません。
記事No.95114 のレス /過去ログ165より / 関連記事表示
削除チェック/

■95122  Re[1]: 仕様?誤使用?
□投稿者/ ぶなっぷ -(2020/06/24(Wed) 15:42:52)
    少々疑問が、
    これってforeachで回しながら削除してますよね。
    そーすると、
      InvalidOperationException
      「コレクションが変更されました。列挙操作は実行されない可能性があります。」
    になりませんか?ならないのが不思議です。
    
    それはさておき、修正案ですが、Controlsがいわゆるコレクション(List, Arrayy, ...)
    なら、LINQメソッド(拡張メソッド)を使うのがおすすめ。
    
    以下の1行でおしまいです。
      int RemoveCnt = Controls.RemoveAll(x => x.Name == "AccountElement");
記事No.95114 のレス /過去ログ165より / 関連記事表示
削除チェック/

■95125  Re[2]: 仕様?誤使用?
□投稿者/ 魔界の仮面弁士 -(2020/06/24(Wed) 19:33:53)
    No95122 (ぶなっぷ さん) に返信
    > それはさておき、修正案ですが、Controlsがいわゆるコレクション(List, Arrayy, ...)
    > なら、LINQメソッド(拡張メソッド)を使うのがおすすめ。
    > 以下の1行でおしまいです。
    > int RemoveCnt = Controls.RemoveAll(x => x.Name == "AccountElement");

    Arrayy → Array の誤記だとしても、
    Array オブジェクトに Remove 系のメソッドは用意されていないのでは…?


    List<> であれば RemoveAll がありますが、ここでいう Controls は、
    Panel コントロールのプロパティのようなので、恐らくは Control.ControlCollection でしょう。
    RemoveAll は使えないと思います。Remove / RemoveByKey / RemoveAt だけ。



    LINQ で処理するとしたら、これでどうでしょう。
    変数 target を省略すれば 1 行になりますが、そこまで圧縮すると、流石に読みにくそう。

    AccountElement[] target = Controls.OfType<AccountElement>().Where(c => c.Name == "AccountElement").ToArray();
    Array.ForEach(target, c => { using (c) { Controls.Remove(c); } });
記事No.95114 のレス /過去ログ165より / 関連記事表示
削除チェック/

■95136  Re[3]: 仕様?誤使用?
□投稿者/ ぶなっぷ -(2020/06/25(Thu) 09:17:44)
    確かに、よく読むとPanelコントロールのControls プロパティのようですね。
    であれば、おっしゃられる通り、RemoveAll()はないですね。
    失礼しました。

    ちなみに、示してくれたサンプル
    > AccountElement[] target = Controls.OfType<AccountElement>().Where(c => c.Name == "AccountElement").ToArray();
    > Array.ForEach(target, c => { using (c) { Controls.Remove(c); } });
    において、
    using (c) {}
    は何をやっているのでしょう?
記事No.95114 のレス /過去ログ165より / 関連記事表示
削除チェック/

■95137  Re[4]: 仕様?誤使用?
□投稿者/ ぶなっぷ -(2020/06/25(Thu) 09:22:06)
    書いてて、気づきました。
    Dispose()用ですね (;^_^A
記事No.95114 のレス /過去ログ165より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -