グローバル関数でUsercontrol上に描画するには?

解決


たけぞう  2003-11-04 05:59:42  No: 109658

Form1上に貼り付けたUsercontrol1上に描画したいです。Form1のクラスから、標準モジュールに記述した関数を呼び出して描画させたいのですが、クラスの使い方が間違っているのでしょうか?
コードを下に記します。これを実行するとフォームは表示されるのですが、ユーザコントロール上の描画ができません。スタートアップはSub Mainです。
よろしくお願いします。

〜フォームの記述〜
Public Class Form1
   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Call disp()
    End Sub
End class

〜標準モジュールでの記述〜
Module Module1
    Public C As UserControl1
    Public F As Form1

    Public Sub Main()
        F = New Form1
        C = New UserControl1
        F.ShowDialog()
    End Sub

    Public Sub disp()
        Dim Graph As Graphics = C.CreateGraphics
        Dim P As Pen = New Pen(Color.Red)
        Graph.DrawLine(P, 10, 10, 50, 50)
    End Sub
    End Module


よねKEN  2003-11-04 11:25:17  No: 109659

これだとUserControl1がForm1上に乗っかってませんので、
そのUserControl1には描画されているけど見えないという状態になっています。

>Public Sub Main()
>        F = New Form1
>        C = New UserControl1
F.Controls.Add(C)
>        F.ShowDialog()
>End Sub

というふうにする必要があるかと思います。

でも、UserControl1への描画はUserControl1のPaintイベントに
書いた方がよいと思いますけど。


たけぞう  2003-11-05 02:09:27  No: 109660

よねKENさん、ありがとうございました。
教えていただいた通りに『F.Controls.Add(C)』して、必要なパラメータを設定したら描画できました。
『ユーザコントロールの追加』でソリューションエクスプローラ上に追加して、Form1デザインのForm1上にツールボックスのUserControl1のオブジェクトを貼り付けていたのでてっきり『F.Controls.Add(C)』は不必要だと思っていました。
「UserControl1への描画はUserControl1のPaintイベントに・・・」と助言いただきましたが、そのほうが一般的なのでしょうか?考え直してみます。


よねKEN  2003-11-05 06:17:36  No: 109661

> 貼り付けていたのでてっきり『F.Controls.Add(C)』は不必要だと思っていました。

開発環境上から貼り付けているのですね。コードを見て貼り付けてないのだと思いました。
であれば、

>Public Sub Main()
>        F = New Form1
>        C = New UserControl1
この行を
C = F.UserControl1
とするだけでOKでは?

>        F.ShowDialog()
>End Sub

元の
C = New UserControl1
というコードだと貼り付けたユーザコントロールとは別のインスタンスを
生成しているため、貼り付けたものとはまったくの別物を操作しようとしている
コードになっています。


たけぞう  2003-11-05 06:42:22  No: 109662

>この行を
>C = F.UserControl1
>とするだけでOKでは?

OKでした。ご丁寧にありがとうございます。
この考えでいくとソリューションエクスプローラに表示されているモジュールはオブジェクトなのでしょうか?それともクラスなのでしょうか?

Public Sub Main()
        F = New Form1
        C = Form1.UserControl1
        Form1.ShowDialog()
End Sub

と記述すると『Form1.UserControl1』が「非共有メンバを参照するには、オブジェクト参照が必要です。」のコードエラーが出てしまいます。Form1はエクスプローラ上に存在しています。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加