おもいっきりハマったYo。・゚・(ノД`)・゚・。
ある画面を開いたり閉じたりしているとOutOfMemoryExceptionが発生します。
タスクマネージャで確認するとGDIオブジェクトの数がどんどん増加していき
1万ちょうどでOutOfMemoryExceptionが発生しました。
原因はMDI子フォームにToolTipコントロールをプログラムで動的に配置するとメモリーリークが発生するそうです。
http://support.microsoft.com/kb/817795/ja
Ver1.1で修正されたのに、Ver2.0で復活したようです。
http://social.msdn.microsoft.com/Forums/ja-JP/vsgeneralja/thread/cb1688ae-2156-4713-92d0-fc3454fc1f49
ToolTipコントロールをプログラムで動的に配置した場合は、
Disposeで開放するかComponentsに追加するようにします。
デザイナで配置した場合はComponentsに追加されるので問題ありません。
.NET TextBoxの枠線の色を変えるには
TextBoxの枠線の色を変えるサンプルです。
BorderStyleプロパティがWindows.Forms.BorderStyle.FixedSingleの場合のみ枠線の色を変えます。
BorderStyleプロパティがWindows.Forms.BorderStyle.FixedSingleの場合のみ枠線の色を変えます。
Imports System.ComponentModel
Public Class CsTextBox
Inherits System.Windows.Forms.TextBox
Private _BorderColor As Color = System.Drawing.SystemColors.ControlText
<EditorBrowsable(EditorBrowsableState.Always), Browsable(True), _
DesignerSerializationVisibility(DesignerSerializationVisibility.Visible), _
DefaultValue(GetType(Color), "ControlText"), Category("カスタム"), _
Description("境界線の色です。BorderStyleプロパティがWindows.Forms.BorderStyle.FixedSingleの場合のみ有効です。")> _
Public Property BorderColor() As Color
Get
Return Me._BorderColor
End Get
Set(ByVal value As Color)
Me._BorderColor = value
Me.Invalidate()
End Set
End Property
Private Const WM_PAINT As Integer = &HF
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
Select Case m.Msg
Case WM_PAINT
MyBase.WndProc(m)
Call DrawRectangle()
Case Else
MyBase.WndProc(m)
End Select
End Sub
Protected Overridable Sub DrawRectangle()
If Me.BorderStyle = Windows.Forms.BorderStyle.FixedSingle Then
Dim g As Graphics = Me.CreateGraphics()
Dim rect As Rectangle = Me.ClientRectangle
Dim LinePen As New Pen(Me.BorderColor)
Try
g.DrawRectangle(LinePen, rect.X, rect.Y, rect.Width - 1, rect.Height - 1)
Finally
LinePen.Dispose()
End Try
End If
End Sub
End Class
.NET 右クリックメニューを表示したコントロールを取得する
右クリックメニューを表示するには
.NET Framework 1.1以前はContextMenuクラスを使用します。
.NET Framework 2.0からはContextMenuStripクラスを使用します。
右クリックメニューを表示したコントロールを取得するには
ToolStripMenuItemのOwnerプロパティよりContextMenuStripを取得し、
ContextMenuStripのSourceControlプロパティより取得できます。
.NET Framework 1.1以前はContextMenuクラスを使用します。
.NET Framework 2.0からはContextMenuStripクラスを使用します。
右クリックメニューを表示したコントロールを取得するには
ToolStripMenuItemのOwnerプロパティよりContextMenuStripを取得し、
ContextMenuStripのSourceControlプロパティより取得できます。
Public Class Form1
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Me.Load
Dim lbl As New Label
lbl.Name = "Label1"
lbl.Text = lbl.Name
lbl.Location = New Point(10, 10)
Me.Controls.Add(lbl)
Dim cms As New System.Windows.Forms.ContextMenuStrip
cms.Items.Add("テスト(&T)", Nothing, AddressOf ContextMenuItem_Clicked)
lbl.ContextMenuStrip = cms
End Sub
Private Sub ContextMenuItem_Clicked(ByVal sender As Object, ByVal e As System.EventArgs)
Dim tsi As ToolStripMenuItem = DirectCast(sender, ToolStripMenuItem)
Dim cms As ContextMenuStrip = DirectCast(tsi.Owner, ContextMenuStrip)
Dim ctrl As Control = cms.SourceControl
Console.WriteLine(ctrl.Name)
End Sub
End Class
登録:
コメント (Atom)
-
DataTableから重複を除くには と DataTableの集約計算を行う(Compute) を利用して、DataTableをグループ化し集計を行います。 以下のようなデータが入ったDataTableから、Field1とField2で重複を取り除き集計をおこないます。...
-
前回「 PLSQL SELECTの結果を取得する ~取得結果が1行の場合~ 」に続き 今回はSELECTの結果が複数行の場合です。 SELECTの結果が複数行の場合はカーソルを使用します。 カーソルとは SELECTの結果セットに対して、1行ずつデータを取り出し、順次...
-
datatableの集約計算を行うにはDataTable.Compute メソッドを使用します。 Dim As Object '最大値を求める value = datatable.Compute("Max(集計列名)", Nothing) ...