Fejlesztés alatt többször is előfordult, hogy Visual Studio-ban ki kell másolnom az éppen szerkesztett file nevét, a sor számát, a függvény, osztály metódus nevét. El is jutottam a megoldásig, ahol is a beformázott szöveget a makróból ki kellett volna másolnom a vágólapra. De erre egy exception-t kaptam:
"Current thread must be set to singe threat apartment (STA) mode before OLE calls can be made. Ensure that your main function has STAThreatAttribute marked on it."
Próbálkoztam attribútumok beállításával, de nem működött. Végül találtam egy oldalt, ahol volt megoldás a problémámra. Lényegében elindít egy thread-et, amiben beállítja a hiányolt attribútumot, majd kezeli a vágólapot.
Szóval vegyünk fel egy makrót VS 2010-ben és a kapott kódot cseréljük le az alábbival:
Option Strict Off
Option Explicit Off
Imports System
Imports EnvDTE
Imports EnvDTE100
Imports System.Diagnostics
Public Module RecordingModule
'' Handle clipboard
Private clipText As String
Public Property ClipboardText() As String
Get
RunThread(AddressOf GetClipboardText)
Return clipText
End Get
Set(ByVal value As String)
clipText = value
RunThread(AddressOf CopyToClipboard)
End Set
End Property
Private Function RunThread(ByVal fct As Threading.ThreadStart)
Dim thread As New Threading.Thread(fct)
thread.ApartmentState = Threading.ApartmentState.STA
thread.Start()
thread.Join()
End Function
Private Sub GetClipboardText()
clipText = My.Computer.Clipboard.GetText()
End Sub
Private Sub CopyToClipboard()
My.Computer.Clipboard.SetText(clipText)
End Sub
'' Copy source related data to clipboard
Sub Copy()
Dim textSelection As EnvDTE.TextSelection
Dim codeElement As EnvDTE.CodeElement
Try
textSelection = DTE.ActiveWindow.Selection
codeElement = textSelection.ActivePoint.CodeElement(vsCMElement.vsCMElementFunction)
If Not (codeElement Is Nothing) Then
doc = codeElement.ProjectItem.Document.FullName()
line = textSelection.CurrentLine()
objName = codeElement.FullName()
txt = doc & ":" & line & " - " & objName & "()"
ClipboardText = txt
Else
MsgBox("No code found", MsgBoxStyle.Information, "Info")
End If
Catch x As Exception
MsgBox(x.Message(), MsgBoxStyle.Exclamation, "Exception")
End Try
End Sub
End Module
A kód eleje a vágó lap kezelését valósítja meg. Az én kódom pedig az utolsó subroutine, a Copy() névre hallgat. Ez kiszedi a kurzor pozíciója alapján a kódból a szükséges infókat és beformázza, majd kiteszi az egészet a vágólapra.
Betűhöz rendelés: Tools -> Options -> Environment -> Keyboard -> Show commands contanining: "macros.<projekt név><modul név>.Copy" -> Global. Én a magyar billentyűzeten a ctrl+í-hez kötöttem. Ne feledjük az Assign gombot megnyomni az Ok előtt!
Most már csak a megosztás kérdése maradt. Alt+F11 (Tools -> Macros -> Macros IDE...) -> Ctrl+E (File -> Export. Nálam a short cut nem működöt. Hmmm.). Ez egy <modul név>.vb file-t csinál.
Import: Tools -> Macros -> Load Macro Project... Ez nem megy, mert *.vsmacros file-t keres, de hogyan lehet ilyet kreálni???
Nem eléggé világos, hogy VS2010-ben miért a VS2005 jön fel, amikor a macro szerkesztésére kerül a szó. Valami el van állítva a VS2010-ben.
Jó szórakázást!
Legyünk jól fromázottak minden nap!
+jegyzések