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

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

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

全過去ログを検索

<< 0 >>
■39191  Re[6]: テキストボックスから数値を入力する際にデフォルトで0が入力
□投稿者/ やじゅ -(2009/07/31(Fri) 11:27:04)
>
    No39190 (みきぬ さん) に返信
    > 私は、デザイナのところで "0" を設定してあげるだけで十分な気がします。
    > (Formのコンストラクタでもいい…まあ同じことだけど)

    そうなんだよね。
    でも、それって質問者さんもすぐに思いつく方法かと思って(^^;
    わざわざ掲示板で質問するんだから、それでは駄目な理由があるのかと深読みしてしまう。
記事No.39056 のレス /過去ログ67より / 関連記事表示
削除チェック/

■45632  Re[1]: VS2008でEXCELファイルを作成したい
□投稿者/ .SHO -(2010/01/17(Sun) 10:01:12)
    No45631 (へたれ さん) に返信

    > もっとも簡単に開発、配布する手段をご教授いただければありがたいです。

    空のエクセルファイルをバイナリデータとしてリソースに埋め込むとか。。。
記事No.45631 のレス /過去ログ77より / 関連記事表示
削除チェック/

■55167  Re[1]: リストボックスの途中にItemを追加する方法について
□投稿者/ 魔界の仮面弁士 -(2010/11/18(Thu) 18:31:49)
    No55166 (ゆる さん) に返信
    > Items.Addでは一番下に追加することしか出来なさそうで、

    Items.Insert で。
記事No.55166 のレス /過去ログ92より / 関連記事表示
削除チェック/

■90072  Re[4]: ユーザーコントロールの使い方
□投稿者/ ルパン -(2019/02/04(Mon) 15:25:16)
    No90071 (魔界の仮面弁士 さん) に返信

    Dispose すると
    配置されているコントロールのデータは破棄されているが
    プライベートで指定している各データは消えないんということですか?
    つまり、Dispose イベント内では完全にユーザーコントロールのデータが
    破棄されているわけではないということでいいのでしょうか?
    イベントを抜けた後に完全破棄されるということですね?


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

■90074  Re[5]: ユーザーコントロールの使い方
□投稿者/ 魔界の仮面弁士 -(2019/02/04(Mon) 16:57:35)
    2019/02/04(Mon) 20:03:33 編集(投稿者)

    No90072 (ルパン さん) に返信
    > Dispose すると
    > 配置されているコントロールのデータは破棄されているが

    コントロールのデータというよりは、コントロールそのものの破棄です。

    繰り返しになりますが、Control クラスにおいては、
    Dispose された際に、Controls プロパティに登録されている
    子コントロール群も Dispose されるように設計されています。
    (子がさらに子を持っていた場合も同様に連鎖します)

    このため UserControl の Disposed 時には、子 Label が既に処分されており、
    Label の Text プロパティが "" を返してしまうわけです。


    いずれにせよ、UserControl や Form や Panel 等の Disposed イベントが
    呼ばれたときには、それらの Controls に追加されていた子孫コントロールは
    「既に処分されていて利用不可能な状態」であるものとして扱うべきです。


    たとえば No90071 でお見せした LabelText プロパティを例に挙げると、
     string LabelText { get { return this._labelText; } }
    という実装の場合には、Dispose された後でも利用できますが、もしもこれを
     string LabelText { get { return this.lbl.Text; } }
    にしていた場合は、Dispose 後にはアクセスすべきでは無いということです。

    lbl 変数(Label クラス)は IDisposable なオブジェクトですが、
    _labelText 変数(String クラス) は IDisposable なオブジェクトでは無いわけで。


    > プライベートで指定している各データは消えないんということですか?

    Dispose された場合、そのクラスが管理していた情報のうち、
    アンマネージなオブジェクトは既に破棄されている状態になります。
    一方、マネージリソースの破棄についてはオプション扱いなのでケースバイケースです。

    また、幾つかのメンバーについては、破棄後にアクセスした場合に
    ObjectDisposedException の例外になるように設計されています。
    (たとえば Handle プロパティなど)



    参考までに Text プロパティの場合、CacheText フラグの付与有無でも動作が異なります。
    Label や TextBox 等の場合、Dispose 直後は "" が返却されるようになりますが、
    Button、TabPage、ToolStripPanel 等では、Dispose 直前の値が利用されます。

    CacheText の有無でどのように変化するか、実験コードを載せておきます。
    下記を実行すると、
      FormClosing:あいうえお/かきくけこ
      Disposed:/かきくけこ
    という結果になることを確認できます。


    public partial class Form1 : Form
    {
     private Class1 label1;
     private Class2 label2;
     public Form1()
     {
      InitializeComponent();
      Controls.Add(label1 = new Class1() { Text = "あいうえお", Top = 30 });
      Controls.Add(label2 = new Class2() { Text = "かきくけこ", Top = 90 });

      this.FormClosing += delegate { System.Diagnostics.Debug.WriteLine("FormClosing:" + label1.Text + "/" + label2.Text); };
      this.Disposed += delegate { System.Diagnostics.Debug.WriteLine("Disposed:" + label1.Text + "/" + label2.Text); };
     }
     private class Class1 : Label { public Class1() { SetStyle(ControlStyles.CacheText, false); } }
     private class Class2 : Label { public Class2() { SetStyle(ControlStyles.CacheText, true); } }
    }


    > つまり、Dispose イベント内では

    「Dispose イベント」ではなく、過去形表記の
    「Disposed イベント」ですね。



    > プライベートで指定している各データは消えないんということですか?

    private か public かは関係ないですよ。
    消えるかどうかは開発者の実装次第です。IDisposable でないオブジェクトは特に。


    .NET Framework 自身が提供しているクラス(Label や UserControl) 自体が持つメンバーではなく、
    それらを継承したクラス(あるいは自作の class 等)に対して追加したメンバーについては、
    Dispose 時にそのデータを処分するかどうかも、開発者自身が決める必要があります。

    もし Dispose された時に自作したメンバーの情報も処分する必要があるのなら、
    そのコントロールの protected な『void Dispose(bool)』メソッドを
    オーバーライドする必要があります。(あるいは Disposed イベントを利用する)
記事No.90068 のレス /過去ログ155より / 関連記事表示
削除チェック/

■90533  Re[8]: AddHandler Eventの別スレッドについて
□投稿者/ 魔界の仮面弁士 -(2019/03/18(Mon) 18:18:44)
    No90531 (TanuTanu さん) に返信
    > しかし、VBAではInternet Explorer_Serverまで辿り付いたのですが
    > VB.NETで子ウィンドウを列挙することが出来ません。

    VBA のコードを移植している、ということでしょうか。

    それでは、VBA の API 宣言と VB2017 の API 宣言の
    【両方】を見せてもらえますか?

    提示をお願いする理由は、特に「ByVal」と「ByRef」の違いが重要だからです。


    引数に ByVal も ByRef も書かなかった場合、
    VBA では ByRef として解釈され、
    .NET では ByVal として解釈される仕様であることにご注意ください。


    > <DllImport("user32")>
    > Function EnumChildWindows(
    >  <[In]()> ByVal hWndParent As IntPtr,
    >  <[In]()> ByVal lpEnumFunc As EnumChildProc,
    >  <[In]()> ByRef lParam As IntPtr
    >  ) As Boolean
    > End Function


    第4引数を ByRef IntPtr にしたのですね。
    では、EnumChildProc の Delegate 宣言も見せてください。

    AddressOf で指定した側が ByVal で、Delegate 定義が ByRef になっていて不整合を引き起こしていると思います。



    ' 参考資料1: https://dobon.net/vb/dotnet/process/enumwindows.html
     Public Delegate Function EnumWindowsDelegate(hWnd As IntPtr, lparam As IntPtr) As Boolean
     <DllImport("user32.dll")> _
     Public Function EnumWindows(lpEnumFunc As EnumWindowsDelegate, lparam As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
     End Function


    ' 参考資料2: https://smdn.jp/programming/tips/enumwindows/
     Private Delegate Function WNDENUMPROC(ByVal hWnd As IntPtr, ByVal lParam As IntPtr) As Boolean
     <DllImport("user32")> _
     Private Function EnumWindows(ByVal lpEnumFunc As WNDENUMPROC, ByVal lParam As IntPtr) As Boolean
     End Function


    ' 参考資料3: http://mt-soft.sakura.ne.jp/web_dl/vb-parts/enum_window/
     Private Delegate Function EnumerateWindowsCallback(ByVal hWnd As IntPtr, ByVal lParam As Integer) As Integer
     <DllImport("user32", EntryPoint:="EnumWindows")> _
     Private Shared Function EnumWindows(ByVal lpEnumFunc As EnumerateWindowsCallback, ByVal lParam As Integer) As Integer
     End Function


    ' 参考資料4: http://nonsoft.la.coocan.jp/SoftSample/VB.NET/SampleEnumWindows.html
     Private Delegate Function D_EnumWindowsProc(ByVal hWnd As Integer, ByVal lParam As Integer) As Integer
     Private Declare Function EnumWindows Lib "user32.dll" (ByVal lpEnumFunc As D_EnumWindowsProc, ByVal lParam As Integer) As Integer
記事No.90434 のレス /過去ログ156より / 関連記事表示
削除チェック/

■94822  Re[2]: インデックスが配列の境界外です。が出てしまいました。
□投稿者/ 魔界の仮面弁士 -(2020/05/21(Thu) 23:47:39)
    No94820 (エイ さん) に返信
    > コードが1万行以上あるのですいません。
    > サイトのダウンロードはDOWNLOAD: http://libzplay.sourceforge.net/download.html

    ダウンロードはしていませんし、投稿いただいたコードを斜め読みしただけですが…。


    投稿されたコードの場合、Button5 が押されたら、
    OpenFileDialog で選択されたファイル名が、
    ListBox2 に記録されるようになっているようですね。

    これって、Button5 を押すたびに、ListBox2 のファイル名がどんどん積み重なっていきませんか?

    それにも拘わらず、フィールド変数 file は
    「最後に Button5 で選択されたファイル群だけ」しか保持されていません。

    そのため、file の要素数よりも ListBox2 の要素数が多くなり、
    IndexOutOfRangeException「インデックスが配列の境界外です。」
    が生じているのではないでしょうか。


    > インデックスが配列の境界外です。と出る場合、どのように修正したらいいんでしょうか?

    修正案1)Button5 の処理で .Items.Add のループに入る前に、
     .Items.Clear() を呼び出して、ListBox2 を空にしておく。

    修正案2)Button5 のコードはそのままにしておき、OpenFile のコードを
     player.OpenFile(file(IntSelectIndexPre), TStreamFormat.sfAutodetect)
     ではなく
     player.OpenFile(CStr(ListBox1.SelectedItem), TStreamFormat.sfAutodetect)
     に変更してみる。

    などが考えられます。

    Button5 を最後に押したときに選んだファイル一覧のみを対象としたいなら前者、
    Button5 を押すたびにファイル一覧が増えていく(重複もありえる)方が良ければ後者です。


    ただし実際は、
    >  file = OpenFileDialog1.SafeFileNames
    >  a = OpenFileDialog1.FileNames
    の扱いに問題があるので、実際にはどちらも問題があるでしょう。

    SafeFileNames が「パスを含まないファイル名」で、
    FileNames が「ファイルのフルパス」を表すものなので、
    ListBox2 にはファイル名のみを記録しておき、
    player.OpenFile にはフルパスを渡すように書き換えるのが
    望ましいのではないでしょうか。
記事No.94819 のレス /過去ログ164より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -