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

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

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

全過去ログを検索

<< 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 >>
■69936  Re[1]: LabelとCheckBoxのテキスト描画について
□投稿者/ shu -(2014/02/13(Thu) 08:44:35)
    No69928 (らうむ さん) に返信
    > CheckBoxはOnPaintをオーバーライドしてテキストを自前描画できれば・・・と思いましたが、
    > 既定のテキスト描画を止めることができませんでした。
    > CheckBox、LabelともにDrawMode等も指定できそうになく。
    
    VB.NETですが、OnPaintを使う例です。CheckBoxStateは各状態に合わせ変更してみて下さい。
    
    Public Class CheckBoxEx
        Inherits CheckBox
    
        Public Sub New()
            SetStyle(ControlStyles.UserPaint, True)
        End Sub
    
        Protected Overrides Sub OnPaint(pevent As System.Windows.Forms.PaintEventArgs)
            Dim grp = pevent.Graphics
            Using brs As New SolidBrush(Me.BackColor)
                grp.FillRectangle(brs, Me.ClientRectangle)
            End Using
            CheckBoxRenderer.DrawParentBackground(grp, Me.ClientRectangle, Me)
            CheckBoxRenderer.DrawCheckBox(grp, New Point(0, 0), _
                                          New Rectangle(15, 0, Me.Width - 15, Me.Height), _
                                          Me.Text, _
                                          Me.Font, _
                                          Me.Focused, _
                                          VisualStyles.CheckBoxState.CheckedPressed)
        End Sub
    End Class
    
記事No.69928 のレス /過去ログ119より / 関連記事表示
削除チェック/

■69941  LabelとCheckBoxのテキスト描画について
□投稿者/ らうむ -(2014/02/13(Thu) 10:40:33)
    2014/02/13(Thu) 10:41:33 編集(投稿者)

    shu様

    いつもお世話になります。
    サンプル、ありがとうございました。このような関数があったのですね。
    勉強になりました。

    試してみたのですが、テキストの表示内容をチェックボックスの幅に
    合わせて改行する必要があったので、ご提示いただいたコードでは
    対応できそうになく、泣く泣く別途手段を検討しました。

    最終的にはDOBON様サイトにあったサンプルを参考に
    ControlPaint.DrawCheckBox と e.Graphics.DrawStringを駆使して
    実現しました。

    お手数をおかけしました。
    有益な情報、ありがとうございました m(__)m

                            以上
記事No.69928 のレス / END /過去ログ119より / 関連記事表示
削除チェック/

■69939  FileNameEditorでファイル名のみ取得
□投稿者/ らうむ -(2014/02/13(Thu) 10:20:29)

    分類:[.NET 全般] 

    Win7 VS2010 C# .Net3.5

    お世話になります。
    PropertyGridにてファイル名の指定にFileNameEditorを使用しています。
    以下のようなコードで割りつけており、ファイル選択ダイアログからファイル名を
    指定すると、PropertyGrid上にはフルパス名で表示されます。

    ですが、
    ・ファイル選択ダイアログから指定した場合はファイル名のみを反映したい。
    ・PropertyGrid上でテキスト編集部で直接書き込んだ場合、書き込んだ内容(パス情報も
    ふくむ)のままで値を保存したい。

    上記を実現することは可能でしょうか。


    [EditorAttribute(typeof(System.Windows.Forms.Design.FileNameEditor), typeof(System.Drawing.Design.UITypeEditor))]
    public string testFilename
    {
    get
    {
    return filename;
    }
    set
    {
    filename = value;
    }
    }
    private string filename;

    お手数ですがご教示の程、よろしくお願いしますm(__)m。
親記事 /過去ログ119より / 関連記事表示
削除チェック/

■69944  Re[1]: FileNameEditorでファイル名のみ取得
□投稿者/ 魔界の仮面弁士 -(2014/02/13(Thu) 10:59:19)
    No69939 (らうむ さん) に返信
    > ・ファイル選択ダイアログから指定した場合はファイル名のみを反映したい。
    > ・PropertyGrid上でテキスト編集部で直接書き込んだ場合、書き込んだ内容(パス情報も
    > ふくむ)のままで値を保存したい。
    
    
    あらよっと。
    
    
    using System;
    using System.ComponentModel;
    using System.Drawing.Design;
    using System.IO;
    using System.Windows.Forms.Design;
    
    class Class1
    {
        [Editor(typeof(FileNameOnlyEditor), typeof(UITypeEditor))]
        public string testFilename1 { get; set; }
    
        [Editor(typeof(FileNameEditor), typeof(UITypeEditor))]
        public string testFilename2 { get; set; }
    
        private class FileNameOnlyEditor : FileNameEditor
        {
            public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
            {
                return Path.GetFileName(base.EditValue(context, provider, value) as string);
            }
        }
    }
