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

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

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

全過去ログを検索

<< 0 >>
■46041  Re[9]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ たくボン -(2010/01/23(Sat) 21:32:24)
記事No.45896 のレス /過去ログ78より / 関連記事表示
削除チェック/

■46042  Re[10]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ なちゃ -(2010/01/23(Sat) 21:58:46)
    No46041 (たくボン さん) に返信
    > ■No46016 (なちゃ さん) に返信
    >>■No45950 (たくボン さん) に返信
    >>プロパティを「リセット」すると、コンテナと同一のインスタンスになったりします。
    >>※リセットした場合はDisposeしてはだめですし、同じフォントを設定した場合はDisposeする必要があることになります。
    >
    > http://msdn.microsoft.com/ja-jp/magazine/bb985010.aspx
    > http://msdn.microsoft.com/ja-jp/library/b1yfkh5e(VS.80).aspx
    > http://msdn.microsoft.com/ja-jp/library/system.drawing.font.dispose(VS.80).aspx
    > フォントのリソースが解放されるタイミングはいつかな?

    いまいち何が言いたいのか意図がよく分かりません。
    私が書いたことのどの部分に対して、何を言いたいのかはっきり書いてもらえないでしょうか?

    私が書いた
    >>※リセットした場合はDisposeしてはだめですし、同じフォントを設定した場合はDisposeする必要があることになります。
    は、
    もしデザイナ上でリセットした場合はコンテナと同一のFormインスタンスが設定されているので、コントロール側で不要になっても勝手にDisposeなんか実行してはいけないし(コンテナ側ではまだ使用中)、
    リセットではなく同じフォントを設定したのなら、別インスタンスなのでコントロール側で不要になったらDisposeを実行しないといけない(コンテナ側では使用していない)、
    でもこんな風にデザイナでの操作で変わってしまうような動きなので、自分で作るプログラムでもきちんと管理できていないことが多いだろう、
    だから、フォントを変える時に(必要な場合のみ)Disposeを呼ぶというやり方は現実的にあまり安全ではないだろう
    ということです。


    > >radioButtonA.Font.Dispose();
    > >radioButtonA.Font = null;
    > をするのとしない時のGCの動作の違いは?

    これは質問ですか?
    nullの代入は実質的には動作に影響はない(動作は変わりますが最終結果は変わらない)のでおいとくとして、
    Disposeを呼べば、その時点でradioButtonAに設定されていたFontの(ネイティブな)リソースが解放されて、そのうえでSuppressFinalizeによりFinalize対象から外されます。
    ※もし、FontのインスタンスがコンテナのFontと同一のものなら、後で問題が発生する危険があるでしょう。

    Disposeを呼ばなければ、そのあとの別のフォントの代入によって参照が外れますので、その時点でGC「対象」になるでしょう。
    次のGC時にファイナライズ対象になり、そのうちファイナライざスレッドでリソースが解放され、さらにその次のGC時にメモリ回収されるでしょう。
    ※もし、FontのインスタンスがコンテナのFontと同一のものなら、何もしないのと実質変わりません(コンテナからの参照が生きているため、GC対象にはならない)。


    あるいは何か別のことが言いたかった(聞きたかった)でしょうか?
記事No.45896 のレス /過去ログ78より / 関連記事表示
削除チェック/

