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

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

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

全過去ログを検索

<< 0 >>
■7220  Re[3]: テーブル情報取得方法
□投稿者/ ちゃっぴ -(2007/08/31(Fri) 22:52:40)
>
    SQLDMO を使う方法も。
記事No.7210 のレス /過去ログ18より / 関連記事表示
削除チェック/

■14514  Re[9]: HttpWebRequest のエラーについて
□投稿者/ yama -(2008/02/20(Wed) 15:22:48)
    はい。おっしゃる通りでWindowsファイヤーウォールの設定をにオフしても起動しません。
    ですが、Web参照の追加でもWebサービスは見えているのですが「HTTP ステータス 403: Forbidden で要求が失敗しました。」
    というエラーが発生していましたので、環境的に何か不備があると思っています。
記事No.14430 のレス /過去ログ30より / 関連記事表示
削除チェック/

■17348  Re[1]: VS2008でエディットコンティニュができない
□投稿者/ もんきっき -(2008/04/22(Tue) 18:33:32)
記事No.17342 のレス /過去ログ35より / 関連記事表示
削除チェック/

■29533  Re[1]: コミットをしたがDBに反映されていない
□投稿者/ 魔界の仮面弁士 -(2008/12/10(Wed) 14:08:03)
    # 2008 + ADO という組み合わせの時点で、既に危なっかしい気も…。

    No29472 (ダメPG さん) に返信
    > 1.登録のSQLは正しく発行されている。
    >   Call CN.Execute(Sql)
    Command ではなく、Connection ですか?
    データ中の「'」「"」「|」などの対処漏れを防ぐためにも、SQL で更新する場合は
    パラメータクエリにした方が安全ですよ。

    > 2.コミットもされている。
    >   CN.CommitTrans()
    >   (コミットの下にあるメッセージがログに表示されている)
    今更ですが、ADO の動作ログを取るなら、ADODB.Connection を WithEvent し、
    イベントを使って収集すると楽かと。

    > 4.時系列の4で、プログラムを終了したことにより、メモリ上に保存されていた登録データが解放されたのでは、と考えています。
    それは考えにくいと思いますが……気になるのであれば、念のために
    更新とコミットを行った後、プログラムを終了させるという動作を繰り返し行い、
    同じ現象が起きるかどうか、社内テストしてみては如何でしょう。

    その結果、本当にメモリ上の情報が失われるという状況がありえたのであれば、ADODB を
    使う際に、サーバーカーソルモードを利用しているかどうかも確認してみてください。
    クライアントカーソルだと、メモリ上に保持される情報量が多いはずなので。


    > いろいろ考えた結果、何かのタイミングでコミットを実行したが、正常にDBに登録されない事があるのでは、と考えています。
    Jet の問題だけではなく、プログラムの問題や、ユーザーの勘違いに起因している可能性も
    考慮せねばならないので、掲示板を見ている第三者には判断のしようが無い気がします。

    一応、今回の現象に当てはまるかどうかは分かりませんけれども、
    http://www.canalian.com/workshop/access/JetCache.html
    のような理由により、データの更新タイミングがずれる事はありますけれどね。
記事No.29472 のレス /過去ログ53より / 関連記事表示
削除チェック/

■42060  Re[5]: WebBrowserのお気に入り機能
□投稿者/ 魔界の仮面弁士 -(2009/10/07(Wed) 12:21:27)
    No42035 (ド素人@VB さん) に返信
    >>そこからURLを取り出すだけですけど。
    > URLを取得するのは出来ると思うのですが、
    *.url の内容を読み取るには、正式には IUniformResourceLocator インターフェイスの
    GerURL メソッドを利用する事になります。(No6846 で回答しています)
    http://msdn.microsoft.com/en-us/library/dd565673.aspx
    
    --------------
    Option Strict On
    Imports System
    Imports System.Runtime.InteropServices
    Imports System.Runtime.InteropServices.ComTypes
    
    Module Module1
        Public Function GetUrl(ByVal filePath As String) As String
            Dim urlFile As Object = Nothing
            Dim pFile As IPersistFile
            Dim locator As IUniformResourceLocatorW
            Try
                urlFile = CreateObject("InternetShortcut")
                pFile = DirectCast(urlFile, IPersistFile)
                pFile.Load(filePath, 0)
                locator = DirectCast(urlFile, IUniformResourceLocatorW)
                Dim url As String = String.Empty
                locator.GetUrl(url)
                Return url
            Finally
                Marshal.ReleaseComObject(urlFile)
            End Try
        End Function
    
        <ComImport(), Guid("CABB0DA0-DA57-11CF-9974-0020AFD79762")> _
        <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
        Private Interface IUniformResourceLocatorW
            Sub SetUrl(<[In](), MarshalAs(UnmanagedType.LPWStr)> ByVal pcszURL As String, ByVal dwInFlags As Integer)
            Sub GetUrl(<Out(), MarshalAs(UnmanagedType.LPWStr)> ByRef ppszURL As String)
            Sub InvokeCommand(ByVal purlici As IntPtr)
        End Interface
    End Module
    --------------
    
    
    まぁ、中身は ini ファイルに酷似したテキストファイルなので、
    他の方法で読み取る事も可能でしょうけれども。
    
    
    
    > クリックされたファイルを取得する方法が分かりません。
    
    WebBrowser 上にフォルダを表示して、選択された項目(フォルダ/ファイル)を取得する方法は、
    以前、No41336 にサンプルを書いています。 C# 版ですが、興味があれば参照してみてください。
    
    ただしヴァンさんが書かれていますように、フォルダをそのまま表示するのではなく、
    自己管理された方が良いと思います。
記事No.42000 のレス /過去ログ72より / 関連記事表示
削除チェック/

■88568  Re[5]: フォームの連続的な書き換えに関して
□投稿者/ パヨンパヨン -(2018/09/08(Sat) 13:11:43)
    でも、この方法だと複数の引数を受け取れないようなのですが
    これは仕様でしょうか?
    以下のコードだとエラーになります
    
        Public Sub SetText(TBox As TextBox, i As Integer)
            TBox.Text = i.ToString()
        End Sub
    
    
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    
            Task.Factory.StartNew(
                   Sub()
    
                       For i = 1 To 100
    
    
                           frm.BeginInvoke(Sub() SetText(Form1.TextBox3, i))
                           Thread.Sleep(10)
    
                       Next
    
                   End Sub)
    
        End Sub
    
    
記事No.88546 のレス /過去ログ152より / 関連記事表示
削除チェック/

■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より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -