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

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

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

全過去ログを検索

<< 0 >>
■17349  Re[3]: Tablet PC SDKについて
□投稿者/ よこやま -(2008/04/22(Tue) 19:06:53)
    すみません、情報不足でした。

    今開発に使っているのはTabletPCSDKのInkで、
    InkPictureとInkCollectorを使っています。


    今回は
    Tablet PCではなく、普通のデスクトップPCにて使用する事になってます。

    その場合、
    Tablet PC SDKがインストールされていないデスクトップPCでも動作するようにしたいのです。

    これは可能なのでしょうか?
記事No.17329 のレス /過去ログ35より / 関連記事表示
削除チェック/

■56238  UserControlとValidatingについて
□投稿者/ KK -(2011/01/06(Thu) 13:36:28)

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

    開発環境:WinXP SP3 
    使用言語:Visual Basic .NET 2005

    以下の条件の場合に、Validating イベントが2回連続で発生してしまいます。
    通常は1回の発生だと思っていたのですが、2回発生してしまうのは仕様でしょうか。

    情報をお持ちの方がおられましたら、ご教示いただけませんでしょうか。
    よろしくお願い致します。

    @UserControl上にTextBoxを1個作成し、UserControlを作成。

    AForm上に@で作成したUserControl(A)とTextBox(B)を作成。

    BTextBox(B)のValidatingイベントに
    Private Sub TextBoxB_Validating(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBoxB.Validating
    e.Cancel = (TextBoxB.Text = String.Empty)
    Debug.Print("TextBoxB_Validating")
    End Sub

    CTextBox(B)の値が空白の状態で、UserControl上のTextBoxをマウスでクリック。

    ※1回目は1度しか発生しないのですが、続けてUserControl上のTextBoxを再度クリックすると
    Validatingイベントが2回発生してしまいます。

    ※Tabキー、SelectNextControlでのフォーカス移動では、1回のみの発生でした。
親記事 /過去ログ94より / 関連記事表示
削除チェック/

■88588  Re[8]: コントロールを自然に動かすには??
□投稿者/ 熊さん -(2018/09/09(Sun) 13:25:43)
    ありがとうございます。
    問題解決しました。


    ただ、少し以下気になった点です。


    > > PBox1.Top + CInt(PBox1.Height * (1 - YRate) * 0.5)
    > 上記の計算式の場合、YRate が Single なので、
    > 0.5 や 0.5R ではなく、0.5F と書いた方が良いですよ。

    これはなぜでしょうか?
    0.5Fとしなかった場合、どういう問題があり得ますか?
    確か、C++だと、エラーになるのでしたでしょうか?



    PictureBox1.Invalidate()

    PictureBox1.Bounds = New Rectangle(xy, sz)

    の前にありますが、

    PictureBox1.Invalidate()はPictureBox1に描画するように指令を出すためのコマンドのはずです。
    それなら、
    PictureBox1.Bounds = New Rectangle(xy, sz)
    の後でないと設定したサイズが描画されないのではないでしょうか?
    そもそも
    '位置調整の「前」に、描画状態を無効化しておく
    と、無効化しておく、と書いてあるのはなぜでしょうか?
    本来の機能と正反対ではありませんか?
記事No.88470 のレス /過去ログ152より / 関連記事表示
削除チェック/

■88593  Re[10]: コントロールを自然に動かすには??
□投稿者/ 魔界の仮面弁士 -(2018/09/09(Sun) 16:46:58)
    No88589 (熊さん さん) に返信
    > Private Sub Form6_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed
    >   pPen.Dispose() '不要になった Pen の処分
    > End Sub
    > フォームを閉じる時に、pPenを解放する処理が書かれてありますが、
    > 解放処理が必要な変数と不要な変数の違いは何でしょうか?

    一口に答えるのは難しいのですが、ざっくり言うと、
    「アンマネージリソースを保持しているかどうか」でしょうか。

    こういったオブジェクトは多くの場合、IDisposable インターフェイスを通じて
    Dispose メソッドを有していますので、それを呼び出すようにします。

    たとえば、ファイルやデータベース接続などが分かりやすいかと思います。
    ファイルを開いたまま閉じなければ、他のアプリケーションがそれを開けません。
    データベース接続を開く一方で閉じずにいれば、接続資源が枯渇します。


    あるいは、Control や Form 等のオブジェクトも IDisposable です。

    たとえば ShowDialog メソッドの呼び出しにおいては、
     Using dlg As New Form2()
      dlg.ShowDialog(Me)
     End Using
    とすべきであり、最後に Dispose することなく
     Dim dlg As New Form2()
     dlg.ShowDialog(Me)
    とだけ書くのは NG です。
    ただし Show メソッドの場合は Dispose が自動的に呼ばれますので、明示的な Dispose は不要です。


    Control を動的に追加/削除する場合も同様で、
    意図的に .Controls.Remove あるいは .Clear するような場合には、
    取り除かれたコントロールを、明示的に Dispose しなければなりません。
    Remove せず、Form の Controls に登録したままであれば、Form が Dispose される時に
    子孫が連鎖的に Dispose されるので、明示的に Dispose する必要は無いですけれど。


    そして、Pen、Brush、Font、Grapchis、Bitmap などもまた、Dispose 対象です。

    ただし、Pens.Black や Brushes.Red などといったものに関しては、
    自身で作成したリソースでは無く、Shared メンバーで管理される共有資源なので
    この場合は Dispose してはいけません。(Dispose 後に再作成する手段がない)

    また、Grapchis についても、Dispose が必要となるのは、
    .CreateGraphics メソッドや Graphics.FromImage メソッドなどのように
    自身で作成したリソースだけです。Paint イベントの e.Graphics などは
    自身で作成したものではないので、勝手に Dispose してはいけません。


    ……ということで、Dispose メソッドがあれば常に呼び出すというわけでも
    無いという点が、こういった判断を難しくしています。
    StreamReader / StreamWriter なども、意図的に Dispose を呼ばないケースがありますし、
    DataSet / DataTable などのように、Dispose しても何も起きないものなどもあります。



    No88588 (熊さん さん) に返信
    >>> PBox1.Top + CInt(PBox1.Height * (1 - YRate) * 0.5)
    >>上記の計算式の場合、YRate が Single なので、
    >>0.5 や 0.5R ではなく、0.5F と書いた方が良いですよ。
    > これはなぜでしょうか?

    一言で言えば、「データ型を意識しましょう」ということです。
    Single 精度で演算したいのか、Double 精度で演算したいのか。

    0.5 や 0.5R や 0.5# というのは Double 型のリテラルであり、
    0.5F や 0.5! と書いた場合には Single 型のリテラルを意味します。
    0.5D や 0.5@ と書いた場合には Decimal 型のリテラルを意味します。


    先ほどの
     PBox1.Top + CInt(PBox1.Height * (1 - YRate) * 0.5)
    の型を見てみると、
     Integer + CInt( Integer * ( Integer - Single ) * Double )
    となっていますので、演算を進めていくと
     Integer + CInt( Integer * ( Single ) * Double )
     Integer + CInt( Single * Double )
     Integer + CInt( Double )
     Integer + Integer
    の精度で計算されることになりますね。



    >> YRate = NumericUpDown1.Value / 100
    この代入式も、左辺の型が Single ですので、現状は
     Single 変数 = Decimal 値 / Integer 値
    という計算式になっています。

    「Decimal / Integer」は Decimal 型の精度で演算される仕様であり、
    Single 変数 に Decimal 値を代入しようとしていることに注意してください。

    Single は Decimal よりも表せる範囲が広いため、
    この暗黙変換は Option Strict On でも成功します。
    しかし有効桁数の精度的には Single の方が荒く、その分誤差を生じます。
    あとは、この誤差をどう考えるかです。

    ※Decimal は 128bit のサイズを持つ型ですが、Single は 32bit しかありません。
    ※Decimal の有効桁数は約 28.899 桁、Single の有効桁数は約 7.2247 桁です。


    後々 Double 精度で演算したいなら、YRate も Double の方が手っ取り早いですし
    Single 精度で十分なら、先の座標計算も Single 型の計算式を組むべきでしょう。
    あるいは誤差を減らしたいなら、パフォーマンスさえ許容範囲なら Decimal が使えますし、
    あるいはパフォーマンス優先で、先のように Integer な演算式を組むこともできるわけです。

    Integer 単位の Point/Rectangle 型や
    Single 単位の PointF/RectangleF 型はあっても
    Double 単位の PointR/RectangleR 型が無いというのも
    型を選ぶ指針になるのではないでしょうか。


    Single や Double は、2 進小数型ですので、0.50 や 0.25 は正しく保持できても、
    0.01 という値は有限桁で表せず、わずかに誤差を含んでしまいます。
記事No.88470 のレス /過去ログ152より / 関連記事表示
削除チェック/

■88592  Re[9]: コントロールを自然に動かすには??
□投稿者/ 魔界の仮面弁士 -(2018/09/09(Sun) 16:03:28)
    No88588 (熊さん さん) に返信
    > 問題解決しました。
    なお No88572 で投稿いただいたコードだと、
    >>   Me.Text = CStr(PictureBox1.Top + ProfilePosition.Y_Int)
    の実験で、中央線の座標に ±1 程度のブレが見られましたので、
    そもそもの計算で誤差が生じていた、というのも原因の一つかと思います。
    (それは残像ではなく、計算ミスということになりそうですが)


    > PictureBox1.Invalidate()はPictureBox1に描画するように指令を出すためのコマンドのはずです。
    ちょっと違います。


    【Invalidate】の仕事は、そのウィンドウ内に『更新リージョン』を作成するだけであり、
    正確には描画依頼そのものではありません。

    ざっくり言えば、「現在の描画内容が無効である」とマーキングするためのもの。
    今回は引数無しで呼び出しているので、領域すべてが無効化されます。
    https://msdn.microsoft.com/ja-jp/library/cc410421.aspx


    【Update】は、その更新リージョンが空ではない場合に、そのコントロールに対して
    WM_PAINT ウィンドウメッセージを送信してクライアント領域を更新します。
    これにより Paint イベントが誘発されます。
    (更新すべき領域が何もなければ、呼び出しても何も起きません)

    ウィンドウメッセージは通常、待機行列にキューイングされた上で、
    アイドル時に順次処理されるようになっているのですが、Update メソッドを
    呼び出した場合は、その待機行列を通さずに直接再描画メッセージが飛んできます。
    https://msdn.microsoft.com/ja-jp/library/cc428780.aspx


    【Refresh】は、Invalidate + Update と同義です。
    直ちに再描画を行い時にのみ呼び出します。


    PictureBox の上に他のウインドウが覆いかぶさっていて、それが取り除かれた時に
    再描画されるのも、その重なっていた領域分の更新リージョンが生成されるためです。
    この場合は明示的に Update を呼ばずとも、アイドル時に自動的に Paint イベントが呼ばれます。


    >> '位置調整の「前」に、描画状態を無効化しておく
    >> PictureBox1.Invalidate()
    > が
    > PictureBox1.Bounds = New Rectangle(xy, sz)
    > の前にありますが、
    Update や Refresh ではなく、Invalidate である点がミソです。


    > PictureBox1.Bounds = New Rectangle(xy, sz)
    > の後でないと設定したサイズが描画されないのではないでしょうか?
    Bounds の直後に呼ぶとしたら、Invalidate ではなく Update または Refresh ですよ。

    今回は Update を呼び出していませんが、それはリサイズ直後に End Sub しているからです。
    アイドル時に Invalidate された領域への再描画が発生するので、
    あえて Update を呼ぶ必要も無いという訳ですね。


    それともう一つ。現在の描画状態を無効化せずに Top 位置を変えると、
    以前描いた中央線ごと移動してしまうので、一瞬、正しくない位置に線があるように
    見えてしまうという問題もあります。だからこそ、「直前」の無効化が重要となります。

    直前には Invalidate を呼ばず、直後に呼び出してみるとか、
    直前の Invalidate を Refresh に変えて呼び出してみると、
    これらの違いを体感できるかと思います。
記事No.88470 のレス /過去ログ152より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -