• 締切済み

Lineshapeコントロールの削除方法について

VS(Visual Basic2012)でアプリケーションの開発をしております。 WindowsフォームアプリケーションにてForm上のPanelにコンテナされている Pictureboxに、Buttonをクリックする度にLineshapeコントロールを動的に配置するようにしています。 そこで、とある動作(他のButtonのクリックとか)で、 そのなかの特定のLineshapeコントロールを削除したいのですが、やり方がわかりません。 Lineshapeコントロールは以下のソースのように配置しています。 配置したコントロール名がわかれば削除できそうなのですが、コントロール名の取得の方法がわかりません。 配置したLineshapeコントロールを削除する方法があれば上記の方法以外でも構いません。 どなたかアドバイスいただけたら幸いです。 以下ソースです。 Dim canvas As New PowerPacks.ShapeContainer Private Sub PictureBox3_Click(sender As Object, e As EventArgs) Handles PictureBox3.Click Dim win As New LINESHAPE ' Set the form as the parent of the ShapeContainer. canvas.Parent = Me.PictureBox6 ' Set the ShapeContainer as the parent of the LineShape. win.Parent = canvas win.BorderWidth = 20 win.BorderColor = Color.LightBlue win_index = win_index + 1 win.SetIndx(win_index) win.SetAng(0) win.Name = "Win" & win_index win.SetX(Panel1.Width / 2) win.SetY(Panel1.Height / 2) win.X1 = win.GetX - 50 * Math.Cos(win.GetAng * Math.PI / 180) win.Y1 = win.GetY + 50 * Math.Sin(win.GetAng * Math.PI / 180) win.X2 = win.GetX + 50 * Math.Cos(win.GetAng * Math.PI / 180) win.Y2 = win.GetY - 50 * Math.Sin(win.GetAng * Math.PI / 180) '動的にイベントを関連付ける AddHandler win.MouseDown, AddressOf win_MouseDown AddHandler win.MouseUp, AddressOf win_MouseUp AddHandler win.MouseMove, AddressOf win_MouseMove End Sub Public Class LINESHAPE Inherits PowerPacks.LineShape Dim idx As String Dim ang As String Dim p_x As String Dim p_y As String Public Sub SetIndx(index As String) idx = index End Sub Public Sub SetAng(angle As String) ang = angle End Sub Public Sub SetX(xx As String) p_x = xx End Sub Public Sub SetY(yy As String) p_y = yy End Sub Public Function GetIndx() Return idx End Function Public Function GetAng() Return ang End Function Public Function GetX() Return p_x End Function Public Function GetY() Return p_y End Function End Class 以上、よろしくお願い致します。

みんなの回答

  • hirotn
  • ベストアンサー率59% (147/246)
回答No.1

この質問からはどのコントロールを消すのかはわかりませんでしたが、 コントロール名は分かりそうなので、 ControlsクラスのFindメソッドで検索できると思います。 http://dobon.net/vb/dotnet/control/findcontrolbyname.html

happy727
質問者

補足

回答ありがとうございます。 Lineshapeの型はControlではなくPowerPacks.Shapeのようなので、 Findメソッドがうまく使えません。なにかよい方法があればお願いします。 現在配置しているLineshapeコントロールの一覧を表示させるための ソースを下に貼り付けます。ご参考ください。 Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.DoubleClick Dim MyControl As PowerPacks.Shape Dim AllName As String Dim i As Integer AllName = "フォームに配置されている全てのコントロール名" & Chr(13) For Each MyControl In canvas.Shapes i = i + 1 AllName = AllName & Chr(13) & _ i & ":MyControl.Name = " & MyControl.Name Next MsgBox(AllName) End Sub また、基本的な質問なのですが、 コントロール名というにはそのコントロール (今回の場合はPowerPacks.Shapeになるのですが、) のNameプロバティと同じもの。という理解でよろしいでしょうか? よろしくお願いします。

関連するQ&A

  • cos波表示について マクローリン展開 vb

    下記が、sin波を表示させるためのプログラムです。 これを改良し(mysin→mycosにし、mysin2→mycos2にする。)cos波を表示させたいです。 今、作ってみましたが、変な形です。 どこをどのように改良すればよいか、教えていただけませんでしょうか。 ちなみに、cos波は、picturebox2に作り、button2をクリックしたときに表示させるようにする。 Imports System.Math Public Class Form1 Dim b As Bitmap Dim g As Graphics Dim p As Pen Dim w, h, mw, mmw, mh As Integer Dim b2 As Bitmap Dim g2 As Graphics Dim p2 As Pen Dim w2, h2, mw2, mmw2, mh2 As Integer Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.Text = "Sin波 Cos波" w = PictureBox1.Width h = PictureBox1.Height w2 = PictureBox2.Width h2 = PictureBox2.Height mw = w \ 2 mmw = mw \ 2 mh = h \ 2 mw2 = w2 \ 2 mmw2 = mw2 \ 2 mh2 = h2 \ 2 Button1.Text = "Sin Curve" Button2.Text = "Cos Curve" b = New Bitmap(w, h) g = Graphics.FromImage(b) p = New Pen(Color.Black, 1) b2 = New Bitmap(w2, h2) g2 = Graphics.FromImage(b2) p2 = New Pen(Color.Black, 1) g.DrawLine(p, 0, mh, w, mh) g.DrawLine(p, mw \ 2, 0, mw \ 2, h) g2.DrawLine(p2, 0, mh2, w2, mh2) g2.DrawLine(p2, mw2 \ 2, 0, mw2 \ 2, h2) p.Dispose() p2.Dispose() PictureBox1.Image = b PictureBox2.Image = b2 End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i, k, x0, y0 As Integer p = New Pen(Color.Blue, 2) For i = mw + mmw - w To w - mmw k = mysin(i * PI / 180) * mh * 0.9 x0 = mmw + i y0 = mh - k g.DrawLine(p, x0, y0, x0 + 1, y0 + 1) Next PictureBox1.Image = b End Sub Function mysin(ByVal arg) As Double Dim s = Sign(arg) Dim mp = Int(arg / (2 * PI)) arg = arg - 2 * PI * mp If s < 0 Then arg = 2 * PI - arg If arg > 3 * PI / 2 Then Return -s * mysin2(2 * PI - arg) ElseIf arg > PI Then Return -s * mysin2(arg - PI) ElseIf arg > PI / 2 Then Return s * mysin2(PI - arg) Else Return s * mysin2(arg) End If End Function Function mysin2(ByVal arg) As Double Return arg - Pow(arg, 3) / 6 + Pow(arg, 5) / 120 - Pow(arg, 7) / 5040 End Function Function mycos(ByVal arg2) As Double Dim c = Sign(arg2) Dim mp = Int(arg2 / (2 * PI)) arg2 = arg2 - 2 * PI * mp If c < 0 Then arg2 = -2 * PI - arg2 If arg2 > 3 * PI / 2 Then Return c * mycos2(-2 * PI - arg2) ElseIf arg2 > PI Then Return c * mycos2(arg2 - PI) ElseIf arg2 > PI / 2 Then Return -c * mycos2(PI - arg2) Else Return -c * mycos2(arg2) End If End Function Function mycos2(ByVal arg2) As Double Return 1 - Pow(arg2, 2) / 4 + Pow(arg2, 4) / 24 - Pow(arg2, 6) / 720 End Function Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim j, l, x1, y1 As Integer p2 = New Pen(Color.Red, 2) For j = mw2 - mmw2 - w2 To w2 - mmw2 l = mycos(j * PI / 180) * mh2 x1 = mmw2 + j y1 = mh2 - l g2.DrawLine(p2, x1, y1, x1 + 1, y1 + 1) Next PictureBox2.Image = b2 End Sub End Class

  • 動的に作成したコントロールの削除方法

    はじめまして。 現在ASP.net でweb画面を作成していますが、動的に作成したコントロールの削除が不規則な動きをしており困り果ててこちらにきました。よろしくお願いします。 配置してあるテーブルに行だけを動的に追加しており その行には、テキストボックスと削除ボタンが含まれています。 不規則な動きというのは、以下になります。 1行目の削除ボタンを押す→1行目が消える 1行目になった削除ボタンを押す→変化なし 1行目の削除ボタンを押す→末尾の行が消える という状態です。デバッグで確認すると、 Removeで消しているコントロールIDは確かに1行目のものなのに、 画面が開くとそれが残っているという現象です。 そしてなぜ末尾が途中から消されていくのかは分かりません。 もしかして思うのは、毎回Loadで動的に生成しているため、 削除ボタンが押されたときもLoad一度生成したものをイベントハンドラで削除しようとしていておかしくなるのかなという気もしますが、 毎回生成しないとコントロール自体が消えてしまい、Loadでなくイベントハンドラで生成するようにすると、今度は入力値が消えてしまいます。 ソースは以下になります。(一部抜粋) とても困っています。宜しくお願いします。 'テーブルの枠だけデザイナで作成しておく <table id="tblDynamic" runat="server" enableviewstate="false">  </table> 'ロード Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load  ’配置してあるテーブルに行を動的に追加する  For rowCnt As Integer = 1 To 10   tblFormat.Rows.Add(retCreateRow(rowCnt))  Next End Sub ’テーブルの行(コントロールを含む)を作成して返す関数 Function retCreateRow(rowCnt As Integer) As HtmlTableRow  Dim tr As New HtmlTableRow  Dim cel1 As New HtmlTableCell  Dim cel2 As New HtmlTableCell  Dim txt As New TextBox  Dim btn As New ImageButton  txt .ID = "txt " & "_" & rowCnt cel1.Controls.Add(txt)  tr.Cells.Add(cel1)  btn.ID = "btn" & "_" & rowCnt  btn.text="行削除" AddHandler btn.Click, New System.Web.UI.ImageClickEventHandler(AddressOf btnDelete_btnInsert) cel2.Controls.Add(btn)  tr.Cells.Add(cel2)  Return tr End Function '行削除イベントハンドラ Private Sub btnDelete(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim ControlIdx = Split(CType(sender, ImageButton).ID, "_")(1) 'この削除ボタンがある行Indexを取得 For HitIdx As Integer = 1 To tblFormat.Rows.Count If Not IsNothing(tblFormat.Rows(HitIdx).FindControl(CType(sender, ImageButton).ID)) Then 'あった!この行を削除する Me.tblFormat.Rows.RemoveAt(HitIdx) Exit For End If Next End Sub

  • コントロールを削除すると、一つ飛ぶ アクセス

    こんばんは。よろしくお願いします。 フォーム上のイメージを削除してるのですが Sub test() Dim ctl As Control Dim FormName As String FormName = "フォーム2" DoCmd.OpenForm FormName, acDesign For Each ctl In Forms(FormName).Controls If ctl.Name Like "イメージ*" Then Debug.Print ctl.Name DeleteControl FormName, ctl.Name End If Next ctl End Sub これをすると、コントロールが一つ飛ばされます。 イミディエイトウインドウで値を確認すると イメージ0 イメージ2 イメージ4 になりました。 1、3、5が飛ばされました。 実行結果は画像のような感じです。 なぜ飛ばされちゃうのでしょうか? 普段、For Each ctl In Forms(FormName).Controlsを使う分には値が飛ばされる事はないので DeleteControl FormName, ctl.Nameが原因だと思うのですが、 全ての「イメージ」で始まるコントロールを削除したい場合、どうすえばいいですか?

  • VB6コントロール配列をパラメータとして渡す方法

    フォーム上にcmdStartというコマンドボタンが3個あります。それをクリックすると使用不可になるというプロシージャーですが、(1)のイベントに対して、(2)で処理する場合、下のようにやると、型がちがうといってエラーになります。 この場合、コントロールの配列を次のモジュールに渡すにはどのように書いたらいいのでしょうか? (1) Private Sub cmdStart_Click(Index As Integer) processGet cmdStart() End Sub (2) Public Sub processGet(pcmdStart() As Control) Dim i As Integer For i = 0 to 2 pcmdStart(i).Enabled=False Next i End Sub

  • エクセル フォーム上の全てのコントロールを取得した

    エクセル フォーム上の全てのコントロールを取得したい http://okwave.jp/qa/q4879853.html のNo.1さんの回答を参考に、 Sub try() Dim i As Integer Dim StrFormName As String StrFormName = "フォーム1" For i = 0 To Forms(StrFormName).Controls.Count - 1 Debug.Print Forms(StrFormName).Controls.Item(i).Name Next End Sub を作ったのですが、 「Forms」の部分が、 「Sub、Function、または Property が定義されていません。(Error 35)」 というコンパイルエラーになってしまいます。 上記のコードをアクセスVBAにつけると、全てのコントロール名が取得できます。 同じようにエクセルで使うにはどこを修正すればいいでしょうか? フォーム名は、変数に入れて使いたいです。

  • ユーザーコントロール(OCX)のオブジェクト名

    2点わからない点がありますのでよろしくお願いします。 (1)ユーザーコントロールのオブジェクト名を引数として使用したいのですが エラーが発生し困っています。どのようにしたらいいのでしょうか? ユーザ-コントロールのオブジェクト名:UserControl1 ☆でエラーが発生する「オブジェクトはこのプロパティまたはメソッドをサポートしていません。」 ※関数aはDLLとなっておりどうしてもオブジェクト型で渡さなければなりません。 Private Sub Command1_Click() Call a(Me) End Sub ===DLL関数:a=== オブジェクト名とボタン名をINIファイルに書き込む処理 =========== Private Sub a(prmObj As Object) Dim strMsg As String strMsg = prmObj.Name ・・・☆ : : : End Sub (2)String型からObject型に変換するのは可能でしょうか? INIファイルから"UserControl1.Command.Enable = False"というString型のデータを読込み、 ボタンを有効・無効設定するという事が処理がしたいのですが何かいい方法がありましたら教えてください。 Private Sub UserControl_Initialize() Dim a As Object Dim b as String 'INIファイルから取得 Dim c as String       'INIファイルから取得 b = "UserControl1.Command1" c = "False"   Set a = Me.Controls(b) If c = "False" then a.Enable = False else a.Enable = True End If End Sub

  • VBA 関数(Function) カッコの後のデータ型は必要?

    Function あ() あ = "あああ" End Function Sub test3() MsgBox あ End Sub と、 Function あ() As String あ = "あああ" End Function Sub test3() MsgBox あ End Sub は同じ動作をするのですがやはり「As String」をつけたほうがいいのですか? ウォッチウインドウで確認すると 「As String」がないほうは「Variant/ String」型ですが あるほうは「String」型のみです。

  • ActiveRowをコントロール

    エクセル2007を使用しています。 ユーザーフォームのコードに以下のコードを書いてシートのセル情報をユーザーフォームに表示したいと考えています。 以下のコードでは「ActiveRow」の指定が固定になってしまうので、ユーザーフォームに「NEXT」ボタンを追加して、NEXTボタンが押されたら「AcviveRow」を一つづつ増やして表示させるという方法を教えていただけないでしょう。 VBA素人です。 よろしくお願いします。 尚、ActiveRowの初期値は「4」になります。 Private Sub UserForm_Initialize() Call Farst End Sub Sub Farst() Dim Data1 As String Dim Data2 As String Dim Data3 As String Dim Data4 As String Dim Data5 As String Dim Data6 As String Dim Data7 As String Dim Data8 As String Dim Data9 As String Dim Data10 As String ActiveRow = 4 With Worksheets("MDH,MDO") Data1 = .Cells(ActiveRow, 1) Data2 = .Cells(ActiveRow, 2) Data3 = .Cells(ActiveRow, 3) Data4 = .Cells(ActiveRow, 4) Data5 = .Cells(ActiveRow, 5) Data6 = .Cells(ActiveRow, 6) Data7 = .Cells(ActiveRow, 7) Data8 = .Cells(ActiveRow, 8) Data9 = .Cells(ActiveRow, 9) Data10 = .Cells(ActiveRow, 10) Me.TextBox1連番.Text = Data1 Me.TextBox2品番.Text = Data2 Me.TextBox3品番2.Text = Data3 Me.TextBox4品番3.Text = Data4 Me.TextBox5単価.Text = Data5 Me.TextBox6PO_NO.Text = Data6 Me.TextBox7発注日.Text = Data7 Me.TextBox8数量.Text = Data8 Me.TextBox9層.Text = Data9 Me.TextBox10備考.Text = Data10 End With End Sub

  • VB6.0のクラスで、自分自身のインスタンスを作成するメリット

    クラスのメソッドで、自分自身のインスタンスを作成している、コードをよく見かけます。 どんなメリットがるのでしょうか? 簡単に、クラスファイルのコードを書きました。 【A.cls】 Option Explicit Dim pstrID As Long Dim pstrName As String Public Function fncCreate() As Object     Set fncCreate = New clsA  '★自分自身のインスタンスを作成する End Function Public Function fncID() As Boolean     pstrName = "ID" End Function Public Function fncName() As Boolean     pstrName = "STRING" End Function Private Sub Class_Initialize()     pstrID = 0     pstrName = "" End Sub

  • コントロールタイプを絞ってループしたい

    アクセスのフォーム上のコントロールをループする際に テキストボックスだけ絞ってループしたいのですが Sub Sample() Dim myFormName As String Dim ctl As Control myFormName = "フォーム1" For Each ctl In Forms(myFormName).Controls If ctl.ControlType = acTextBox Then End If Next ctl End Sub これだとテキストボックスの量が多くて、2秒くらいかかるのですが For Each ctl In Forms(myFormName).Controls この時点で、テキストボックスだけ絞る方法はありますか? For Each ctl In Forms(myFormName).ControlType(acTextBox) こうするとエラーになりました。 ご教授よろしくお願いします。

専門家に質問してみよう