I would like to do something when my paletteset is closed. I took the C# code from here
I modified the code to VB.net
Dim WithEvents ps As Autodesk.AutoCAD.Windows.PaletteSet <Autodesk.AutoCAD.Runtime.CommandMethod("psTest")> _ Public Sub PSTest() If ps Is Nothing Then ps = New Autodesk.AutoCAD.Windows.PaletteSet("psTest") ps.Dock = Autodesk.AutoCAD.Windows.DockSides.Left ps.Visible = True End If End Sub Private Sub ps_StateChanged(ByVal sender As Object, ByVal e As Autodesk.AutoCAD.Windows.PaletteSetStateEventArgs) Handles ps.StateChanged If e.NewState = Autodesk.AutoCAD.Windows.StateEventIndex.Hide Then Application.DocumentManager.MdiActiveDocument.Send
StringToExecute("CHECKPALETTESETCLOSE", True, True, False) End If End Sub <Autodesk.AutoCAD.Runtime.CommandMethod("CHECKPALE TTESETCLOSE", CommandFlags.NoHistory)> _ Public Sub CheckPaletteSetState() If Not ps Is Nothing And ps.Visible = False Then Application.DocumentManager.MdiActiveDocument.Edit or.WriteMessage("closed") End If End Sub
My code crashed. If I catch exception it is eInvalidInput exception. I don't know what to do as it is a simple code segment I don't know hot to fix it.
first guess: don't check only for "Is Nothing" but also for "ps.IsDisposed"
HTH, - alfred -
Thanks for reply
the problem comes from here
Private Sub ps_StateChanged(ByVal sender As Object, ByVal e As Autodesk.AutoCAD.Windows.PaletteSetStateEventArgs) Handles ps.StateChanged If e.NewState = Autodesk.AutoCAD.Windows.StateEventIndex.Hide Then Application.DocumentManager.MdiActiveDocument.Send
StringToExecute("CHECKPALETTESETCLOSE", True, True, False) '--here is the exception End If End Sub
are you sure that you can run SendStringToExecute during this eventhandling? I fear NO ... to verify that: what happens if you send a _LINE-command?
PLUS: as it's a command defined by your app, why do you run this code with SendStringToExecute?
- alfred -
Thanks for reply. I don't know I took code from the post I found online(you can see in my main post). What I have done modify from c# to vb.net
I got reply from AutoCAD API support. They can replicate my issue. What I really want to do is to catch when user click paletteset "x" button rather than "-".
I don't know what to do
in most cases when using events where I need to run SendCommand (or similar) I usually redirect the event to a position when AutoCAD get's quiescent.
So in your eventhandler create a new one using AddHandler that points to a sub handling then the reached quiesent-state for AutoCAD.
HTH, - alfred -
From the next TTIF post after the one in the link above.
Something I should have mentioned about the reason for implementing a command, in the first place: the standard StateChanged event gets fired twice when undocking a palette set – once to hide it and once to display it again. This means we can’t assume a hide notification means the palette set is being closed – we really need to wait until the dust has settled before checking the state of the palette set in order to proclaim our verdict. Which is why we’re sending a command to be executed
Thanks for your reply.
Have you try to implement that code segement? Does that work as it should be?
Sorry, I don't really like palettes, and they don't really fit in with the kind of automations I am writing. So, no, I have not tried the code to verify it's operation. I just replied to try and answer Alfred's question about why the code uses a SendStringToExecute.
Access a broad range of knowledge to help get the most out of your products and services.
Start with some of our most frequented solutions or visit the Installation and Licensing Forum to get help installing your software.
Upgrading to a 2015 product? Make sure to check these out 1st!