記事No.69939 のレス /過去ログ119より / 関連記事表示
削除チェック/

■69957  Re[2]: FileNameEditorでファイル名のみ取得
□投稿者/ らうむ -(2014/02/13(Thu) 12:28:26)
    魔界の仮面弁士 さま
    お世話になります。

    目的の動作を実現できました。
    ご回答、誠にありがとうございましたm(__)m。
記事No.69939 のレス / END /過去ログ119より / 関連記事表示
削除チェック/

■69942  CopyFileWでコピー出来ない
□投稿者/ 鯖の味噌 -(2014/02/13(Thu) 10:46:43)

    分類:[VB.NET/VB2005 以降] 

    2014/02/13(Thu) 10:52:44 編集(投稿者)

        Private Declare Function CopyFile Lib "kernel32.dll" Alias "CopyFileW" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Integer) As Integer

    Sub Main()

    Dim Result As Integer = CopyFile("\\?\C:\A.txt", "\\?\C:\B.txt", 0)

    End Sub

    このコードを実行してもResult=0となりコピーできません。
    どこを間違えているのでしょうか?

    Windows7 64bit SP1
    VS Express 2013 for Desktop
    を使用しています。
親記事 /過去ログ119より / 関連記事表示
削除チェック/

■69943  Re[1]: CopyFileWでコピー出来ない
□投稿者/ shu -(2014/02/13(Thu) 10:57:00)
    No69942 (鯖の味噌 さん) に返信
    Cドライブのすぐ下に書こうとしてアクセス制限に引っかかっているのでは?
    C:\の下にフォルダを作成してそこで試してみてはどうでしょう?
記事No.69942 のレス /過去ログ119より / 関連記事表示
削除チェック/

■69945  Re[2]: CopyFileWでコピー出来ない
□投稿者/ 鯖の味噌 -(2014/02/13(Thu) 11:06:38)
    No69943 (shu さん) に返信
    > ■No69942 (鯖の味噌 さん) に返信
    > Cドライブのすぐ下に書こうとしてアクセス制限に引っかかっているのでは?
    > C:\の下にフォルダを作成してそこで試してみてはどうでしょう?

    早速のご返答有難うございます。
    フォルダ「C:\CopyTemp」を作成して下のように試してみました。

    Dim Result As Integer = CopyFile("\\?\C:\CopyTemp\A.txt", "\\?\C:\CopyTemp\B.txt", 0)

    これでもコピーできませんでした。
    「\\?\」を外して

    CopyFile("C:\CopyTemp\A.txt", "C:\CopyTemp\B.txt", 0)

    も試してみましたがコピーできませんでした。
    CopyFileWの定義が間違っているのでしょうか?
記事No.69942 のレス /過去ログ119より / 関連記事表示
削除チェック/

■69946  Re[3]: CopyFileWでコピー出来ない
□投稿者/ shu -(2014/02/13(Thu) 11:13:56)
記事No.69942 のレス /過去ログ119より / 関連記事表示
削除チェック/

■69948  Re[4]: CopyFileWでコピー出来ない
□投稿者/ Hongliang -(2014/02/13(Thu) 11:28:47)
    > <MarshalAs(UnmanagedType.LPStr)> を各ファイル名引数の前に付加してみて下さい。
    CopyFileWなので、LPStrではなくLPWStrですね。

    で思い出した、Unicode版の関数を使用するなら、Declare FunctionではなくDeclare Unicode Functionにする必要があります。
    (そうするとStringは自動的にUnicodeで渡されるようになります)

    あと、
    If Result = 0 Then
    Trace.WriteLine(new Win32Exception(Marshal.GetLastWin32Error()).ToString())
    End If
    などとして、エラーの内容をまず確認すべきです。
記事No.69942 のレス /過去ログ119より / 関連記事表示
削除チェック/

■69951  Re[5]: CopyFileWでコピー出来ない
□投稿者/ 鯖の味噌 -(2014/02/13(Thu) 11:47:58)
    No69948 (Hongliang さん) に返信
    >><MarshalAs(UnmanagedType.LPStr)> を各ファイル名引数の前に付加してみて下さい。
    > CopyFileWなので、LPStrではなくLPWStrですね。
    >
    > で思い出した、Unicode版の関数を使用するなら、Declare FunctionではなくDeclare Unicode Functionにする必要があります。
    > (そうするとStringは自動的にUnicodeで渡されるようになります)
    >
    > あと、
    > If Result = 0 Then
    > Trace.WriteLine(new Win32Exception(Marshal.GetLastWin32Error()).ToString())
    > End If
    > などとして、エラーの内容をまず確認すべきです。

    ありがとうございます。
    ご指摘のとおり、エラーの内容を確認します
