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

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

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

全過去ログを検索

<< 0 >>
■9708  Re[2]: Private Shared Functionの使用方法
□投稿者/ れい -(2007/11/02(Fri) 16:29:35)

    本当のところはご本人の回答待ちでしょうが。

    メンバの意味、PrivateやSharedの意味を考えればいいのではないかと。

    No9704 (まどか さん) に返信
    > 確かにクラス設計の観点からは、Private Sharedだけが存在するのは想像しにくいですね。 Privateで問題ないわけですから。

    そうですかね?
    Privateで問題ない、という考えを突き詰めたら、
    最終的に全部Publicでも問題ない、ということになってしまいそうですが。

    > #もし、「インスタンスに関係の無いものはSharedにするべき」というガイドライン的なものがあるなら、私も倣わないと。
    > #ありましたっけ?

    インスタンスを参照しないメンバは普通そのクラスそのものに対するメンバであるので、
    囚人さんの、

    No9699 (囚人 さん) に返信
    > 私は作者じゃないので意図は分かりませんが、「インスタンス変数にアクセスさせない」というよりは「インスタンス変数にアクセスする必要がない」から Shared にするのではないですか?

    のように、普通はSharedになると思います。
    ですが、意味によっては
    アクセスする必要がなくても、Sharedにしない場合も、私はあります。
    継承関係でできない場合もありますし。
記事No.9696 のレス /過去ログ22より / 関連記事表示
削除チェック/

■26521  Re[4]: C++/CLRのpin_ptrについて
□投稿者/ tom -(2008/10/13(Mon) 18:02:55)
    Azuleanさん、ご返答有難う御座います。
    
    > とりあえず、C++/CLIと切り離して、C言語ではどう書くのか、どのように使うのかを明示できませんか。
    
    
    もし、Cで書かれたAPIをC++から使用する場合は
    
    u32	MemoryManager::Initialize( u32 size )
    {
    	pMemoryInfo_->Address = new u8[ size ];
    	
    	InitializeMem( pMemoryInfo_->Address, size)	// CLIから呼び出したいC言語のAPI
    }
    
    void Finalize();
    {
    	delete[] pMemoryInfo_->Address;
    }
    
    と言った感じで使用します。
    
記事No.26510 のレス /過去ログ48より / 関連記事表示
削除チェック/

■55072  Re[2]: DataGridViewの複数セル選択について
□投稿者/ チョーさん -(2010/11/16(Tue) 14:35:58)
    No55067 (魔界の仮面弁士 さん) に返信
    >>現状では、複数セルが選択状態の時、任意の選択セルをマウスダウンした時点で、
    >>選択状態が変わり、マウスダウンしたセルのみの選択になってしまいます。
    >
    > どのようなコードになっていますか?

    コードは特に特殊なことはしておりません。
    まず、デザイナ上で、フォームにDataGridViewを貼り付け、Column1とColumn2の列を追加しました。
    また、グリッドデータの書き換えができないよう、DataGridViewのReadOnlyプロパティはTrueにしてあります。
    (他のDataGridViewのプロパティは変更していません。)
    また、フォームのコードは以下の通りです(単純にデータをグリッドに追加しているだけ)。

    Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    DataGridView1.Rows.Add("1", "あああああ")
    DataGridView1.Rows.Add("2", "いいいいい")
    DataGridView1.Rows.Add("3", "ううううう")
    End Sub
    End Class

    このフォームを起動し、Ctrl・Shiftキーを使い、複数セルの選択ができるのですが、
    複数セルが選択された状態で任意のセル左クリックでマウスダウンを行うと、
    マウスダウンを行ったセルのみの選択になってしまいます。
    ※提示頂いたサンプルでは、ドラッグしたデータには複数セルのデータが含まれていると思いますが、
     結果、グリッド上では一つのセルの選択しか表示されません。
     ドラッグ中でも、選択したセルすべてが選択状態になっていてほしいのです。

    例えば、エクスプローラーでは、

    ・選択されていないファイルのマウスダウン(Ctrl・Shiftキーなし)を行うと、今までの選択が解除され、
     マウスダウンを行ったファイルが選択状態となる。
    ・選択されていないファイルのマウスダウン(Ctrl・Shiftキーあり)を行うと、各キーの機能に応じて
     選択箇所を含めた範囲が選択状態となる。
    ・選択されているファイルのマウスダウン(Ctrl・Shiftキーなし)を行うと、選択箇所をドラッグできる。

    という振る舞いになっていますが、まさにこれと同じことを実現したいのです。

    説明が不足していて申し訳ございません。
    宜しくお願いします。
記事No.55062 のレス /過去ログ92より / 関連記事表示
削除チェック/

■57785  Re[3]: Framework 3.5 SP1を含めたSetup
□投稿者/ 焦げ太 -(2011/03/15(Tue) 14:54:46)
    「ja」フォルダの中の「package.xml」は以下のようになっています。
    間違いなどありましたらご指摘願います。

    <?xml version="1.0" encoding="utf-8"?>
    <Package xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper" Name="DisplayName" Culture="Culture" LicenseAgreement="eula.rtf">
    <!-- Defines list of files to be copied on build -->
    <PackageFiles>
    <PackageFile Name="eula.rtf"/>
    <PackageFile Name="DotNetFX35\x64\dotnetfx35langpack_x64ja.exe"
    PublicKey="3082010A0282010100A2DB0A8DCFC2C1499BCDAA3A34AD23596BDB6CBE2122B794C8EAAEBFC6D526C23
    2118BBCDA5D2CFB36561E152BAE8F0DDD14A36E284C7F163F41AC8D40B146880DD98194AD9706D05744765CEAF1FC0
    EE27F74A333CB74E5EFE361A17E03B745FFD53E12D5B0CA5E0DD07BF2B7130DFC606A2885758CB7ADBC85E817B490B
    EF516B6625DED11DF3AEE215B8BAF8073C345E3958977609BE7AD77C1378D33142F13DB62C9AE1AA94F9867ADD4203
    93071E08D6746E2C61CF40D5074412FE805246A216B49B092C4B239C742A56D5C184AAB8FD78E833E780A47D8A4B28
    423C3E2F27B66B14A74BD26414B9C6114604E30C882F3D00B707CEE554D77D2085576810203010001"/>
    <PackageFile Name="DotNetFX35\x86\dotnetfx35langpack_x86ja.exe"
    PublicKey="3082010A0282010100A2DB0A8DCFC2C1499BCDAA3A34AD23596BDB6CBE2122B794C8EAAEBFC6D526C23
    2118BBCDA5D2CFB36561E152BAE8F0DDD14A36E284C7F163F41AC8D40B146880DD98194AD9706D05744765CEAF1FC0
    EE27F74A333CB74E5EFE361A17E03B745FFD53E12D5B0CA5E0DD07BF2B7130DFC606A2885758CB7ADBC85E817B490B
    EF516B6625DED11DF3AEE215B8BAF8073C345E3958977609BE7AD77C1378D33142F13DB62C9AE1AA94F9867ADD4203
    93071E08D6746E2C61CF40D5074412FE805246A216B49B092C4B239C742A56D5C184AAB8FD78E833E780A47D8A4B28
    423C3E2F27B66B14A74BD26414B9C6114604E30C882F3D00B707CEE554D77D2085576810203010001"/>
    </PackageFiles>

    <InstallChecks>
    <RegistryCheck Property="DotNet35SP" Key="HKLM\Software\Microsoft\NET Framework Setup\NDP\v3.5\1041" Value="SP"/>
    </InstallChecks>

    <!-- Defines how to invoke the setup for the .NET Framework redist -->
    <Commands Reboot="Defer">
    <Command PackageFile="dotNetFx35setup.exe" Arguments=" /lang:jpn /passive /norestart" EstimatedInstalledBytes="30000000" EstimatedTempBytes="30000000">

    <!-- These checks determine whether the package is to be installed -->
    <InstallConditions>
    <!-- This indicates the .Net Framework is already installed -->
    <BypassIf Property="DotNet35SP" Compare="ValueGreaterThanOrEqualTo" Value="1"/>

    <!-- Block install if user does not have admin privileges -->
    <FailIf Property="AdminUser" Compare="ValueEqualTo" Value="false" String="AdminRequired"/>

    <!-- Block install on less than Windows XP SP2 -->
    <FailIf Property="VersionNT" Compare="VersionLessThan" Value="5.1.2" String="InvalidPlatformWinNT"/>

    <!-- Block install on W2K3 with no service pack -->
    <FailIf Property="VersionNT" Compare="VersionEqualTo" Value="5.2.0" String="InvalidPlatformWinNT"/>

    <!-- Block install if the platform is IA-64 -->
    <FailIf Property="ProcessorArchitecture" Compare="ValueEqualTo" Value="IA64" String="InvalidPlatformArchitecture"/>
    </InstallConditions>

    <ExitCodes>
    <ExitCode Value="0" Result="Success"/>
    <ExitCode Value="1602" Result="Fail" String="UserCancelled"/>
    <ExitCode Value="1603" Result="Fail" String="GeneralFailure"/>
    <ExitCode Value="3010" Result="SuccessReboot"/>
    <DefaultExitCode Result="Fail" FormatMessageFromSystem="true" String="GeneralFailure"/>
    </ExitCodes>

    </Command>
    </Commands>

    <!-- Defines a localizable string table for error messages-->
    <Strings>
    <String Name="DisplayName">.NET Framework 3.5 SP1</String>
    <String Name="Culture">ja</String>
    <String Name="AdminRequired>略</String>
    <String Name="InvalidPlatformWinNT">略</String>
    <String Name="InvalidPlatformArchitecture">略</String>
    <String Name="UserCancelled">略</String>
    <String Name="GeneralFailure">略</String>
    <String Name="DotNetFX35SP1Exe">http://go.microsoft.com/fwlink/?linkid=118076</String>
    </Strings>

    </Package>
記事No.57723 のレス /過去ログ97より / 関連記事表示
削除チェック/

■88575  Re[6]: フォームの連続的な書き換えに関して
□投稿者/ 魔界の仮面弁士 -(2018/09/08(Sat) 18:58:12)
    No88568 (パヨンパヨン  さん) に返信
    > でも、この方法だと複数の引数を受け取れないようなのですが
    
    受け渡せますよ?
    
    下記の例で行くと、方法 1 がそれにあたりますが、
    方法 2 や 3 でも同じ結果が得られます。
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Task.Factory.StartNew(
            Sub()
                For i = 1 To 100
                    Dim x As String = i.ToString()
                    Dim y As String = (100 - i).ToString()
                    Dim z As Color = Color.FromArgb(255 * i \ 100, 128, 128)
    
                    ''方法1
                    Invoke(New Action(Of String, String, Color)(AddressOf 複数の引数), x, y, z)
    
                    '方法2
                    'Invoke(Sub() 複数の引数(x, y, z))
    
                    ''方法3
                    'Invoke(New MethodInvoker(
                    '    Sub()
                    '        TextBox1.Text = x
                    '        TextBox2.Text = y
                    '        TextBox1.BackColor = z
                    '    End Sub))
    
                    Thread.Sleep(10)
                Next
            End Sub)
    End Sub
    
    Private Sub 複数の引数(a As String, b As String, c As Color)
        TextBox1.Text = a
        TextBox2.Text = b
        TextBox1.BackColor = c
    End Sub
    
    
    
    > 以下のコードだとエラーになります
    
    VB バージョンが不明な点も気になりますが、それには目を瞑るとしても、
    どの部分で何というエラーになるのかぐらいは書いて欲しいです…。
    
    
    
    > frm.BeginInvoke(Sub() SetText(Form1.TextBox3, i))
    
    【問題点1】ラムダ式の遅延評価と変数のスコープ
    
    まずは引数 i。上記の変数 i はループカウンタですが、
    ラムダ式は遅延実行されるものであることに注意してください。
    (VB コンパイラのバージョンによっては、これは BC43234 の警告となります)
    
    たとえば、このようなラムダ式があったとします。
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim act(9) As MethodInvoker
            For i As Integer = 0 To 9
                act(i) = Sub() Debug.Print(i)
            Next
    
            Array.ForEach(act, Sub(method) method())
        End Sub
    
    この場合、0, 1, 2, 3, …, 8, 9 が出力されるようにも思えますが、
    実際には、すべて 10 が出力されることになるでしょう。
    
    連番で出力されるためには、
      For i As Integer = 0 To 9
        act(i) = Sub() Debug.Print(i)
      Next
      Array.ForEach(act, Sub(method) method())
    ではなく、
      For i As Integer = 0 To 9
        Dim 局所変数 As Integer = i
        act(i) = Sub() Debug.Print(局所変数)
      Next
      Array.ForEach(act, Sub(method) method())
    とする必要があります。
    
    
    
    > frm.BeginInvoke(Sub() SetText(Form1.TextBox3, i))
    
    【問題点2】既定のフォームインスタンス Form1 と明示的インスタンス frm
    
    Form1.TextBox3 を扱うために、何故 frm の BeginInvoke を呼び出しているのでしょうか。
    
    TextBox3 を操作するために、TextBox3 (またはその親フォーム等)の
    BeginInvoke/Invoke を呼ぶのではなく、それとは別のインスタンスで
    あると予想される「frm 変数」のインスタンスに対して
    実行依頼を投げている点が不自然に思えました。
    
    UI スレッドが一つしか無い場合には、結果的には正しいスレッドで動くのですが、
    それならばそもそも、わざわざ frm.BeginInvoke と書く必要は無く、
    単に BeginInvoke で良いわけで。(Button2 から呼んでいるのですから)
    
    あるいは逆に、SplashScreen 利用時などといった、
    UI スレッドが複数あるようなケースだとしたら、UI スレッドでの操作のために、
    TextBox3 (またはその親フォーム等)ではなく、別のインスタンスであると
    予想される frm に対して実行依頼を投げているの点が不自然です。
    
    
    それに、frm は「明示的にインスタンス化されたフォーム変数」であるように
    見えますが、Form1 はそうではなく、いわゆる My.Forms.Form1 相当の
    「既定のフォームインスタンス」では無いでしょうか。
    
    もしそうなら、このコードの Button2_Click が Form1 内に書かれていた場合、
    BC31139 のコンパイルエラーになりうる可能性があります。
    いずれにせよ、既定のインスタンスに頼ったコードは避けた方が良いでしょう。
    (複数のスレッドをまたぐような場面で使いたいのであれば尚の事)
    
    
    
    > frm.BeginInvoke(Sub() SetText(Form1.TextBox3, i))
    
    【問題点3】オブジェクトの管理
    
    BeginInvoke メソッドや Invoke メソッドは、スレッドセーフであることが
    保証されているため、どのスレッドから呼び出しても問題にはなりません。
    
    しかし、Form1.TextBox3 というのは、
     Friend WithEvents TextBox3 As TextBox
    というフィールド変数ですよね。
    この変数へのアクセスはスレッドセーフになっていませんので、
    望ましいコードとは言えません。
    
    
    
    ■No88567 (パヨンパヨン  さん) に返信
    > Public Sub SetText(i As Integer)
    >     Form1.TextBox3.Text = i.ToString()
    > End Sub
    
    「frm.BeginInvoke から呼ばれた SetText」は、
    frm が管理されているスレッド上で動作しますから、
    そこで呼び出された SetText 内から
    Form1 の TextBox3 フィールドにアクセスするのは OK です。
記事No.88546 のレス /過去ログ152より / 関連記事表示
削除チェック/

■88594  Re[11]: フォームの連続的な書き換えに関して
□投稿者/ 魔界の仮面弁士 -(2018/09/09(Sun) 17:43:00)
    No88591 (パヨンパヨン さん) に返信
    > 方法3が遅いのは
    > Inovokeになっているからでした
    > BeginInvokeにすると100ミリ秒くらいになりました。
    BeginInvoke は非同期実行なので、呼び出した処理が完了しないうちに、
    直ちに呼び出し元の次の行が実行されてしまうことなります。

    同期的な待ち合わせが必要なら、
     Dim ar As IAsyncResult = MyBase.BeginInvoke(……)
     Thread.Sleep(10)
     Dim result As Object = MyBase.EndInvoke(ar)
    といった書き方を使うこともできます。

    スレッドプールは有限なのでむやみやたらに BeginInvoke を
    投げっぱなしでループで呼び続けるのは、いくら何でも
    乱暴すぎますように思います。
    そもそも UI スレッドは、基本的に単一スレッドですし…。

    No88575 の私の例でも、BeginInvoke は使っていませんよね。



    No88590 (パヨンパヨン さん) に返信
    > Dim sw As New Stopwatch
    > sw.Reset()
    > sw.Start()
    これは
     Dim sw = Stopwatch.StartNew()
    とも書けますね。


    > Delegate Sub delegate_SetText(TBox As TextBox, i As Integer)
    delegate_SetText 型は Action(Of TextBox, Integer) 型と同義ですね。


    > (HRESULT からの例外:0x80010100 (RPC_E_SYS_CALL_FAILED)) が発生しました。
    このエラーが発生する要因は一つではないため特定はできませんが、たとえば
    非同期呼び出しの頻度が多すぎてビジー状態に陥った際に発生することがあるようです。



    > For i = 1 To 10000
    > のところを
    > For i = 1 To 100000
    > に変更すると、同じエラーが発生します。
    手元の環境(Core i7-8650U / 4 コア 8 スレッド)では再現しませんでしたが、このへんの値は、環境にもよるのでしょうね。

    下記は Control.BeginInvoke ではなく、Delegate.BeginInvoke の話題ですが、参考までに。
    http://d.hatena.ne.jp/akiramei/20060123/p1
記事No.88546 のレス /過去ログ152より / 関連記事表示
削除チェック/

■94680  Re[1]: クリップボードにテキストを出力する方法
□投稿者/ Azulean -(2020/05/04(Mon) 16:05:37)
    2020/05/04(Mon) 16:06:11 編集(投稿者)

    No94679 (ところてん さん) に返信
    > 一度、テキストデータをバイト配列にしてから、再度テキストデータに戻しているので
    > 二度手間な気がします。
    > もっと良い方法があればお教え願います。

    StringBuilder を用いてはいかがでしょうか?


    var stringBuilder = new StringBuilder();
    stringBuilder.AppendLine("あああ");

    stringBuilder.AppendFormat("X={0}, Y={1}", 10, 20);
    stringBuilder.AppendLine();

    Clipboard.SetText(stringBuilder.ToString())


    追記
    C# で書いちゃったけど、VB.NET では Dim stringBuilder As New StringBuilder で書き始めたら、近い形で書けるとは思う。
記事No.94679 のレス /過去ログ164より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -