Results 1 to 31 of 31

Thread: [RESOLVED] Unhandled error inside code called by by an error handled procedure ?

  1. #1

    Thread Starter
    Addicted Member
    Join Date
    Aug 2013
    Posts
    236

    Resolved [RESOLVED] Unhandled error inside code called by by an error handled procedure ?

    Has anyone ever seen an unhandled error (that causes the program to crash) happen in code that's called from a sub that is errorhandled?
    I've not seen this before and am wondering what could be the causes of this, in general, because I didn't think it was possible?
    Last edited by vbrad; May 24th, 2022 at 01:29 PM.

  2. #2
    Smooth Moperator techgnome's Avatar
    Join Date
    May 2002
    Posts
    34,531

    Re: Unhandled error inside code called by by an error handled procedure ?

    Only when I had Break on All Errors turned on... or when I thought something was handled, and it wasn't.

    -tg
    * I don't respond to private (PM) requests for help. It's not conducive to the general learning of others.*
    * I also don't respond to friend requests. Save a few bits and don't bother. I'll just end up rejecting anyways.*
    * How to get EFFECTIVE help: The Hitchhiker's Guide to Getting Help at VBF - Removing eels from your hovercraft *
    * How to Use Parameters * Create Disconnected ADO Recordset Clones * Set your VB6 ActiveX Compatibility * Get rid of those pesky VB Line Numbers * I swear I saved my data, where'd it run off to??? *

  3. #3

    Thread Starter
    Addicted Member
    Join Date
    Aug 2013
    Posts
    236

    Re: Unhandled error inside code called by by an error handled procedure ?

    Quote Originally Posted by techgnome View Post
    Only when I had Break on All Errors turned on... or when I thought something was handled, and it wasn't.

    -tg
    Thanks.
    That's my experience too (this isn't in the ide) and the calling sub is definitely errorhandled though.
    It's a permission denied error (70) error in code that does some reading and writing to files if that raises any flags with anyone!

  4. #4
    PowerPoster
    Join Date
    Feb 2006
    Posts
    24,482

    Re: Unhandled error inside code called by by an error handled procedure ?

    Can you present a small test case that demonstrates the issue we can run? That might help us offer suggestions.

  5. #5

    Thread Starter
    Addicted Member
    Join Date
    Aug 2013
    Posts
    236

    Re: Unhandled error inside code called by by an error handled procedure ?

    Quote Originally Posted by dilettante View Post
    Can you present a small test case that demonstrates the issue we can run? That might help us offer suggestions.
    Thanks dilettante
    Actually I found it.
    The code below demonstrates it.
    The sub that's called in the command1 button unloads the form then the form_unload sub raises an error which is
    not trapped.
    I suppose this is bad design.
    What's the issue?
    Is it never call unload except in an event handler?

    Code:
    Option Explicit
    
    Private RaiseError As Boolean
    
    Private Sub Command1_Click()
    
    On Error GoTo errhandler
    
        DoStuff
    
    Exit Sub
    
    errhandler:
    MsgBox "error!"
    
    End Sub
    
    Private Sub DoStuff()
    RaiseError = True
    Unload Me
    End Sub
    
    
    Private Sub Form_Unload(Cancel As Integer)
        If RaiseError Then Err.Raise 75
    End Sub

  6. #6
    PowerPoster
    Join Date
    Feb 2006
    Posts
    24,482

    Re: Unhandled error inside code called by by an error handled procedure ?

    The Unload statement on a Form (or even a control?) sends a message to the window to tell it to unload. So the QueryUnload and then Unload event handlers get called.

    Your button Click event handler has already exited and unwound its error handler before the new message(s) get handled by the window's message loop. It has to work like that because event handlers must exit before the next message can be handled, they hang up the loop. There is only one UI thread running your code.

  7. #7
    Addicted Member
    Join Date
    Oct 2011
    Posts
    179

    Re: Unhandled error inside code called by by an error handled procedure ?

    Quote Originally Posted by dilettante View Post
    Your button Click event handler has already exited
    Code:
    Option Explicit
    
    Private RaiseError As Boolean
    
    Private Sub Command1_Click()
    
    On Error GoTo errhandler
    
        DoStuff
        
        MsgBox "We are still in the event handler"
    Exit Sub
    
    errhandler:
    MsgBox "error!"
    
    End Sub
    
    Private Sub DoStuff()
    RaiseError = True
    Unload Me
    End Sub
    
    
    Private Sub Form_Unload(Cancel As Integer)
        'If RaiseError Then Err.Raise 75
        MsgBox "Form Unloaded"
    End Sub

  8. #8

    Thread Starter
    Addicted Member
    Join Date
    Aug 2013
    Posts
    236

    Re: Unhandled error inside code called by by an error handled procedure ?

    Quote Originally Posted by dilettante View Post
    The Unload statement on a Form (or even a control?) sends a message to the window to tell it to unload. So the QueryUnload and then Unload event handlers get called.

    Your button Click event handler has already exited and unwound its error handler before the new message(s) get handled by the window's message loop. It has to work like that because event handlers must exit before the next message can be handled, they hang up the loop. There is only one UI thread running your code.
    Thanks very much, that's a great explanation dilettante which I'm just about managing to wrap my head around.
    It makes sense but I still find it counter-intuitive that a statement in a sub isn't 'executed' until after the sub is completed*.
    One problem for me is that I have only a very loose idea of what the message loop is and does.
    Even statements like unwinding an errorhandler are basically opaque to me (i'm imagining it's something to do with the stack somehow).
    You also mention that there is only one 'UI thread'. Does this mean that there is also a thread doing the non-ui stuff as I thought VB6 was single threaded period, or maybe that's single process only! I'm pretty clueless!
    Where did you learn all this stuff. In particular is there a book (that ideally focuses on vb6), you're aware of that explains this sort of under the hood knowledge?

    * Are there other well known statements in vb6 that operate like this in what seems to me to be 'out of order'?

  9. #9

    Thread Starter
    Addicted Member
    Join Date
    Aug 2013
    Posts
    236

    Re: Unhandled error inside code called by by an error handled procedure ?

    Quote Originally Posted by argen View Post
    Code:
    Option Explicit
    
    Private RaiseError As Boolean
    
    Private Sub Command1_Click()
    
    On Error GoTo errhandler
    
        DoStuff
        
        MsgBox "We are still in the event handler"
    Exit Sub
    
    errhandler:
    MsgBox "error!"
    
    End Sub
    
    Private Sub DoStuff()
    RaiseError = True
    Unload Me
    End Sub
    
    
    Private Sub Form_Unload(Cancel As Integer)
        MsgBox "Form Unloaded"
    End Sub
    OK, now I'm confused again (I moved where the error is raised)!


    Code:
    Option Explicit
    
    Private RaiseError As Boolean
    
    Private Sub Command1_Click()
    
    On Error GoTo errhandler
    
        DoStuff
        
        MsgBox "We are still in the event handler"
        If RaiseError Then Err.Raise 75  '<-handled even though after form unloaded?
    Exit Sub
    
    errhandler:
    MsgBox "error!"
    
    End Sub
    
    Private Sub DoStuff()
    RaiseError = True
    Unload Me
    End Sub
    
    
    Private Sub Form_Unload(Cancel As Integer)
        MsgBox "Form Unloaded"
    End Sub

  10. #10
    Smooth Moperator techgnome's Avatar
    Join Date
    May 2002
    Posts
    34,531

    Re: Unhandled error inside code called by by an error handled procedure ?

    MessageBoxes can and will alter the flow sometimes. Better to use Debug Print statements to get a true idea of how things are flowing.


    -tg
    * I don't respond to private (PM) requests for help. It's not conducive to the general learning of others.*
    * I also don't respond to friend requests. Save a few bits and don't bother. I'll just end up rejecting anyways.*
    * How to get EFFECTIVE help: The Hitchhiker's Guide to Getting Help at VBF - Removing eels from your hovercraft *
    * How to Use Parameters * Create Disconnected ADO Recordset Clones * Set your VB6 ActiveX Compatibility * Get rid of those pesky VB Line Numbers * I swear I saved my data, where'd it run off to??? *

  11. #11

    Thread Starter
    Addicted Member
    Join Date
    Aug 2013
    Posts
    236

    Re: Unhandled error inside code called by by an error handled procedure ?

    Quote Originally Posted by techgnome View Post
    MessageBoxes can and will alter the flow sometimes. Better to use Debug Print statements to get a true idea of how things are flowing.


    -tg

    I tried that there just now and I don't think that it makes any difference to the flow in this case.

  12. #12
    Addicted Member
    Join Date
    Oct 2011
    Posts
    179

    Re: Unhandled error inside code called by by an error handled procedure ?

    I think it must be a bug in VB6. It seems that the error handling is reset on the form unload. It must be mixing GUI stuff with things that shouldn't be mixed.

  13. #13
    Smooth Moperator techgnome's Avatar
    Join Date
    May 2002
    Posts
    34,531

    Re: Unhandled error inside code called by by an error handled procedure ?

    Quote Originally Posted by vbrad View Post
    I tried that there just now and I don't think that it makes any difference to the flow in this case.
    That's why I said "sometimes" ... I've gotten into situations where it drastically changed how something worked (or not) and so have stoped relying on them as a litmus test and use debug prints now.

    -tg

    on a related note - I once had some code that was failing. Added some msgboxes ... it started working ... took them out... it broke ... put them back in, it worked. Commented them out.... it still worked. Deleted the comments, stopped working .... I put those puppies back in and shipped it.
    * I don't respond to private (PM) requests for help. It's not conducive to the general learning of others.*
    * I also don't respond to friend requests. Save a few bits and don't bother. I'll just end up rejecting anyways.*
    * How to get EFFECTIVE help: The Hitchhiker's Guide to Getting Help at VBF - Removing eels from your hovercraft *
    * How to Use Parameters * Create Disconnected ADO Recordset Clones * Set your VB6 ActiveX Compatibility * Get rid of those pesky VB Line Numbers * I swear I saved my data, where'd it run off to??? *

  14. #14
    Addicted Member
    Join Date
    Oct 2011
    Posts
    179

    Re: Unhandled error inside code called by by an error handled procedure ?

    Quote Originally Posted by techgnome View Post
    I put those puppies back in and shipped it.
    LOL LOL I'm still laughing

  15. #15
    Smooth Moperator techgnome's Avatar
    Join Date
    May 2002
    Posts
    34,531

    Re: Unhandled error inside code called by by an error handled procedure ?

    It still isn't quite the strangest thing I've seen. Another time, another product, code wouldn't work until someone added:
    Code:
    Dim x as Integer
    x = 1
    After those two instances, not much surprises me any more.

    -tg
    * I don't respond to private (PM) requests for help. It's not conducive to the general learning of others.*
    * I also don't respond to friend requests. Save a few bits and don't bother. I'll just end up rejecting anyways.*
    * How to get EFFECTIVE help: The Hitchhiker's Guide to Getting Help at VBF - Removing eels from your hovercraft *
    * How to Use Parameters * Create Disconnected ADO Recordset Clones * Set your VB6 ActiveX Compatibility * Get rid of those pesky VB Line Numbers * I swear I saved my data, where'd it run off to??? *

  16. #16
    PowerPoster
    Join Date
    Feb 2006
    Posts
    24,482

    Re: Unhandled error inside code called by by an error handled procedure ?

    I still don't think this is a bug, but yeah things are a little different than I described.

    Maybe the Unload statement loops on DoEvents() until the loaded Forms count drops by 1?

    There must be some reason why the DoEvents() function returns the number of remaining open Forms. Perhaps in 16-bit versions of VB you had to loop on it yourself after an Unload call or something?

    The Unload statement is not a simple call on Form_Unload, so the HRESULT would not be returned there to be processed by the calling code emitted by the compiler even if calling code was there. I still think it is done by sending/posting messages to the window.

    But I suppose somebody would have to look at the code that gets run and trace the runtime calls it makes to be sure.

    Does compiled code operate differently?

    In any case I don't think this is a bug.

  17. #17
    Addicted Member
    Join Date
    Oct 2011
    Posts
    179

    Re: Unhandled error inside code called by by an error handled procedure ?

    Quote Originally Posted by dilettante View Post
    The Unload statement is not a simple call on Form_Unload
    Quote Originally Posted by dilettante View Post
    I still think it is done by sending/posting messages to the window.
    Of course lot of things happen, lot of window messages from controls, from forms, when a parent window is destroyed.

    Quote Originally Posted by dilettante View Post
    Does compiled code operate differently?
    No.

    Quote Originally Posted by dilettante View Post
    In any case I don't think this is a bug.
    The only difference between a bug and a feature is whether it is intentional or not.
    If a programmer has set an On Error Resume Next, what is expected regarding the compiler is to respect that.
    If there was a reason to set intentionally that "exception to the rule" I don't know.

  18. #18
    PowerPoster
    Join Date
    Feb 2006
    Posts
    24,482

    Re: Unhandled error inside code called by by an error handled procedure ?

    It should be expected to operate differently because in this case the code isn't calling a procedure. it sends messages which in VB6 trigger event handler calls.

    Why would you expect an event handler in a buzz lop calling DoEvents() explicitly to handle exceptions that occur somewhere else, for example a button's Click event handler?

  19. #19
    Addicted Member
    Join Date
    Oct 2011
    Posts
    179

    Re: Unhandled error inside code called by by an error handled procedure ?

    Quote Originally Posted by dilettante View Post
    It should be expected to operate differently because in this case the code isn't calling a procedure. it sends messages which in VB6 trigger event handler calls.
    Then you think that a Form.Show, Form.Hide, Controls.Add all should or could change the state of the error handler to another x state.
    Windows are receiving messages all the time.
    A keystroke is a message, activating a window in another or same program produces messages, moving a window, etc.
    Some also produce events calls like KeyDown or Activate but as far as I know the event handler is not modified because of that.

    Is what you say documented somewhere?

    Quote Originally Posted by dilettante View Post
    Why would you expect an event handler in a buzz lop calling DoEvents() explicitly to handle exceptions that occur somewhere else, for example a button's Click event handler?
    Sorry, I fail to find DoEvents in the code.

  20. #20
    PowerPoster
    Join Date
    Feb 2006
    Posts
    24,482

    Re: Unhandled error inside code called by by an error handled procedure ?

    My point was that Unload appears to include some equivalent in order to process messages before continuing.

    I don't see a "bug." This kid of Pachinko Machine coding isn't a good idea anyway. You seem to want this to be a bug, it just isn't.

  21. #21
    Addicted Member
    Join Date
    Oct 2011
    Posts
    179

    Re: Unhandled error inside code called by by an error handled procedure ?

    Quote Originally Posted by dilettante View Post
    My point was that Unload appears to include some equivalent in order to process messages before continuing.

    I don't see a "bug." This kid of Pachinko Machine coding isn't a good idea anyway. You seem to want this to be a bug, it just isn't.
    So DoEvents clears the error handling? I never tested that.

    Quote Originally Posted by dilettante View Post
    You seem to want this to be a bug, it just isn't.
    Support that with some evidence.

  22. #22
    Addicted Member
    Join Date
    Oct 2011
    Posts
    179

    Re: Unhandled error inside code called by by an error handled procedure ?

    In my dictionary when programs behave against to what is stated in the documentation it is a bug.
    When there are exceptions to a rule, they must be included in the documentation.

    Or... ask the manufacturer. (not possible in this case).

  23. #23
    Addicted Member
    Join Date
    Oct 2011
    Posts
    179

    Re: Unhandled error inside code called by by an error handled procedure ?

    Code:
    Private Sub Timer1_Timer()
        Debug.Print "timer event"
    End Sub
    
    Private Sub Command1_Click()
        Do
            Load Form2
            Unload Form2
            DoEvents
        Loop
    End Sub
    
    Private Sub Command2_Click()
        Do
            Load Form2
            Unload Form2
        Loop
    End Sub
    If unloading a form implied DoEvents it would be a major source of problems.
    Last edited by argen; May 25th, 2022 at 12:31 PM.

  24. #24

    Thread Starter
    Addicted Member
    Join Date
    Aug 2013
    Posts
    236

    Re: Unhandled error inside code called by by an error handled procedure ?

    Quote Originally Posted by techgnome View Post
    That's why I said "sometimes" ... I've gotten into situations where it drastically changed how something worked (or not) and so have stoped relying on them as a litmus test and use debug prints now.

    -tg

    on a related note - I once had some code that was failing. Added some msgboxes ... it started working ... took them out... it broke ... put them back in, it worked. Commented them out.... it still worked. Deleted the comments, stopped working .... I put those puppies back in and shipped it.
    That's brilliant.
    I have a similar story though not from vb6.
    Some people had a problem and nothing I tried seemed to make it go away.
    Finally I landed on some code that I became suspicious of and commented out.
    The problem went away.Later I realised that code had been unreachable all the time.

  25. #25

    Thread Starter
    Addicted Member
    Join Date
    Aug 2013
    Posts
    236

    Re: Unhandled error inside code called by by an error handled procedure ?

    I think I might have the answer from Francisco Balena's Programming Microsoft Visual basic 6.0
    book.

    It's important to remember that all event procedures —
    such as Form_Load or Command1 _Click —aren't generally
    called by code in your application; instead, they're called
    by the Visual Basic runtime file. So if an error occurs in
    those event procedures, there's no code to which to
    delegate the error and the application always terminates
    with a fatal error. Keep this in mind when distributing your
    On Error statements, and never omit them in event
    procedures unless you're 100 percent sure that they can
    never raise an error.
    So you need to treat errors in those subs as standalone errors that you either handle there or the program crashes, there's
    no calling sub to pass them back to.


    Also he mention elsewhere, the Cancel parameter in the unload_event, in other words you can still cancel unloading
    there and he mentions the form's Terminate event which comes after the Unload event and which only fires after the form has unloaded.
    So the form is still around during the unload event.

    I really need to study this book properly!



    EDIT
    FB says
    event procedures — such as Form_Load or Command1 _Click —aren't generally called by code in your application
    ,
    so just for interest's sake I tried that out and the error is delegated in that case as you'd expect.

    Code:
    Option Explicit
    
    Private Sub Command1_Click()
        On Error GoTo errplace
            Command2_Click
        Exit Sub
    errplace:
            MsgBox Err.Description
    End Sub
    
    Private Sub Command2_Click()
        MsgBox 1 / 0
    End Sub
    Last edited by vbrad; May 26th, 2022 at 02:42 AM.

  26. #26
    PowerPoster wqweto's Avatar
    Join Date
    May 2011
    Location
    Sofia, Bulgaria
    Posts
    5,120

    Re: [RESOLVED] Unhandled error inside code called by by an error handled procedure ?

    Add this "proper code" in Command3 and notice the roof explode.

    Code:
    Option Explicit
    
    Private Sub Command1_Click()
        On Error GoTo errplace
        Command2_Click
        Exit Sub
    errplace:
        MsgBox Err.Description
    End Sub
    
    Private Sub Command2_Click()
        MsgBox 1 / 0
    End Sub
    
    Private Sub Command3_Click()
        On Error GoTo errplace
        Command2.Value = True
        Exit Sub
    errplace:
        MsgBox Err.Description
    End Sub
    Error handler in calling code does not prevent Command2_Click event handler from bombing out the whole application.

    Manual error handling in event handlers is mandatory for any professional VB6 produced software.

    cheers,
    </wqw>

  27. #27
    Addicted Member
    Join Date
    Oct 2011
    Posts
    179

    Re: [RESOLVED] Unhandled error inside code called by by an error handled procedure ?

    I learnt something new.
    And I guess I'm not the only one.

  28. #28
    Smooth Moperator techgnome's Avatar
    Join Date
    May 2002
    Posts
    34,531

    Re: [RESOLVED] Unhandled error inside code called by by an error handled procedure ?

    Quote Originally Posted by wqweto View Post
    Add this "proper code" in Command3 and notice the roof explode.

    Code:
    Option Explicit
    
    Private Sub Command1_Click()
        On Error GoTo errplace
        Command2_Click
        Exit Sub
    errplace:
        MsgBox Err.Description
    End Sub
    
    Private Sub Command2_Click()
        MsgBox 1 / 0
    End Sub
    
    Private Sub Command3_Click()
        On Error GoTo errplace
        Command2.Value = True
        Exit Sub
    errplace:
        MsgBox Err.Description
    End Sub
    Error handler in calling code does not prevent Command2_Click event handler from bombing out the whole application.

    Manual error handling in event handlers is mandatory for any professional VB6 produced software.

    cheers,
    </wqw>
    IT works this way because Command2_Click is being called as a method ... not as a result of an event. If there was a way to programmatically click the button (in .net it would be Command2.performClick I think) then it would react differrently. that's what's happening with the OP's unload... it's being invoked by an event, breaking the error handling chain.

    Besides, a good rule of thumb is to handle exceptions at hte lowest possible level. So if something can go wrong in the unload event... handle it there. It shouldn't be handled by Button1, Button2 or ButtonX ...



    -tg
    * I don't respond to private (PM) requests for help. It's not conducive to the general learning of others.*
    * I also don't respond to friend requests. Save a few bits and don't bother. I'll just end up rejecting anyways.*
    * How to get EFFECTIVE help: The Hitchhiker's Guide to Getting Help at VBF - Removing eels from your hovercraft *
    * How to Use Parameters * Create Disconnected ADO Recordset Clones * Set your VB6 ActiveX Compatibility * Get rid of those pesky VB Line Numbers * I swear I saved my data, where'd it run off to??? *

  29. #29
    PowerPoster wqweto's Avatar
    Join Date
    May 2011
    Location
    Sofia, Bulgaria
    Posts
    5,120

    Re: [RESOLVED] Unhandled error inside code called by by an error handled procedure ?

    @techgnome: Do you have VB6 installed to test the code?

    In VB6 you programmatically click the button with Command2.Value = True so the sample code in Command3 actually brings down the whole app, no matter that there is an active error handler when the Command2_Click event is raised (while executing Value property let).

    cheers,
    </wqw>

  30. #30

    Thread Starter
    Addicted Member
    Join Date
    Aug 2013
    Posts
    236

    Re: [RESOLVED] Unhandled error inside code called by by an error handled procedure ?

    Quote Originally Posted by wqweto View Post
    Add this "proper code" in Command3 and notice the roof explode.

    Code:
    Option Explicit
    
    Private Sub Command1_Click()
        On Error GoTo errplace
        Command2_Click
        Exit Sub
    errplace:
        MsgBox Err.Description
    End Sub
    
    Private Sub Command2_Click()
        MsgBox 1 / 0
    End Sub
    
    Private Sub Command3_Click()
        On Error GoTo errplace
        Command2.Value = True
        Exit Sub
    errplace:
        MsgBox Err.Description
    End Sub
    Error handler in calling code does not prevent Command2_Click event handler from bombing out the whole application.

    Manual error handling in event handlers is mandatory for any professional VB6 produced software.

    cheers,
    </wqw>
    Just looking for an easy rule to identify event_handlers.
    At the top of the code window in the IDE, there are two dropdown menus. The one on the left has the tooltip "Object", while the one on the right has the tooltip "Procedure".
    Is it true to say that if the text in the "Object" dropdown isn't "General", then you're in an event handler?

  31. #31
    Smooth Moperator techgnome's Avatar
    Join Date
    May 2002
    Posts
    34,531

    Re: [RESOLVED] Unhandled error inside code called by by an error handled procedure ?

    Quote Originally Posted by wqweto View Post
    @techgnome: Do you have VB6 installed to test the code?

    In VB6 you programmatically click the button with Command2.Value = True so the sample code in Command3 actually brings down the whole app, no matter that there is an active error handler when the Command2_Click event is raised (while executing Value property let).

    cheers,
    </wqw>
    I do not ... but the statement still stands that invoking the click event programatically (as the .Value = True does ... which I forgot about) breaks the error handling chain ... rightfully so ... the event handler doesn't have context of where it could have been called from. It's just a windows message that gets added to the list of things Windows needs to handle. As opposed to a direct call to the method.
    It's like the difference between calling someone (they don't really know where you are, or what you're doing) vs physically going to their house.

    Maybe I'm wrong. Maybe not ... but it makes sense... you can't rely on an error handler in calling code that invokes an event to handle any errors that happen in the event handler.

    Error handler in calling code does not prevent Command2_Click event handler from bombing out the whole application.
    Sounds like we maybe saying the same thing but in different ways. I've also had more coffee now so I'm thinking clearly.


    -tg
    * I don't respond to private (PM) requests for help. It's not conducive to the general learning of others.*
    * I also don't respond to friend requests. Save a few bits and don't bother. I'll just end up rejecting anyways.*
    * How to get EFFECTIVE help: The Hitchhiker's Guide to Getting Help at VBF - Removing eels from your hovercraft *
    * How to Use Parameters * Create Disconnected ADO Recordset Clones * Set your VB6 ActiveX Compatibility * Get rid of those pesky VB Line Numbers * I swear I saved my data, where'd it run off to??? *

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width