記事No.69942 のレス /過去ログ119より / 関連記事表示
削除チェック/

■69947  Re[1]: CopyFileWでコピー出来ない
□投稿者/ 魔界の仮面弁士 -(2014/02/13(Thu) 11:27:23)
    No69942 (鯖の味噌 さん) に返信
    > Private Declare Function CopyFile Lib "kernel32.dll" Alias "CopyFileW"
    Private Declare Unicode Function 〜 と記述しないと、Unicode 版になりません。
    Auto でも良いですが。
記事No.69942 のレス /過去ログ119より / 関連記事表示
削除チェック/

■69949  Re[2]: CopyFileWでコピー出来ない
□投稿者/ shu -(2014/02/13(Thu) 11:43:08)
    No69947 (魔界の仮面弁士 さん) に返信
    > ■No69942 (鯖の味噌 さん) に返信
    >>Private Declare Function CopyFile Lib "kernel32.dll" Alias "CopyFileW"
    > Private Declare Unicode Function 〜 と記述しないと、Unicode 版になりません。
    > Auto でも良いですが。
    そこでしたかmm


    No69945 (鯖の味噌 さん) に返信
    ところでAPIで記述されていますがSystem.IO.File.Copy等でファイルコピーするのでは
    用が足りないのでしょうか?長すぎるファイル名を対象としているということなのでしょうか?
記事No.69942 のレス /過去ログ119より / 関連記事表示
削除チェック/

■69950  Re[3]: CopyFileWでコピー出来ない
□投稿者/ 鯖の味噌 -(2014/02/13(Thu) 11:46:59)
    No69949 (shu さん) に返信
    > ■No69947 (魔界の仮面弁士 さん) に返信
    >>■No69942 (鯖の味噌 さん) に返信
    > >>Private Declare Function CopyFile Lib "kernel32.dll" Alias "CopyFileW"
    >>Private Declare Unicode Function 〜 と記述しないと、Unicode 版になりません。
    >>Auto でも良いですが。
    > そこでしたかmm
    >
    >
    > ■No69945 (鯖の味噌 さん) に返信
    > ところでAPIで記述されていますがSystem.IO.File.Copy等でファイルコピーするのでは
    > 用が足りないのでしょうか?長すぎるファイル名を対象としているということなのでしょうか?


    はい。長すぎるファイル名を対象にしています。
記事No.69942 のレス /過去ログ119より / 関連記事表示
削除チェック/

■69952  Re[1]: CopyFileWでコピー出来ない
□投稿者/ 鯖の味噌 -(2014/02/13(Thu) 11:51:04)
    No69942 (鯖の味噌 さん) に返信
    > 2014/02/13(Thu) 10:52:44 編集(投稿者)
    >
    > Private Declare Function CopyFile Lib "kernel32.dll" Alias "CopyFileW" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Integer) As Integer
    >
    > Sub Main()
    >
    > Dim Result As Integer = CopyFile("\\?\C:\A.txt", "\\?\C:\B.txt", 0)
    >
    > End Sub
    >
    > このコードを実行してもResult=0となりコピーできません。
    > どこを間違えているのでしょうか?
    >
    > Windows7 64bit SP1
    > VS Express 2013 for Desktop
    > を使用しています。

    返答をくださいました皆様ありがとうございました。
    以下のように記述し、コピー出来ました。

    Private Declare Unicode Function CopyFile Lib "kernel32.dll" Alias "CopyFileW" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Integer) As Integer
    Sub Main()
    Dim Result As Integer = CopyFile("\\?\C:\CopyTemp\A.txt", "\\?\C:\CopyTemp\B.txt", 1)
    If Result = 0 Then
    Trace.WriteLine(New ComponentModel.Win32Exception(Marshal.GetLastWin32Error()).ToString())
    End If
    End Sub


    MarshalAsは付けていませんが問題ないでしょうか?
記事No.69942 のレス /過去ログ119より / 関連記事表示
削除チェック/

■69956  Re[2]: CopyFileWでコピー出来ない
□投稿者/ 魔界の仮面弁士 -(2014/02/13(Thu) 12:07:24)
    No69952 (鯖の味噌 さん) に返信
    > MarshalAsは付けていませんが問題ないでしょうか?

    あった方が良いですが、無くても大抵は大丈夫です。

    現状のコードだと、たとえば
     Dim s1 As String = "\\?\C:\A.xls"
     Dim s2 As String = "\\?\C:\B.xls"
     Dim a As String = s1
     Dim b As String = s2
     Dim Result As Integer = CopyFile(s1, s2, 1)
    を実行した後、「If s1 Is a Then」や「If s2 Is b Then」が False になってしまいます。
    本来の型は LPTSTR ではなく LPCTSTR のはずなのですけれどね。


    なので、厳密には
     ( _
      <MarshalAs(UnmanagedType.LPStr)> ByVal lpExistingFileName As String, _
      <MarshalAs(UnmanagedType.LPStr)> ByVal lpNewFileName As String, _
      <MarshalAs(UnmanagedType.Bool)> ByVal bFailIfExists As Boolean) _
     As <MarshalAs(UnmanagedType.Bool)> Boolean
    と定義するのが正しいことになります。
    これならば、「If s1 Is a Then」は True のままとなります。


    あるいは、Declare ではなく <DllImport> を使うこともできます。
    DllImportAttribute であれば、MarshalAsAttribute を指定せずとも
    「If s1 Is a Then」が True のままとなります。
記事No.69942 のレス /過去ログ119より / 関連記事表示
削除チェック/

■69954  Re[2]: CopyFileWでコピー出来ない
□投稿者/ shu -(2014/02/13(Thu) 12:00:53)
    No69952 (鯖の味噌 さん) に返信
    >
    > MarshalAsは付けていませんが問題ないでしょうか?
    No69948 Hongliangさんが回答されているように
    Unicodeで渡されるということなので問題ないと思います。

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

■69955  Re[3]: CopyFileWでコピー出来ない
□投稿者/ 鯖の味噌 -(2014/02/13(Thu) 12:06:31)
    No69954 (shu さん) に返信
    > ■No69952 (鯖の味噌 さん) に返信
    >>
    >>MarshalAsは付けていませんが問題ないでしょうか?
    > No69948 Hongliangさんが回答されているように
    > Unicodeで渡されるということなので問題ないと思います。
    >
    >

    ご返答有難うございます!
記事No.69942 のレス / END /過去ログ119より / 関連記事表示
削除チェック/

■69963  Re[1]: CopyFileWでコピー出来ない
□投稿者/ 鯖の味噌 -(2014/02/13(Thu) 18:27:52)
    No69942 (鯖の味噌 さん) に返信
    > 2014/02/13(Thu) 10:52:44 編集(投稿者)
    >
    > Private Declare Function CopyFile Lib "kernel32.dll" Alias "CopyFileW" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Integer) As Integer
    >
    > Sub Main()
    >
    > Dim Result As Integer = CopyFile("\\?\C:\A.txt", "\\?\C:\B.txt", 0)
    >
    > End Sub
    >
    > このコードを実行してもResult=0となりコピーできません。
    > どこを間違えているのでしょうか?
    >
    > Windows7 64bit SP1
    > VS Express 2013 for Desktop
    > を使用しています。

    ご教授ありがとうございました。
    最終的に以下のように記述し、コピーすることが出来ました。

    Private Declare Unicode Function CopyFile Lib "kernel32.dll" Alias "CopyFileW" (<MarshalAs(UnmanagedType.LPStr)> ByVal lpExistingFileName As String, _
    <MarshalAs(UnmanagedType.LPStr)> ByVal lpNewFileName As String, _
    <MarshalAs(UnmanagedType.Bool)> ByVal bFailIfExists As Boolean) _
    As <MarshalAs(UnmanagedType.Bool)> Boolean
    Sub Main()
    Dim Result As Integer = CopyFile("\\?\C:\CopyTemp\A.txt", "\\?\C:\CopyTemp\B.txt", 1)
    If Result = 0 Then
    Trace.WriteLine(New ComponentModel.Win32Exception(Marshal.GetLastWin32Error()).ToString())
    End If
    End Sub
記事No.69942 のレス / END /過去ログ119より / 関連記事表示
削除チェック/

■69964  Re[2]: CopyFileWでコピー出来ない
□投稿者/ 魔界の仮面弁士 -(2014/02/13(Thu) 18:45:03)
    No69963 (鯖の味噌 さん) に返信
    > 最終的に以下のように記述し、コピーすることが出来ました。
    Declare を Boolean 型で宣言しているのに、
    呼び出し側で Integer 型を使っているのは何故ですか?

    > Trace.WriteLine(New ComponentModel.Win32Exception(Marshal.GetLastWin32Error()).ToString())
    ちなみに Marshal.GetLastWin32Error() メソッドの代わりに、
    Err.LastDllError プロパティを使っても同じ結果が得られます。蛇足までに。
記事No.69942 のレス /過去ログ119より / 関連記事表示
削除チェック/

<前の20件 | 次の20件>

<< 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 >>

ヒット件数が多いので過去ログ1〜119 までの検索結果 / 過去ログ120からさらに検索→

パスワード/

- Child Tree -