■46048  Re[11]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ たくボン -(2010/01/23(Sat) 23:08:23)
    No46042 (なちゃ さん) に返信
    > ■No46041 (たくボン さん) に返信
    >>■No46016 (なちゃ さん) に返信
    > >>■No45950 (たくボン さん) に返信
    > >>プロパティを「リセット」すると、コンテナと同一のインスタンスになったりします。
    > >>※リセットした場合はDisposeしてはだめですし、同じフォントを設定した場合はDisposeする必要があることになります。
    >>
    >>http://msdn.microsoft.com/ja-jp/magazine/bb985010.aspx
    >>http://msdn.microsoft.com/ja-jp/library/b1yfkh5e(VS.80).aspx
    >>http://msdn.microsoft.com/ja-jp/library/system.drawing.font.dispose(VS.80).aspx
    >>フォントのリソースが解放されるタイミングはいつかな?
    >
    > いまいち何が言いたいのか意図がよく分かりません。
    > 私が書いたことのどの部分に対して、何を言いたいのかはっきり書いてもらえないでしょうか?
    >
    > 私が書いた
    > >>※リセットした場合はDisposeしてはだめですし、同じフォントを設定した場合はDisposeする必要があることになります。
    > は、
    > もしデザイナ上でリセットした場合はコンテナと同一のFormインスタンスが設定されているので、コントロール側で不要になっても勝手にDisposeなんか実行してはいけないし(コンテナ側ではまだ使用中)、
    > リセットではなく同じフォントを設定したのなら、別インスタンスなのでコントロール側で不要になったらDisposeを実行しないといけない(コンテナ側では使用していない)、
    > でもこんな風にデザイナでの操作で変わってしまうような動きなので、自分で作るプログラムでもきちんと管理できていないことが多いだろう、
    > だから、フォントを変える時に(必要な場合のみ)Disposeを呼ぶというやり方は現実的にあまり安全ではないだろう
    > ということです。

    安全ではない?本当に?

    > nullの代入は実質的には動作に影響はない(動作は変わりますが最終結果は変わらない)のでおいとくとして、
    おいておくんだ。確かに最終結果は変わらないね。

    > Disposeを呼べば、その時点でradioButtonAに設定されていたFontの(ネイティブな)リソースが解放されて、そのうえでSuppressFinalizeによりFinalize対象から外されます。
    radioButtonA.Fontは外れるよね。これで次回のGCでは一応このFontがガベージ対象になるかもしれないって訳だ。

    > ※もし、FontのインスタンスがコンテナのFontと同一のものなら、後で問題が発生する危険があるでしょう。
    どんな問題だろう?リソースが解放されてしまう危険?

    > Disposeを呼ばなければ、そのあとの別のフォントの代入によって参照が外れますので、その時点でGC「対象」になるでしょう。
    確かにGC対象にはなるけどDisposeを明示的に呼ぶ場合と、呼ばなかった場合はFinalizeの動作が変わってこない?

    > 次のGC時にファイナライズ対象になり、そのうちファイナライざスレッドでリソースが解放され、さらにその次のGC時にメモリ回収されるでしょう。
    さて、ここで問題。ファイナライザメソッドが呼び出されるのはどのタイミングか?
    ファイナライザが回収すべき(Finalizeメソッド)は、どこで管理されてて、いつ登録されるのか?

    > ※もし、FontのインスタンスがコンテナのFontと同一のものなら、何もしないのと実質変わりません(コンテナからの参照が生きているため、GC対象にはならない)。
    一応解ってるみたいだけど。


    MSがGCを採用した背景には、ガベージで管理するメモリはピンキリのプログラマがいるから、そいつらなんかにメモリの管理なんかまかせてられないってのがあるのは周知の事実。(へっぽこプログラマのせいでOSのせいにされちゃかなわないから)

    そこでClose、DisposeとFinalizeメソッドを用意したんだけど、これだけでも不安は残る。特にStringクラスに代表されるような頻繁に可変長になる領域や同一リソースの重複はGCにとって、あまり歓迎されるものでもない。これはWin32の頃からAtomとかで色々してたから、.NETでも同じようなしくみは用意してると思う(でないとわざわざStrngとStringBuilderを分けてないはず)

    さらに言えば、システムで用意しているSystemColorやSystemBrushesのようなオブジェクトはプログラマに公開してリソースの節約を図りたいけど、Disposeされる危険もある。クラス設計者はDisposeが何度呼ばれても大丈夫なように設計してるはずだろうし、プログラマがDisposeを呼び出してくれることを期待してもいけない。

    だからファイナライザとFリーチャブルキューの機能を設けて、参照されているオブジェクトの保護もしてるってこと。

    Dsiposeしない場合は、不要なオブジェクトとマーキングされて、オブジェクトの回収の段階で完全キューからFリーチャブルキューを参照。FontオブジェクトはFinalizeを実装してるから、Fリーチャブルキューに入れて次回のGCで最終的なゴミと判断してFinalize。


    > このように自分でプログラムを作成している時でも、この辺りのプロパティのインスタンスがどうなっているかは
    > 結構分かりにくかったり、予想と違う動作をしていたりもしますので、はっきりいってあまりきちんと管理できて
    > いないことの方が多いように思います。

    まったくその通り。
    管理ができないならGCにまかせておけばいいと思うよ。

    そのためのウルトラマンだし。

    下手にDisposeとFinalizeを書かれてたりしたら、悩む材料なだけだし(ひどく言えばバグのもとにもなる。今は内部的にどうなったかわからんけどVS2005の暗黙的なFormとかは、この手の問題を抱えてたから、GCされる時にDisposeしてたりしてたら実際バグる時もあったし。この手のバグはGCと絡むから追跡しにくいバグだし、設計がちゃんとしてれば問題なかったはず。)

    これくらい言えばわかってもらえたかな?

    わからなかったら
    selectedFont = new Font
    だけでいいと思う。メモリ管理はGCに任せておけばOK(そのためのGCだし)
記事No.45896 のレス /過去ログ78より / 関連記事表示
削除チェック/

■48461  Re[1]: お互いに参照しているクラスは消えるのでしょうか?
□投稿者/ Azulean -(2010/04/07(Wed) 07:15:29)
記事No.48458 のレス /過去ログ82より / 関連記事表示
削除チェック/

■53615  textboxのEnable状態の文字色指定の方法について
□投稿者/ とっぱっ -(2010/09/21(Tue) 04:14:31)

    分類:[.NET 全般] 

    textboxをEnable=falseにした状態で、テキストの色を紫にしたいのですが
    textBox1.ForeColor = Color.Violet;
    のように記述してみたところ、色が反映されませんでした。
    (Enable=trueなら紫色になります)

    これを実現するためには、どのような方法が考えられますでしょうか?
    アドバイス・ヒントなどお願いします。


    環境
    .NET Framework 4
    C#
親記事 /過去ログ90より / 関連記事表示
削除チェック/

■54727  Re[3]: void*からManaged型へのキャスト
□投稿者/ Azulean -(2010/10/30(Sat) 20:50:21)
    No54726 (hirokawa さん) に返信
    > Managed Handleとはマネージ型のオブジェクトに対するポインタのようなものという理解でしたが,
    > 実際は見た目以上に違うものなのでしょうか.

    ^ は Handle to Object on Managed Heap と定義されており、ポインタとは異なる存在です。
    感覚的にはポインタのようなものですが、実態は異なります。
    http://msdn.microsoft.com/en-us/library/yk97tc08.aspx

    マネージヒープ内のオブジェクトはガベージコレクションの際に移動される可能性があります。
    従って、ネイティブなポインタは固定しない限り、取り出せないものとされています。

    詳しくはこのあたりをご覧ください。
    http://msdn.microsoft.com/ja-jp/library/bb985010.aspx
    http://msdn.microsoft.com/ja-jp/library/dd297765.aspx


    > このような問題は,例えばネイティブコードを.NET用に変換する際に
    > よく起こりそうなものですが,皆さんはどうしているのでしょうか?
    完全に C++/CLI にして良い関数なら、void* なんて渡さずに、Object 型で渡したら良いと思います。
    場合によってはデリゲートと Marshal::GetFunctionPointerForDelegate の組み合わせもありかもしれません。
    場面によって方法は異なるかもしれませんが、void* でマネージャオブジェクトを渡さない方法を目指すべきです。

    あとは、すべて C++/CLI にするんじゃなくて、必要な部分だけ C++/CLI でラッパーを作って、ネイティブのコードはネイティブのままにしておくとか。
記事No.54724 のレス /過去ログ91より / 関連記事表示
削除チェック/

■54728  Re[4]: void*からManaged型へのキャスト
□投稿者/ hirokawa -(2010/10/30(Sat) 21:33:23)
    No54727 (Azulean さん) に返信
    > ■No54726 (hirokawa さん) に返信
    >>Managed Handleとはマネージ型のオブジェクトに対するポインタのようなものという理解でしたが,
    >>実際は見た目以上に違うものなのでしょうか.
    >
    > ^ は Handle to Object on Managed Heap と定義されており、ポインタとは異なる存在です。
    > 感覚的にはポインタのようなものですが、実態は異なります。
    > http://msdn.microsoft.com/en-us/library/yk97tc08.aspx
    >
    > マネージヒープ内のオブジェクトはガベージコレクションの際に移動される可能性があります。
    > 従って、ネイティブなポインタは固定しない限り、取り出せないものとされています。
    >
    > 詳しくはこのあたりをご覧ください。
    > http://msdn.microsoft.com/ja-jp/library/bb985010.aspx
    > http://msdn.microsoft.com/ja-jp/library/dd297765.aspx
    回答有難う御座います
    参考にさせていただきます


    >>このような問題は,例えばネイティブコードを.NET用に変換する際に
    >>よく起こりそうなものですが,皆さんはどうしているのでしょうか?
    > 完全に C++/CLI にして良い関数なら、void* なんて渡さずに、Object 型で渡したら良いと思います。
    > 場合によってはデリゲートと Marshal::GetFunctionPointerForDelegate の組み合わせもありかもしれません。
    > 場面によって方法は異なるかもしれませんが、void* でマネージャオブジェクトを渡さない方法を目指すべきです。
    >
    > あとは、すべて C++/CLI にするんじゃなくて、必要な部分だけ C++/CLI でラッパーを作って、ネイティブのコードはネイティブのままにしておくとか。
    なるほど.元の引数の型を変えるという発想はありませんでした.
    関数間の呼び出し関係を整理して必要な部分だけCLIでラッパーを作るという方向でいこうと思います.

    回答してくださった皆様,有難う御座いました.
記事No.54724 のレス / END /過去ログ91より / 関連記事表示
削除チェック/

■68838  EnumにTypeConvertorで設定した日本語名を取得
□投稿者/ むぅ -(2013/11/21(Thu) 14:07:44)

    分類:[C#] 

    VS2010 C# .net3.5 Windows7 32/64bit

    お世話になります。

    PropertyGridに選択したオブジェクトのプロパティを日本語に表示するため、
    以下のサイトを参考にTypeConvertorで実装しています。

    ●PropertyGridコントロールに表示されるプロパティ名を変更するには? 
    http://www.atmarkit.co.jp/fdotnet/dotnettips/291pgridjapan/pgridjapan.html

    プロパティと設定された値の日本語表記を別のListViewに登録するため、取得したいです。

    プロパティ名の取得はできました。

    private string GetName<T>(T obTarget)
    {
    //Publicメンバを取得する
    MemberInfo[] members = typeof(T).GetProperties
    (BindingFlags.Public |
    BindingFlags.Instance |
    BindingFlags.DeclaredOnly);

    AttributeCollection attributes = TypeDescriptor.GetProperties(obTarget)[members[nIndex].Name].Attributes;
    PropertyDisplayNameAttribute NameAttr = (PropertyDisplayNameAttribute)attributes[typeof(PropertyDisplayNameAttribute)];
    //NameAttr.PropertyDisplayName で日本語名称を取得できる。

    設定された値ですが、Enum型のデータを設定するものがあり、以下のように定義しています。

    [TypeConverter(typeof(EnumDisplayNameConverter))]
    public enum EnumBool
    {
    [PropertyDisplayName("Yes")]
    val0 = 0,
    [PropertyDisplayName("No")]
    val1 = 1
    }

    上記の日本語表記を取得するためにどのようなコードを記載すればよろしいでしょうか。

    どちら様かご教示のほど、よろしくお願いしますm(__)m。


親記事 /過去ログ117より / 関連記事表示
削除チェック/

■85010  Re[1]: 正規表現の考え方がわかりません
□投稿者/ 魔界の仮面弁士 -(2017/09/05(Tue) 10:57:21)
    2017/09/05(Tue) 11:36:37 編集(投稿者)

    No85005 (夜叉丸 さん) に返信
    > ra.ToString() = "{X=3, Y=6, Width=9, Height=12}"
    > Match m = new Regex(@"{X=(?<X>[-]*\d+),Y=(?<Y>[-]*\d+),Width=(?<Width>[-]*\d+),Height=(?<Height>[-]*\d+)}").Match(ra.ToString());

    これではヒットしないと思いますよ。元の文字列が
    "{X=3, Y=6, Width=9, Height=12}" ではなく
    "{X=3,Y=6,Width=9,Height=12}" であったのなら、
    m.Groups["X"] で拾えるでしょうけれども。

    カンマの後に空白を許容したいのであれば、
    "," ではなく ", " や ",\s*" に変更してみてください。


    > int ix = (int.TryParse(m.Groups["X"].ToString(), out ix)) ? ix : 0;
    false 判定時には 0 が出力される仕様なので、三項演算子を使わずに
     int ix; int.TryParse(m.Groups["X"].ToString(), out ix);
    あるいは
     int ix; int.TryParse(m.Groups["X"].Value, out ix);
    でも OK ですね。


    > この場合
    > "3" = "(?<X>[-]*\d+)" であらわされるということですよね。
    元の文字列に空白が含まれていなければ "3" になると思います。


    > [-] 連続した文字範囲の1文字 : あるかもしれないしないかもしれないマイナスフラグ
    "[-]" は "-" と同義で、それ自体は単なる - 記号です。


    > * 直前の文字が0回以上繰り返す。 : なので先頭だから繰り返さないので0回以上?
    すなわち、"X=---3" のような文字列に対してもヒットします。
    この場合、--- 部がキャプチャされて m.Groups["X"].Value == "---3" となります。

    もしも「符号があるかもしれないし無いかもしれない」にしたいのであれば、
    "[+-]?" の方が良いかもしれません。


    > \d 0から9までの数字       : 数字を使用
    半角の "3" だけでなく
    全角の "3" にもヒットします。


    > ところが同様にfloat の場合どうすればよいのかわかりません。
    単純には
     [+-]?[0-9]+[.]?[0-9]([eE][+-])?[0-9]
    などが思い当たります。

    float 値として float.NaN や float.NegativeInfinity が含まれる場合にも
    対処が必要なら、もう一ひねり必要かも知れません。


    // RectangleF r = new RectangleF(float.Epsilon, float.NaN, float.NegativeInfinity, float.PositiveInfinity);
    // string rs = r.ToString();
記事No.85005 のレス /過去ログ145より / 関連記事表示
削除チェック/

■85015  Re[2]: 正規表現の考え方がわかりません
□投稿者/ 夜叉丸 -(2017/09/05(Tue) 13:55:07)
    No85010 (魔界の仮面弁士 さん) に返信
    > 2017/09/05(Tue) 11:36:37 編集(投稿者)

    >>ra.ToString() = "{X=3, Y=6, Width=9, Height=12}"
    >>Match m = new Regex(@"{X=(?<X>[-]*\d+),Y=(?<Y>[-]*\d+),Width=(?<Width>[-]*\d+),Height=(?<Height>[-]*\d+)}").Match(ra.ToString());
    >
    > これではヒットしないと思いますよ。元の文字列が
    > "{X=3, Y=6, Width=9, Height=12}" ではなく
    > "{X=3,Y=6,Width=9,Height=12}" であったのなら、
    > m.Groups["X"] で拾えるでしょうけれども。

    Rectangle ra = new Rectangle(3,6,9,12);
    です。確認したら"{X=3,Y=6,Width=9,Height=12}"でした。

    > 単純には
    >  [+-]?[0-9]+[.]?[0-9]([eE][+-])?[0-9]
    > などが思い当たります。
    例外はハンドルされていませんとなります。
    System.ArgumentException:'解析中 "{X~(?<X>[+-]?[0-9]+.]?[0-9]([eE]・・・・・

    RectangleF raf = new RectangleF(3f, -6.2f, 9.3f, 12.4f);
    Match f = new Regex(@"{X=(?<X>[+-]?[0-9]+[.]?[0-9]([eE][+-])?[0-9])," +
    "Y=(?<Y>[+-]?[0-9]+[.]?[0-9]([eE][+-])?[0-9])," +
    "Width=(?<Width>[+-]?[0-9]+[.]?[0-9]([eE][+-])?[0-9]))," +
    "Height=(?<Height>[+-]?[0-9]+[.]?[0-9]([eE][+-])?[0-9]))}").Match(raf.ToString());
記事No.85005 のレス /過去ログ145より / 関連記事表示
削除チェック/

■91057  Re[1]: Win10 version1089 複数Form 起動エラー
□投稿者/ PANG2 -(2019/05/22(Wed) 13:57:49)
    for (int i = 0; i < 5; i++) {
    Form f = new Form();
    f.Show();
    System.Diagnostics.Debug.WriteLine("GetTotalMemory = " + GC.GetTotalMemory(false));
    }

    空Formだと問題はないので、FormOrg に何らかの問題があることになります。
記事No.91056 のレス /過去ログ157より / 関連記事表示
削除チェック/

■101999  電卓プログラムでの四則演算
□投稿者/ goz -(2023/05/25(Thu) 19:28:00)

    分類:[C#] 

    C#初心者ですがよろしくお願いします。

    C#で電卓で四則演算ができるアプリを作っております。

    通常の括弧の計算はデータテーブルに入れて計算をしているのですが、下記のような()を省略した計算をがうまくいきません。

    A(B+C)

    (A+B)(C+D)

    (A+B)C

    現状は省略した箇所に*を置換して処理をしております。

    hug = hug.Replace(")(",")*(");
    hug = hug.Replace(@"\d(", @"\d*(");
    hug = hug.Replace(@")\d", @")*\d");

    上2つはうまくいくのですが、一番下がうまくいきません。
    なにかアドバイスを頂けるとたかります。
親記事 /過去ログ178より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -