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

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

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

全過去ログを検索

<< 0 >>
■32972  Re[5]: for文
□投稿者/ επιστημη -(2009/02/18(Wed) 11:55:27)
>
    > しむらー、コメント部分コメント部分

    ヒギィ
記事No.32965 のレス /過去ログ58より / 関連記事表示
削除チェック/

■39533  Re[14]: クリックの有効範囲を決める
□投稿者/ επιστημη -(2009/08/10(Mon) 17:22:52)
>
    分子,分母あるいはその両方をdoubleにキャストしましょう。
記事No.39376 のレス /過去ログ68より / 関連記事表示
削除チェック/

■52910  Re[5]: DrawLinesで、線がガタガタに見えてしまう
□投稿者/ かおりQ -(2010/08/27(Fri) 16:02:52)
    No52909 (よねKEN さん) に返信
    > 例えば、3x3のピクセルで線を引くと以下のようになります。
    > 15度や30度の表現も無理やりですが、5度、10度傾けた線なら、どのように表現しましょうか?
    > (さらに1度だけ傾けた線なら・・・)

    なるほど、分かりやすいご回答ありがとうございます。
    がたつきは解像度依存で仕方が無いので、
    多少ぼやけても、アンチエイリアスを使うことにします。

    ありがとうございました!
記事No.52883 のレス / END /過去ログ89より / 関連記事表示
削除チェック/

■55902  Re[8]: サービスからWin32アプリケーションの起動
□投稿者/ ちゃっぴ -(2010/12/17(Fri) 16:49:43)
>
    読み返したら。

    > バックアップはSQLサーバのデータをMDB(ファイル)へデータ転送しています。

    SQL Server Database Engine service 停止せずに SSIS package 作って実行で問題無いでしょうに。
    他の service 停止している?

    なんか、不必要に面倒な設計にしているような気がするんですが。
記事No.55845 のレス /過去ログ94より / 関連記事表示
削除チェック/

■84156  Selectを使ってエラーが出た時の原因
□投稿者/ 夜叉丸 -(2017/05/24(Wed) 11:22:52)

    分類:[.NET 全般] 

    お世話になります。

     arryrow = dttemp.Select("", "DNAME").ToArray();

    このコード:DNAME 順で並び変えたいだけなのですが
    実行するパソコンでエラーが発生するものと発生しないものがあります。
    原因がなんなのかわからなくて困っているのですがわかる方いませんでしょうか?

    DataRow[] arryrow = arryrow = dttemp.Select("", "DNAME").ToArray();

    ↓↓↓↓↓↓↓↓↓↓

    DataRow[] arryrow = null;
    try
    {
     arryrow = dttemp.Select("", "DNAME").ToArray();
    }
    catch(Exception ex)
    {
     WriteFile("---------- Select ----------" + ex.Message);
     return;
    }

    public void WriteFile(string text)
    {
     string filePath = @System.Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\\debug.txt";
     StreamWriter sw = new StreamWriter(filePath, true, Encoding.GetEncoding("shift_jis"));
     sw.Write(text + "\r\n");
     sw.Close();
    }

    これで表示されるエラーメッセージは
    インデックスエラーでした

    直前の DataTable dttemp の内容は OKなPCもNGなPCも 同じでした

    List<string> strlst = new List<string>();
    for(int icnum = 0; icnum < dttemp.Columns.Count; icnum++) strlst.Add(dttemp.Columns[icnum].ColumnName);
    WriteFile(string.Join(" ", strlst));
    for(int irnum = 0; irnum < dttemp.Rows.Count; irnum++)
    {
     strlst.Clear();
     for(int icnum = 0; icnum < dttemp.Rows[irnum].Table.Columns.Count; icnum++)
      strlst.Add(dttemp.Rows[irnum][icnum].ToString());
     WriteFile(string.Join(" ", strlst));
    }
親記事 /過去ログ144より / 関連記事表示
削除チェック/

■92572  rgbによるbackcolorの表示
□投稿者/ C#初心者 -(2019/10/08(Tue) 15:04:05)

    分類:[C#] 

    C# visual studio 2019

    C#を初めて間もない初心者です。

    C#でのアプリケーション作成でtextboxのBackColorをグラデーション形式で黒から白、白から黒に変更するものを作成したいのですが、途中の表示がうまくいきません。

    今のところ
    private void Button1_Click_1(object sender, EventArgs e)
    {
    int j = 255;

    for (int i = 0; i <= 255; i++)
    {
    Thread.Sleep(100);
    textBox1.BackColor = Color.FromArgb(i, i, i);
    textBox2.BackColor = Color.FromArgb(j, j, j);
    textBox3.BackColor = Color.FromArgb(j, j, j);
    textBox4.BackColor = Color.FromArgb(i, i, i);
    j--;
    }
    といった形で記述しているのですが、クリックを押して一定時間がたつと色が一気に白から黒、黒から白に代わってしまいます。

    なぜこのようになってしまうのかアドバイスを頂けたらと思います。
親記事 /過去ログ160より / 関連記事表示
削除チェック/

■92573  Re[1]: rgbによるbackcolorの表示
□投稿者/ 魔界の仮面弁士 -(2019/10/08(Tue) 15:40:33)
    No92572 (C#初心者 さん) に返信
    > C#でのアプリケーション作成でtextboxのBackColorを

    背景色だけでなく、文字色も考慮した方がよいかと。


    > グラデーション形式で黒から白、白から黒に変更するものを作成したいのですが、途中の表示がうまくいきません。

    画面描画は「イベント処理を抜けた後」のアイドル時に行われるためです。
    処理中(ビジー状態)は直ちに反映されません。


    100 ミリ秒ごとに背景色を変えたいのであれば、ループ処理で実行するのではなく、
    Timer を画面に貼り、Interval を 100ミリ秒程度にした上で、
    Tick イベントが発生するたびに、BackColor を変更するようにしてみてください。


    > Thread.Sleep(100);

    画面上 (UI スレッド)から Thread.Sleep を呼び出してはいけません。
    また、Click イベントに長時間(数秒以上)の長い処理を行わせるのも避けましょう。
記事No.92572 のレス /過去ログ160より / 関連記事表示
削除チェック/

■92577  Re[2]: rgbによるbackcolorの表示
□投稿者/ 大谷刑部 -(2019/10/08(Tue) 16:35:24)
    No92573 (魔界の仮面弁士 さん) に返信
    > ■No92572 (C#初心者 さん) に返信
    >>グラデーション形式で黒から白、白から黒に変更するものを作成したいのですが、途中の表示がうまくいきません。
    >
    > 画面描画は「イベント処理を抜けた後」のアイドル時に行われるためです。
    > 処理中(ビジー状態)は直ちに反映されません。
    なので、sleepとプロパティーの設定だけだと肉眼で確認する前に次の色に変わっているという現象になっていると想像されます。

    > 100 ミリ秒ごとに背景色を変えたいのであれば、ループ処理で実行するのではなく、
    > Timer を画面に貼り、Interval を 100ミリ秒程度にした上で、
    > Tick イベントが発生するたびに、BackColor を変更するようにしてみてください。
    こっちのやり方の方が結果的に書くコードはシンプルになるのかもしれませんね。
    ただまあ、この程度の処理(白⇔黒)であれば、メモリ負荷とかにそれほどクリティカルな影響はないのforループでもいいんじゃないでしょうか?
    3原色分全部ループ(255の3重ループ)とかなら明らかにやめた方がいいとは思いますが。

    >>Thread.Sleep(100);
    >
    > 画面上 (UI スレッド)から Thread.Sleep を呼び出してはいけません。
    win7 32bitの環境で試した(refleshで肉眼確認)限りでは、
    1000MS(1秒)では変化は細かいが若干間延びしてイライラする、10MSだと変化が速すぎてわかりずらい感じを受けるので
    どういう手段をとるかは別として間隔は100MSで妥当な気はします。
    ただし、マシンスペック、OSが32bitか64bitで見える印象は結構変わると思いますので、質問者さん自身で試して妥当な線を決めた方がいいと思います。

    > また、Click イベントに長時間(数秒以上)の長い処理を行わせるのも避けましょう。
    クリックイベントならそこまでクリティカルに考えなくてもよいような(あくまで主観ですが)
    Form_Load、XX_Activateなど画面全体の描画に絡むイベントでは絶対やらない方がいいですね。
    グリッドにデータ反映とかでも行数多すぎるとたまに描画に絡むエラーになったりしますからね。




記事No.92572 のレス /過去ログ160より / 関連記事表示
削除チェック/

■92578  Re[3]: rgbによるbackcolorの表示
□投稿者/ 魔界の仮面弁士 -(2019/10/08(Tue) 17:45:17)
    2019/10/08(Tue) 19:43:03 編集(投稿者)

    No92577 (大谷刑部 さん) に返信
    > なので、sleepとプロパティーの設定だけだと肉眼で確認する前に次の色に変わっているという現象になっていると想像されます。

    いいえ。イベント処理中は、そもそもメッセージループが処理されないので、
    肉眼でも心眼でも変化しません。背景色が実際に変わるのは、
    イベントを抜けた後(のアイドル時)になります。

    Click イベントの最中に強制的に再描画させたいのであれば、
    BackColor の変更後に Update メソッドを呼ぶなどの処置が必要です。


    // ListBox と Button を貼り、
    // Button の Click イベントを割り当てておきます
    public partial class Form1 : Form
    {
      public Form1()
      {
        InitializeComponent();
        Controls.Add(editBox1 = new EditBox(listBox1) { Name = "editBox1" });
      }

      private void button1_Click(object sender, EventArgs e)
      {
        listBox1.Items.Insert(0, "==> button1_Click");
        for (int i = 0; i <= 255; i++)
        {
          editBox1.BackColor = Color.FromArgb(i, i, i);
          // editBox1.Update();
        }
        listBox1.Items.Insert(0, "<== button1_Click");
      }

      // TextBox に届く Windows Message を捉えて表示する実験
      private EditBox editBox1;
      private class EditBox : TextBox
      {
        private ListBox listBox1;
        public EditBox(ListBox listBox1) { this.listBox1 = listBox1; }

        private int Count = 0;
        protected override void WndProc(ref Message m)
        {
          // 受信したメッセージを、親フォームの ListBox に表示
          listBox1.Items.Insert(0, ++Count + "\t" + m.ToString());
          base.WndProc(ref m);
        }
      }
    }



    > ただまあ、この程度の処理(白⇔黒)であれば、メモリ負荷とかに
    > それほどクリティカルな影響はないのforループでもいいんじゃないでしょうか?

    『await Task.Delay(100);』とかであればいざ知らず、元の処理は
    『Thread.Sleep(100);』を使っている点が問題になるかと思います。

    OS にとってのメモリ負荷や CPU 負荷が軽微であったとしても、
    元のコードだと 256 × 100msec なのですから、Click するだけで
    25 秒以上も自アプリが待機状態(フリーズ状態)になりますよね…?

    そもそも Sleep を実施している間、画面の再描画も行われないため、
    このような待ち合わせ方法には、あまり意味が無いでしょう。

    Sleep はスレッドの動作を一時的に止めてしまうため、
    先のループ処理の間、キーボード入力やフォームの移動はおろか、
    OS の再起動要求も受けられないことになるわけで、
    Windows App の実装方法としては、かなり問題があるかと思います。



    Sleep メソッドのリファレンスより引用:
    > このメソッドは、標準 COM/SendMessage ポンピングを実行しません。

    Sleep API のリファレンスより引用:
    > Sleep 関数と、ウィンドウを直接的または間接的に作成するコードを組み合わせて
    > 使う場合は、注意が必要です。1 つのスレッドがウィンドウを作成した場合、
    > そのスレッドはそのウィンドウに関係するメッセージを処理しなければなりません。
    > また、メッセージのブロードキャスト(同報送信)が発生した場合、
    > システム内のすべてのウィンドウへそのメッセージが送信されます。


    ウィンドウメッセージを受け取らないスレッド
    (コンソールアプリやワーカースレッド等)であれば、
    Sleep メソッドで待機しても問題ありません。
記事No.92572 のレス /過去ログ160より / 関連記事表示
削除チェック/

■92584  Re[4]: rgbによるbackcolorの表示
□投稿者/ 大谷刑部 -(2019/10/09(Wed) 09:35:05)
    No92578 (魔界の仮面弁士 さん) に返信
    > 2019/10/08(Tue) 19:43:03 編集(投稿者)
    >
    > ■No92577 (大谷刑部 さん) に返信
    >>なので、sleepとプロパティーの設定だけだと肉眼で確認する前に次の色に変わっているという現象になっていると想像されます。
    >
    > いいえ。イベント処理中は、そもそもメッセージループが処理されないので、
    > 肉眼でも心眼でも変化しません。背景色が実際に変わるのは、
    > イベントを抜けた後(のアイドル時)になります。
    そんなことはないでしょう、refleshで見た目は変わりましたよ。

    > OS にとってのメモリ負荷や CPU 負荷が軽微であったとしても、
    > 元のコードだと 256 × 100msec なのですから、Click するだけで
    > 25 秒以上も自アプリが待機状態(フリーズ状態)になりますよね…?
    人の感覚次第かもしれませんが、質問者さんは色の移り変わりを見たいのでしょ?
    であれば25秒はさほど長いとは思いません。
    仮に、お客さんに納品するPGとしても、そうそう、数秒でイラつくお客さんばっかりじゃないでしょう。
    現実問題、4分以上処理中メッセージも何も出ず、ただひたすら砂時計が処理中モードになるだけというプログラムは実際に存在します。

    > そもそも Sleep を実施している間、画面の再描画も行われないため、
    > このような待ち合わせ方法には、あまり意味が無いでしょう。
    >
    > Sleep はスレッドの動作を一時的に止めてしまうため、
    > 先のループ処理の間、キーボード入力やフォームの移動はおろか、
    > OS の再起動要求も受けられないことになるわけで、
    > Windows App の実装方法としては、かなり問題があるかと思います。
    問題はおっしゃるような厳密性がこのケースで必要かどうかです。

    質問者もタイマーイベントで解決とおっしゃっているので、Sleepの是非についてはこのあたりでよろしいんじゃないでしょうか?

記事No.92572 のレス /過去ログ160より / 関連記事表示
削除チェック/

■92575  Re[2]: rgbによるbackcolorの表示
□投稿者/ C#初心者 -(2019/10/08(Tue) 16:24:14)
    No92573 (魔界の仮面弁士 さん) に返信
    > ■No92572 (C#初心者 さん) に返信
    >>C#でのアプリケーション作成でtextboxのBackColorを
    >
    > 背景色だけでなく、文字色も考慮した方がよいかと。
    >
    >
    >>グラデーション形式で黒から白、白から黒に変更するものを作成したいのですが、途中の表示がうまくいきません。
    >
    > 画面描画は「イベント処理を抜けた後」のアイドル時に行われるためです。
    > 処理中(ビジー状態)は直ちに反映されません。
    >
    >
    > 100 ミリ秒ごとに背景色を変えたいのであれば、ループ処理で実行するのではなく、
    > Timer を画面に貼り、Interval を 100ミリ秒程度にした上で、
    > Tick イベントが発生するたびに、BackColor を変更するようにしてみてください。
    >
    >
    >>Thread.Sleep(100);
    >
    > 画面上 (UI スレッド)から Thread.Sleep を呼び出してはいけません。
    > また、Click イベントに長時間(数秒以上)の長い処理を行わせるのも避けましょう。


    ご返信ありがとうございます。
    先ほどtimerを使用したやり方を試したところ無事に表示することができました。

    迅速に回答いただき本当にありがとうございます。
記事No.92572 のレス /過去ログ160より / 関連記事表示
削除チェック/

■92574  Re[1]: rgbによるbackcolorの表示
□投稿者/ 大谷刑部 -(2019/10/08(Tue) 16:04:19)
    No92572 (C#初心者 さん) に返信
    > といった形で記述しているのですが、クリックを押して一定時間がたつと色が一気に白から黒、黒から白に代わってしまいます。
    >
    > なぜこのようになってしまうのかアドバイスを頂けたらと思います。

    環境(PCの処理能力等)にもよりますが、プロパティーの設定上の色の変更スピードに描画が追い付いてないだけに思えるので、
    設定後にそれぞれのテキストボックスをRefreshするようにすれば、肉眼で確認はできるようになると思います。

    弁さんのおっしゃる技術的べき論はひとまず置いておいての話ですが。
記事No.92572 のレス /過去ログ160より / 関連記事表示
削除チェック/

■92576  Re[2]: rgbによるbackcolorの表示
□投稿者/ C#初心者 -(2019/10/08(Tue) 16:25:55)
    No92574 (大谷刑部 さん) に返信
    > ■No92572 (C#初心者 さん) に返信
    >>といった形で記述しているのですが、クリックを押して一定時間がたつと色が一気に白から黒、黒から白に代わってしまいます。
    >>
    >>なぜこのようになってしまうのかアドバイスを頂けたらと思います。
    >
    > 環境(PCの処理能力等)にもよりますが、プロパティーの設定上の色の変更スピードに描画が追い付いてないだけに思えるので、
    > 設定後にそれぞれのテキストボックスをRefreshするようにすれば、肉眼で確認はできるようになると思います。
    >
    > 弁さんのおっしゃる技術的べき論はひとまず置いておいての話ですが。

    ご返信ありがとうございます。
    timerを使用したところ無事に表示することができ来ました。

    描画処理についても今使用しているOCでは若干不安なところもありますので、今後表示時間を変更等する際に参考にさせていただきます。

    ありがとうございます。
記事No.92572 のレス /過去ログ160より / 関連記事表示
削除チェック/

■92586  Re[2]: rgbによるbackcolorの表示
□投稿者/ まりもん -(2019/10/09(Wed) 10:00:51)
    No92574 (大谷刑部 さん) に返信
    > ■No92572 (C#初心者 さん) に返信
    >>といった形で記述しているのですが、クリックを押して一定時間がたつと色が一気に白から黒、黒から白に代わってしまいます。
    >>
    >>なぜこのようになってしまうのかアドバイスを頂けたらと思います。
    >
    > 環境(PCの処理能力等)にもよりますが、プロパティーの設定上の色の変更スピードに描画が追い付いてないだけに思えるので、
    > 設定後にそれぞれのテキストボックスをRefreshするようにすれば、肉眼で確認はできるようになると思います。
    >
    > 弁さんのおっしゃる技術的べき論はひとまず置いておいての話ですが。

    このような書き方ですと、質問者さんの提示されたコードでも環境によっては色が変化するように取れてしまいますが
    それはありえないのではないですか?
    提示のコードプロパティの値を変化させてただけでは再描画が行われるタイミングは魔界の仮面弁士さんのおっしゃるように
    イベントを抜けた後になります。
    Refreshすれば変わると仰ってますが、Refreshして再描画をそこで行うようにしているからで、プロパティを変化させただけで
    再描画がそのタイミングで行われるわけではないでしょう
記事No.92572 のレス /過去ログ160より / 関連記事表示
削除チェック/

■92588  Re[3]: rgbによるbackcolorの表示
□投稿者/ C#初心者 -(2019/10/09(Wed) 10:46:28)
    様々な意見をいただいていますが、自分はまだ始めたばかりなのでわからないことが多いです。
    現状としては目的の動きをさせることができましたので、またわからないことがあれば質問させていただきます。
記事No.92572 のレス / END /過去ログ160より / 関連記事表示
削除チェック/

■92593  Re[3]: rgbによるbackcolorの表示
□投稿者/ 魔界の仮面弁士 -(2019/10/09(Wed) 12:04:12)
    2019/10/09(Wed) 16:47:18 編集(投稿者)

    No92584 (大谷刑部 さん) に返信
    > 問題はおっしゃるような厳密性がこのケースで必要かどうかです。
    > 質問者もタイマーイベントで解決とおっしゃっているので、

    理屈までいきなり説明しても追いきれないでしょうし、初心者向けには、
    『Form 上で Sleep を呼んではいけない』と伝えるようにしています。
    >>> 画面上 (UI スレッド)から Thread.Sleep を呼び出してはいけません。

    この原則を守ることで問題になることは無いと思いますよ。


    そのための代替案としては、
    案1: Thread.Sleep(t) の代わりに await Task.Delay(t) を使ってもらう
    案2: ループ処理を分割して、Timer でのイベント呼び出しに置き換えてもらう
    案3: Sleep 処理を BackgroundWorker 内に押し込んで、BeginInvoke で BackColor を変更させる
    などが思い当たります。
    No92573 の提案は案2 でしたが No92578 で案1 にも少しだけ言及しています。


    === 以下蛇足 ===

    >>背景色が実際に変わるのは、
    >>イベントを抜けた後(のアイドル時)になります。
    > そんなことはないでしょう、refleshで見た目は変わりましたよ。

    大文字小文字もスペルも間違っているようですが、それはさておき。

    メッセージさえ処理されればよいので、Application.DoEvents(); や
    textBox1.Update(); や textBox1.Refresh(); などを呼び出せば、
    イベントを抜ける前であっても再描画処理が行われます。

    それが先の回答の
    >> Click イベントの最中に強制的に再描画させたいのであれば、
    >> BackColor の変更後に Update メソッドを呼ぶなどの処置が必要です。
    という箇所に当たります。この点については、Sleep を呼んでいるかどうかは影響しません。


    一方、元質問者である C#初心者 さんのコードでは、Refresh や Update 等の
    呼び出しが行われていたわけではありませんので、
    >> イベントを抜けた後(のアイドル時)になります。
    という説明にさせていただきました。


    実際に、先の実験コードを使って確認してもいますが、
    イベント脱出後でないと WndProc が処理されないことを確認しています。
    ループ中で Update や Refresh した場合は、即時処理されるのですけれどね。

    Refresh は Invalidate + Update を呼び出したのと同義となりますが、
    今回のケースでは、BackColor の変更が発生しているわけなので、
    Update だけでも事足りると思います。

    とはいえ、Update や Refresh によって処理されるメッセージは描画関係に限定されます。

    Label ならまだしも、今回の対象は TextBox ですから、
    その他の処理(ユーザー入力等)も阻害されてしまうのはまずいので、
    どちらにせよ Sleep の出番は無さそうです。


    > 人の感覚次第かもしれませんが、質問者さんは色の移り変わりを見たいのでしょ?
    > であれば25秒はさほど長いとは思いません。
    > 仮に、お客さんに納品するPGとしても、そうそう、数秒でイラつくお客さんばっかりじゃないでしょう。

    何か長い処理をしている間、次の処理が行えないとか、
    砂時計カーソルになるとか、キャンセルできないといった話をしているなら、
    それは別に構わないと思います。(それは単にアプリの仕様というだけの話)

    背景色が変化していくアニメーション効果として、
    25 秒間かけて変化させることもまったく問題ありません。問題なのは
    25 秒間応答不能になってしまう点のみであり、「長い処理の間」も
    メッセージループを回すような仕組みにさえなっていれば OK です。

    (たとえば HWND_BROADCAST 向けのメッセージを止めてしまうと、
     自アプリは良くても、他アプリに迷惑がかかります)
記事No.92572 のレス / END /過去ログ160より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -