dポイントプレゼントキャンペーン実施中!

質問させていただきます。

VB.net 2012 を使用しています。

dllを作成し、複数のプログラムで使用しています。

このdllに、呼出し元の関数をコールする機能をつけたいのですが
可能でしょうか。

-------------------------------------------------------------
プログラムA(関数ABC有り) --> dllを使用
プログラムB(関数ABC有り) --> dllを使用
プログラムC(関数ABC無し) --> dllを使用
-------------------------------------------------------------
dllにはプログラムの関数ABCをコールする機能を付与する。
プログラムAとプログラムBを実行するとdllから関数ABCがコールされる。
プログラムCにはABC関数がないため、何も起こらない。
-------------------------------------------------------------

上記のような事は可能でしょうか。

説明が下手で申し訳ありませんが
よろしくお願い足します。

質問者からの補足コメント

  • 詳細を記します。

    DataGridViewに独自機能を追加したユーザーコントロール(dll)を
    作成しています。
    目的は Ctrl+V で貼り付け処理を追加するためです。

    プログラムA,B,CでDataGridViewを使用しており、
    貼り付け機能はA,B,Cのすべてで必要のためdllを参照しています。

    プログラムAは、
    データを張り付けた後に対象列Xに固定文言を貼り付ける必要があります。

    プログラムBは、
    データを張り付けた後に隠し列Yに値をセットする必要があります。

    プログラムCは特に貼り付け後の処理が必要ありません。

    続く→

      補足日時:2020/01/09 10:00
  • ソースサンプルは以下の通りです。

    <プログラムA>---
    Public WithEvents nTest As New TestDLL
    Public Sub ABC(ByVal sender As Object, e As EventArgs) Handles nTest.Do_ABC
    【データを貼り付けた行の対象列X列に、固定文言「AAA」をセットする処理】
    End Sub

    <プログラムB>---
    Public WithEvents nTest As New TestDLL
    Public Sub ABC(ByVal sender As Object, e As EventArgs) Handles nTest.Do_ABC
    【データを貼り付けた行の隠し列Yに、固定値「100」をセットする処理】
    End Sub

    <プログラムC>---
    ABC関数は無し

    続く→

      補足日時:2020/01/09 10:02
  • <dll:TestDLL>
    Public Event Do_ABC(ByVal sender As Object, ByVal e As EventArgs)
    Protected Overrides Sub OnPreviewKeyDown(e As PreviewKeyDownEventArgs)
    MyBase.OnPreviewKeyDown(e)

    【貼り付け処理】

    ’’ここでABC関数を実行したい!!!
    RaiseEvent Do_ABC(Me, New EventArgs)

    End Sub

    ここでABC関数を実行したい!! という箇所に「RaiseEvent」で
    ABCを実行したいのですが、うまく動きませんでした。
    宜しくお願い致します。

      補足日時:2020/01/09 10:05

A 回答 (4件)

こういうこと?


普通のただのイベントを書けばいいように思えますが。

Public Class DataGridViewEx
Inherits DataGridView

Public Delegate Sub PastedEventHandler(sender As Object, cell As DataGridViewCell)
Public Event Pasted As PastedEventHandler

Protected Overrides Sub OnPreviewKeyDown(e As PreviewKeyDownEventArgs)
MyBase.OnPreviewKeyDown(e)

If e.KeyData = (Keys.Control + Keys.V) Then
Me.OnPasted()
End If
End Sub

Protected Overridable Sub OnPasted()
Me.CurrentCell.Value = Clipboard.GetText()
RaiseEvent Pasted(Me, Me.CurrentCell)
End Sub

End Class


Public Class Form1
Private Sub DataGridViewEx1_Pasted(sender As Object, cell As DataGridViewCell) Handles DataGridViewEx1.Pasted
DataGridViewEx1.Rows(cell.RowIndex).Cells(cell.ColumnIndex + 1).Value = "X"
End Sub
End Class
    • good
    • 0
この回答へのお礼

助かりました

ご返信ありがとうございます。

いただいたサンプルを参考に
思っていた通りの処理ができました。

イベントの呼び出し方を勘違いしていました。
つたない説明にお付き合いいただき、ありがとうございます。

本当に助かりました。

お礼日時:2020/01/10 00:38

もうちょっと具体的にそれぞれのコードすべてを教えてください。


どこに関数ABCがあって、その関数ABCはどこから呼び出されるのか?

関数ABCと、その呼出場所が1つのDLL内であるならば、大元の呼出場所は、DLLの呼出場所をコールするだけのようにも感じます。
    • good
    • 1
この回答へのお礼

ご返信ありがとうございます。

長くなったので、補足いたしました。
ご確認いただけますと幸いです。
よろしくお願い申し上げます。

お礼日時:2020/01/09 10:06

その関数ABCを機能として持つインターフェースを用意し、


インターフェース経由で実行すればいいのでは。
プログラムCはそもそもインターフェースを実装していないということで
呼出自体を行わない作りにすれば。
    • good
    • 1
この回答へのお礼

ご返信ありがとうございます。

上記説明が足りなかったのですが、
プログラムAとプログラムBの中にあるABC関数内の処理は
異なる処理を記述する予定です。

あくまで「ABCという関数を実行する」ということが目的でした。
説明が足りず、申しわけありません。

インタフェースを用いる案はなかったので、
参考にさせていただきます。

ありがとうございます。

お礼日時:2020/01/09 00:13

RaiseEvent で呼ぶ。

    • good
    • 1
この回答へのお礼

ご返信ありがとうございます。
RaiseEvent で実行してみました。

From1のButton1を押下時すると「成功!」が出力します。

<from1>--------------
Public WithEvents nTest As New TestDLL

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
nTest.DoTest()
End Sub

Public Sub Test_PopUp(ByVal sender As Object, e As EventArgs) Handles nTest.PopUp
MsgBox("成功!")
End Sub

<dll:TestDLL>-------
Public Event PopUp(ByVal sender As Object, ByVal e As EventArgs)

Public Sub DoTest()
RaiseEvent PopUp(Me, New EventArgs)
End Sub

----------

ただ今回はFormのイベントでは無く
以下のようにdll内でイベントを呼び出したいと考えています。

<dll:TestDLL>-------
Public Event PopUp(ByVal sender As Object, ByVal e As EventArgs)

Protected Overrides Sub OnKeyPress(ByVal e As System.Windows.Forms.KeyPressEventArgs)
[ 処理 ]

'このタイミングで「成功!」のメッセージを出したい
RaiseEvent PopUp(Me, New EventArgs)

End Sub

-----------

上記例の場合、OnKeyPressの[処理]の後にメッセージを呼び出したいのですが
うまく動きませんでした。


上記のような処理は可能でしょうか。

お手数ですが、よろしくお願いいたします。

お礼日時:2020/01/09 00:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています