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

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

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

全過去ログを検索

<< 0 >>
■55155  Re[1]: ボタンコントロールの形状変更
□投稿者/ 囚人 -(2010/11/18(Thu) 14:22:15)
    そういう事をしたいなら、WPFの方が向いてますよ。勉強ならそちらもみてみてはどうでしょうか。
記事No.55154 のレス /過去ログ92より / 関連記事表示
削除チェック/

■90057  Re[3]: FolderBrowserDialogでネットワークのみ選択
□投稿者/ 魔界の仮面弁士 -(2019/02/01(Fri) 16:05:04)
    2019/02/02(Sat) 10:15:12 編集(投稿者)

    # 解決済みマークはつけたままにしておきます。

    No90047 (yu さん) に返信
    > 無理矢理な方法、と仰いましたが、なるほど!と思わされる方法でした。

    No90044 はリフレクションで、Backing-Field 変数に強制代入していますが、
    これは要するに、下記に相当する処理であることを意味します。

     const int CSIDL_NETWORK = 0x0012
     folderBrowserDialog1.RootFolder = (System.Environment.SpecialFolder)CSIDL_NETWORK;


    しかし、RootFolder プロパティの setter は下記の実装になっており、そのままだと例外で失敗するため、
    それを回避するため、rootFolder メンバーへの直接代入で回避していたというわけで。

     if (!Enum.IsDefined(typeof(System.Environment.SpecialFolder), value))
     {
      throw new InvalidEnumArgumentException("value", (int)value, typeof(System.Environment.SpecialFolder));
     }
     rootFolder = value;


    > よろしければ、"0x12"がネットワークの番号だとどのように調べたのか教えていただけませんか?

    0x12 は、"ネットワーク" フォルダーを意味する識別子です。
    Windows SDK 上では CSIDL_NETWORK 定数として定義されています。(see: ShFolder.h , KnownFolders.h)


    =======================
    同じ処理を COM 版で書くとこんな感じ。

    Shell32.dll を参照設定した上で、
    ShellSpecialFolderConstants 列挙型の ssfNETWORK を利用できます。


    const int BIF_NEWDIALOGSTYLE = 0x40;
    const int BIF_NONEWFOLDERBUTTON = 0x200;

    int Hwnd = (int)(long)Handle;
    string Title = "フォルダを選択して下さい";
    int Options = BIF_NEWDIALOGSTYLE | BIF_NONEWFOLDERBUTTON;
    object RootFolder = Shell32.ShellSpecialFolderConstants.ssfNETWORK;

    Shell32.Shell sh = new Shell32.Shell();
    Shell32.Folder fo = sh.BrowseForFolder(Hwnd, Title, Options, RootFolder);

    string selectedFolder = null;
    if ( fo != null)
    {
      Shell32.FolderItems fis = fo.Items();
      Shell32.FolderItem fi = fis.Item(Type.Missing);
      selectedFolder = fi.Path;
      Marshal.ReleaseComObject(fi);
      Marshal.ReleaseComObject(fis);
      Marshal.ReleaseComObject(fis);
      Marshal.ReleaseComObject(fo);
    }
    Marshal.ReleaseComObject(sh);

    return selectedFolder;

    =======================
    参照設定したくなければ、レイトバインドで。

    dynamic sh = Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application"));
    dynamic fo = sh.BrowseForFolder((int)(long) Handle, "フォルダを選択して下さい", 0x240, 0x12);
    string selectedFolder = null;
    if ( fo != null)
    {
      dynamic fis = fo.Items();
      dynamic fi = fis.Item();
      selectedFolder = fi.Path;
      Marshal.ReleaseComObject(fi);
      Marshal.ReleaseComObject(fo);
    }
    Marshal.ReleaseComObject(sh);
    return selectedFolder;


    =======================
    上記 COM の BrowseForFolder メソッドや
    .NET の FolderBrowserDialog クラスというものは、
    SHBrowseForFolder という API をカプセル化したものです。
    https://docs.microsoft.com/en-us/windows/desktop/api/shlobj_core/nf-shlobj_core-shbrowseforfolderw
    https://docs.microsoft.com/en-us/windows/desktop/api/shlobj_core/nf-shlobj_core-shbrowseforfoldera
    https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/FolderBrowserDialog.cs,94edc2b722c18d1f
記事No.90042 のレス / END /過去ログ155より / 関連記事表示
削除チェック/

■90066  Re[4]: FolderBrowserDialogでネットワークのみ選択
□投稿者/ yu -(2019/02/04(Mon) 02:54:26)
    2019/02/04(Mon) 02:57:08 編集(投稿者)
    魔界の仮面弁士 様

    すごい…なるほど。
    設定された識別子以外で設定するのは、特にC#ではやはり難しいですね。

    実際にWindows SDK のコードで確認するには開発ツールのダウンロードが必要なようですね。
    今の開発環境だとすぐには確認できず残念です。

    初心者ながらに色々と調べてみましたが、知識不足でせっかく教えていただいた内容を
    全ては理解しきれておらず大変申し訳ないですが、非常に勉強になりました。

    ご回答いただきまして本当にありがとうございます。


    No90057 (魔界の仮面弁士 さん) に返信
    > 2019/02/02(Sat) 10:15:12 編集(投稿者)
    >
    > # 解決済みマークはつけたままにしておきます。
    >
    > ■No90047 (yu さん) に返信
    >>無理矢理な方法、と仰いましたが、なるほど!と思わされる方法でした。
    >
    > No90044 はリフレクションで、Backing-Field 変数に強制代入していますが、
    > これは要するに、下記に相当する処理であることを意味します。
    >
    >  const int CSIDL_NETWORK = 0x0012
    >  folderBrowserDialog1.RootFolder = (System.Environment.SpecialFolder)CSIDL_NETWORK;
    >
    >
    > しかし、RootFolder プロパティの setter は下記の実装になっており、そのままだと例外で失敗するため、
    > それを回避するため、rootFolder メンバーへの直接代入で回避していたというわけで。
    >
    >  if (!Enum.IsDefined(typeof(System.Environment.SpecialFolder), value))
    >  {
    >   throw new InvalidEnumArgumentException("value", (int)value, typeof(System.Environment.SpecialFolder));
    >  }
    >  rootFolder = value;
    >
    >
    >>よろしければ、"0x12"がネットワークの番号だとどのように調べたのか教えていただけませんか?
    >
    > 0x12 は、"ネットワーク" フォルダーを意味する識別子です。
    > Windows SDK 上では CSIDL_NETWORK 定数として定義されています。(see: ShFolder.h , KnownFolders.h)
    >
    >
    > =======================
    > 同じ処理を COM 版で書くとこんな感じ。
    >
    > Shell32.dll を参照設定した上で、
    > ShellSpecialFolderConstants 列挙型の ssfNETWORK を利用できます。
    >
    >
    > const int BIF_NEWDIALOGSTYLE = 0x40;
    > const int BIF_NONEWFOLDERBUTTON = 0x200;
    >
    > int Hwnd = (int)(long)Handle;
    > string Title = "フォルダを選択して下さい";
    > int Options = BIF_NEWDIALOGSTYLE | BIF_NONEWFOLDERBUTTON;
    > object RootFolder = Shell32.ShellSpecialFolderConstants.ssfNETWORK;
    >
    > Shell32.Shell sh = new Shell32.Shell();
    > Shell32.Folder fo = sh.BrowseForFolder(Hwnd, Title, Options, RootFolder);
    >
    > string selectedFolder = null;
    > if ( fo != null)
    > {
    >   Shell32.FolderItems fis = fo.Items();
    >   Shell32.FolderItem fi = fis.Item(Type.Missing);
    >   selectedFolder = fi.Path;
    >   Marshal.ReleaseComObject(fi);
    >   Marshal.ReleaseComObject(fis);
    >   Marshal.ReleaseComObject(fis);
    >   Marshal.ReleaseComObject(fo);
    > }
    > Marshal.ReleaseComObject(sh);
    >
    > return selectedFolder;
    >
    > =======================
    > 参照設定したくなければ、レイトバインドで。
    >
    > dynamic sh = Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application"));
    > dynamic fo = sh.BrowseForFolder((int)(long) Handle, "フォルダを選択して下さい", 0x240, 0x12);
    > string selectedFolder = null;
    > if ( fo != null)
    > {
    >   dynamic fis = fo.Items();
    >   dynamic fi = fis.Item();
    >   selectedFolder = fi.Path;
    >   Marshal.ReleaseComObject(fi);
    >   Marshal.ReleaseComObject(fo);
    > }
    > Marshal.ReleaseComObject(sh);
    > return selectedFolder;
    >
    >
    > =======================
    > 上記 COM の BrowseForFolder メソッドや
    > .NET の FolderBrowserDialog クラスというものは、
    > SHBrowseForFolder という API をカプセル化したものです。
    > https://docs.microsoft.com/en-us/windows/desktop/api/shlobj_core/nf-shlobj_core-shbrowseforfolderw
    > https://docs.microsoft.com/en-us/windows/desktop/api/shlobj_core/nf-shlobj_core-shbrowseforfoldera
    > https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/FolderBrowserDialog.cs,94edc2b722c18d1f
記事No.90042 のレス / END /過去ログ155より / 関連記事表示
削除チェック/

■94817  Re[6]: Excelの指定範囲の内容を表形式で表示
□投稿者/ temaki -(2020/05/21(Thu) 19:43:27)
    No94810 (魔界の仮面弁士 さん) に返信

    TextFieldParserの使い方、誠にありがとうございました。
    先程試してみたところ、うまくいきました。
    また、Usingって、複数のIDisposableオブジェクトを1行で書けるんですね。
    僕はUsingをネストしてしまう所でしたが、これは勉強になりました。

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

■98151  VB.Net 非同期処理について
□投稿者/ RS -(2021/09/29(Wed) 16:29:39)

    分類:[.NET 全般] 

    VB.Netでの非同期処理について質問です。

    戻り値と引数のある関数を非同期で動かしたいのですが、
    この処理内で、ダイアログを表示しています。

    Thread.SetApartmentStateを設定すればエラーが回避できるとのことで
    調べていたのですが、Taskには設定できないようで、困っています。
    戻り値と引数のある関数を非同期で、かつThread.SetApartmentStateを設定して
    動かすことはできるのでしょうか?

    フレームワークは4.5.2です。

    ご存知の方がいらっしゃいましたら、ご教授お願いいたします。
親記事 /過去ログ170より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -