Results 1 to 29 of 29

Thread: So...why not?

  1. #1

    Thread Starter
    Lively Member
    Join Date
    Apr 2006
    Posts
    67

    Question So...why not?

    People always tell me never to use Goto statements in my code, but nobody has ever really given me a valid reason why not. Its always sort of been a "because I said so" argument. In fact one guy I know told me that his professor in college said if any code contained a goto, he would fail the student on the spot.

    So, whats the real reason this is such a no-no? I've written stuff that programmers in this company have been trying to accomplish for years...and I do most of it with the right combination of If/Then statements & Goto's. When working with spreadsheets, a goto statement lets me perform the same chunk of code over & over on every line of the spreadsheet whether it be 5 or 5000 rows, and as long as the statement ends with (A = A + 1, if wkst.cells(A,1) <> "" then Goto START:,) it works like a charm...I never have to worry about a predefined number of variables, it adapts itself to whatever source data I'm working with, and the code runs as fast as whatever system I'm working in...if all the functions it performs take place in an excel spreadsheet, it can complete a full spreadsheet of 1000+ rows in under a second and has never caused an error for me.

    So, what disadvantages are there to a goto statement really? Sorry if its a dumb question, but the only way I can improve my coding is by asking questions...even the dumb ones.

  2. #2

  3. #3
    Fanatic Member Comintern's Avatar
    Join Date
    Nov 2004
    Location
    Lincoln, NE
    Posts
    826

    Re: So...why not?

    I just had to debug and re-write portions of a program that made extensive use of Gotos, and it is a real nightmare. I literally took me 3 weeks to figure out what all of the functions were doing and a week to re-write the entire thing. The main reason is that you can't just glance at the code and get a good idea of what the program flow is.

    That said, there are really easy ways to avoid Goto use. The example you give is functionally identical to this:
    VB Code:
    1. 'Using Goto
    2. Start:
    3.     '...
    4.     A = A + 1
    5.     If wkst.Cells(A, 1).Value <> vbNullString Then
    6.         GoTo Start
    7.     End If
    8.  
    9. 'Not using Goto
    10.     Do
    11.         '...
    12.         A = A + 1
    13.     Loop While wkst.Cells(A, 1).Value <> vbNullString
    If you have no idea what the code is supposed to be doing (i.e., it isn't your code or you haven't looked at it in months), the second example is a lot clearer.
    Last edited by Comintern; May 9th, 2006 at 04:37 PM. Reason: move code tag

  4. #4
    I'm about to be a PowerPoster! Joacim Andersson's Avatar
    Join Date
    Jan 1999
    Location
    Sweden
    Posts
    14,649

    Re: So...why not?

    Instead of having Goto START you could have made a function call or perhaps put it in a loop. The reason Goto statements are considered bad is because the code may be hard to follow. People love to read code that is correctly indented, so you press Tab after an If statement for example and unindent it where you have the End If part. Now without reading the code inside the If statement I can look at the code and immediatly see where it continues if the If statement would be False. But if you instead use a Goto statement I have to start searching for that.

    This cause something often referred to as spaghetti coding since you can have nested goto statements that takes you to, at first glance, an illogical point in your code. Using correct stuctures and blocks in your code takes away the need for Goto statements altogether. You can always write the code so that a Goto is not necassary (with the possible exception of On Error Goto statements in classic VB, since it lacks structured error handling).

    You should never just write code that works. You should also write code that is maintainable. Writing code that works but isn't easily maintained will at the end be very costly for the company that is stuck with the source.

  5. #5
    Hyperactive Member
    Join Date
    Jun 2004
    Posts
    468

    Re: So...why not?

    An extract taken from http://www.ascotti.org/programming/cc/flow.htm:
    Everyone has heard that goto is evil and has to be avoided at all costs. Well... that's true, but why? In a few words, the answer is that goto takes away from our ability to understand how a program works.

    When we write a program, we face the rather difficult task of describing the behavior of a dynamic process, a program in execution, with a completely static notation: the source code. This is possible because we use the static representation to visualize in our mind the dynamic behavior of the program well before it is actually executed. It is extremely important that the static notation allows us to describe the desired behavior in the most direct and natural way, because each unnecessary step makes it more difficult for us to understand the dynamic process and anticipate the result.

    Structured programming is so good because it provides a notation that is very linear and easy to understand. You can read a piece of code and at runtime the program will do exactly what you read, in the order you read it. And although loops and function calls do require some more mental resources to keep track of them, that is easily within the grasp of everyone.

    This is not so when goto is used. The linearity is lost and each time you encounter a label that can be the target of a jump you are left to wonder: what is the immediate past of the program, which path has it followed to arrive here? And not too much later: what the darn thing is supposed to do?

  6. #6

    Thread Starter
    Lively Member
    Join Date
    Apr 2006
    Posts
    67

    Re: So...why not?

    That makes sense. I've done the Do & LoopWhile thing before...and for some reason just never thought of using it for these same purposes.

    Some of the codes I've written are definately worthy of a little marinara sauce by these definitions...though to be honest, the labels have always helped me understand what its doing more clearly...I never nest a goto statement within another...because I have before, and it turns messy REAL fast. I'll either block a section out by labeling it & ending it with the A+1 & Goto thing, or use 'em for error resolution because quick & easy. For example, one code I wrote compiles the daily order assignments for my organization. It performs 10 different steps to do this and I wrote each step separately & used a label at the beginning of the section. It just repeats the section until (A,1)="" and then moves on to the next section. I guess the same thing could be accomplished with the loop function suggested by Comintern and look more clean in the event that another programmer has to dig into my code.

    The only thing is, with a loop you have to put a comment in there explaining what you're doing...with goto statements the comment is already sort of done for you, I guess thats why they seem so easy to follow to me. A section of a report starts out with a label [ASSIGN_ORDERS:] and ends with [If (a,1) <>"" then Goto ASSIGN_ORDERS:] that tells me exactly what its doing during that section of code. With a loop, I would have to start it out with a comment that says 'This section will assign orders and loop until all orders are assigned. Not a big deal obviously, but as long as you don't try to cross up your goto statements it seems like a loop would require more work.

  7. #7
    I'm about to be a PowerPoster! Joacim Andersson's Avatar
    Join Date
    Jan 1999
    Location
    Sweden
    Posts
    14,649

    Re: So...why not?

    That's the very first time I ever heard somebody say that using labels and goto statements creates self-documented code. I often hear the opposite though.
    Why not create a Sub called AssignOrders and put the loop inside that procedure. That would also make it self-documented.

  8. #8
    I'm about to be a PowerPoster!
    Join Date
    Jan 2005
    Location
    Everywhere
    Posts
    13,647

    Re: So...why not?

    Great thread

    Is there something/somebody requiring you to comment all loops? Because if you use simple and relevant variable names, I would say most loops are more self-explanatory than Gotos. Possibly you are just used to the Goto way and I am used to loops... But with both pre-test and post-test loops as well as For I really don't see how Goto makes things any clearer.
    Last edited by penagate; May 10th, 2006 at 01:10 AM. Reason: For doesn't have brackets in classic VB. :slap:

  9. #9
    PowerPoster
    Join Date
    Nov 2002
    Location
    Manila
    Posts
    7,629

    Re: So...why not?

    Structured programming forces you to step back every now and then and get a feel for the bigger picture on how the short pieces of algorithm best fit together... rather than just limiting your view to where you are and where your gonna jump to next...

    My impression is that your stuck in no man's land and not getting the benefits of both sides. Your not a true spaghetti coder but not a true structured prorgammer.

    You impose structure on your code (eg. avoiding crossing of Gotos, etc) but didn't exert more effort to make it more structured without the Gotos. You don't use procedure calls (and get the benefit of debugging with Call Stack Viewer) and instead create long streams of code... which you make "modular" by segragating with labels. Your using assembly language coding practices on an OOP language.

    And then there's the problem of managing your references... by jumping around you may leave numerous object references which can cause memory leaks, or acciedntally reset the data of object in an intermediate jump, and other unforseen problems... it will become more and more difficult to debug in time.

    Your non conformance to was is expected as appropriate simply because it still works will lead to confusion and difficulties for those who will be reading/updating your code in the future.
    Last edited by leinad31; May 10th, 2006 at 07:42 AM.

  10. #10
    Software Carpenter dee-u's Avatar
    Join Date
    Feb 2005
    Location
    Pinas
    Posts
    11,127

    Re: So...why not?

    The only argument I can find in favor of Goto is job security, since you may only be the one who could understand the code then probably the company may keep you longer...
    Regards,


    As a gesture of gratitude please consider rating helpful posts. c",)

    Some stuffs: Mouse Hotkey | Compress file using SQL Server! | WPF - Rounded Combobox | WPF - Notify Icon and Balloon | NetVerser - a WPF chatting system

  11. #11
    I'm about to be a PowerPoster! Hack's Avatar
    Join Date
    Aug 2001
    Location
    Searching for mendhak
    Posts
    58,333

    Re: So...why not?

    Moved to General Developer
    Quote Originally Posted by Joacim Andersson
    You should never just write code that works. You should also write code that is maintainable. Writing code that works but isn't easily maintained will at the end be very costly for the company that is stuck with the source.
    This statement should be enscribed over the doorway of every programming IT area!

  12. #12
    MS SQL Powerposter szlamany's Avatar
    Join Date
    Mar 2004
    Location
    Connecticut
    Posts
    18,263

    Re: So...why not?

    bpd's quote really said it clearly.

    It's really not the GOTO that is evil - it's the destination label that is evil.

    That label can be arrived at from several GOTO statements making the logic-flow unclear and broken.

    The pitfall in modifying a program with lots of GOTO/label statements is that unless you fully and clearly review the entire algorithm you cannot add code without the possibility of breaking the existing logic flow. Since that logic flow is not singular - it's even more likely.

    Spaghetti code defines this problem visually - several paths of logic all messed up in a pile.

    EXIT SUB is a GOTO to leave the function. That is acceptable - that is because it leaves the function - there is no destination label that when you come upon it you wonder "how many places come to here?". [edit] Although too many EXIT SUB's creates a nightmare to work with as well!

    As HACK pointed out - the Joacim quote is priceless... Someone has to visit your code in the future and maintain or enhance it - that person deserves a properly structured logic flow.

    *** Read the sticky in the DB forum about how to get your question answered quickly!! ***

    Please remember to rate posts! Rate any post you find helpful - even in old threads! Use the link to the left - "Rate this Post".

    Some Informative Links:
    [ SQL Rules to Live By ] [ Reserved SQL keywords ] [ When to use INDEX HINTS! ] [ Passing Multi-item Parameters to STORED PROCEDURES ]
    [ Solution to non-domain Windows Authentication ] [ Crazy things we do to shrink log files ] [ SQL 2005 Features ] [ Loading Pictures from DB ]

    MS MVP 2006, 2007, 2008

  13. #13
    PowerPoster kfcSmitty's Avatar
    Join Date
    May 2005
    Posts
    2,248

    Re: So...why not?

    I think the best way for you to see the problems with GoTo's is to simply try to write the logic down in a flowchart.

    you'll see lines flying across your paper at every jump. Gives me a headache :/

  14. #14
    PowerPoster RhinoBull's Avatar
    Join Date
    Mar 2004
    Location
    New Amsterdam
    Posts
    24,132

    Re: So...why not?

    Quote Originally Posted by dee-u
    The only argument I can find in favor of Goto is job security, since you may only be the one who could understand the code then probably the company may keep you longer...
    I'd rather let you go and have someone re-write that darn thing... Sorry.

  15. #15
    I'm about to be a PowerPoster! Hack's Avatar
    Join Date
    Aug 2001
    Location
    Searching for mendhak
    Posts
    58,333

    Re: So...why not?

    Quote Originally Posted by RhinoBull
    I'd rather let you go and have someone re-write that darn thing... Sorry.
    Nothing to be sorry about RB...I would too.

  16. #16
    Super Moderator Shaggy Hiker's Avatar
    Join Date
    Aug 2002
    Location
    Idaho
    Posts
    40,106

    Re: So...why not?

    By the way, it should be noted that there is little performance cost to a GOTO. It's not like it is inferior in speed, just that it makes maintenance harder. Having said that, I believe that use of GOTO in the fashion you describe would utterly prevent the rare circumstance where you can evaporate an If statement, which does improve performance. However, evaporating If statements only works with certain numerical situations and can be so mind bending (because you actually execute both branches of the If) that doing so is not a good idea unless you need the absolutely fastest code.
    My usual boring signature: Nothing

  17. #17
    PowerPoster techgnome's Avatar
    Join Date
    May 2002
    Posts
    34,687

    Re: So...why not?

    In of itself, GOTO is not inherently bad or evil.... just like any thing else in programming, it's the use of it that makes it bad. And just like most things, there are certain tools for certain situations. The only time I ever type GOTO is in On Error.... primarily because I have no other use for the GOTO. It's an old cary over from the non-procedural days of BASIC, and like the appendix, it hangs around with no real purpose, other than to cause pain and grief once in a while.

    -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??? *

  18. #18
    I'm about to be a PowerPoster! Hack's Avatar
    Join Date
    Aug 2001
    Location
    Searching for mendhak
    Posts
    58,333

    Re: So...why not?

    Quote Originally Posted by techgnome
    ...and like the appendix, it hangs around with no real purpose, other than to cause pain and grief once in a while.
    If there is a more perfect analogy for GOTO, I have never heard it.

  19. #19
    PowerPoster
    Join Date
    Feb 2006
    Location
    East of NYC, USA
    Posts
    5,691

    Re: So...why not?

    Quote Originally Posted by techgnome
    The only time I ever type GOTO is in On Error.... primarily because I have no other use for the GOTO.
    If the error routine has the same cleanup code as the main sub, it's not evil to end the error trap with a GOTO the cleanup in the main routine. Something like
    VB Code:
    1. 'do stuff
    2.  
    3. Cleanup:
    4.   If rsADO.State = adStateOpen Then rsADO.Close
    5.   Set rsADO = Nothing
    6.   If conADO.State = adStateOpen Then conADO.Close
    7.   Set conADO = Nothing
    8.   Exit Sub
    9.  
    10. ErrorRoutine:
    11.   conADO.RollBack
    12.   GoTo Cleanup
    The most difficult part of developing a program is understanding the problem.
    The second most difficult part is deciding how you're going to solve the problem.
    Actually writing the program (translating your solution into some computer language) is the easiest part.

    Please indent your code and use [HIGHLIGHT="VB"] [/HIGHLIGHT] tags around it to make it easier to read.

    Please Help Us To Save Ana

  20. #20
    MS SQL Powerposter szlamany's Avatar
    Join Date
    Mar 2004
    Location
    Connecticut
    Posts
    18,263

    Re: So...why not?

    Actually RESUME would normally be used in that case - so that the ERROR TRAP is "turned back on"...

    We have a RTN_CALLER: label in all our SUBS and FUNCS and will RESUME that from an ERROR TRAP so that cleanup can occur.

    Since it's a standard it's not a spaghetti-code problem for us.

    *** Read the sticky in the DB forum about how to get your question answered quickly!! ***

    Please remember to rate posts! Rate any post you find helpful - even in old threads! Use the link to the left - "Rate this Post".

    Some Informative Links:
    [ SQL Rules to Live By ] [ Reserved SQL keywords ] [ When to use INDEX HINTS! ] [ Passing Multi-item Parameters to STORED PROCEDURES ]
    [ Solution to non-domain Windows Authentication ] [ Crazy things we do to shrink log files ] [ SQL 2005 Features ] [ Loading Pictures from DB ]

    MS MVP 2006, 2007, 2008

  21. #21
    PowerPoster techgnome's Avatar
    Join Date
    May 2002
    Posts
    34,687

    Re: So...why not?

    exactly... that's what the resume is for....Resume, Resume Next, Resume {somelabel}....

    -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??? *

  22. #22

    Thread Starter
    Lively Member
    Join Date
    Apr 2006
    Posts
    67

    Re: So...why not?

    Wow, this thread got big fast. I'm pretty new to the forum & every time I come here I find myself getting more & more impressed with you guys & the info you share. So to answer the questions you've asked me...theres no 'requirement' for me to document everything the code is doing...but our last code-writer quit and I got the dubious honor of replacing him...and his codes are impossible to read, so I had to throw most of 'em away. I label to avoid having that happen. When our mainframe systems are updated I have to update all the codes for abour 40 different macros, so I always make sure I've labeled it in such a way that I can open the code, make the change, and move on...otherwise I'd be stuck there for hours trying to find what I'm modifying.

    Why do I use goto statements? Nobody ever told me not to. I've never had a vb training, never read a book, never had someone sit down & say "okay dim means blah, a sub routine does this, and don't use goto statements" (in fact, even now I honestly dont' know what dim means...just what it does). Now that I'm aware of them, I can use private subroutines for each step & keep the code nice & clean in the future...which should definately make life easier for my successors.

    As far as the job security thing goes...thats why I came lookin' for you guys. Everything I knew about coding was whatever I could figure out on my own...then I got dumped into a programming position that supports over 50 reps who need my codes...so now I've gotta go from shadetree duct-taped together coding to the real deal. I found a bunch of resources online, bought some books, and found you guys. Already, I've made HUGE improvements in both what I can get done, and how the code looks(I think)...so for that I want to say a big thanks!

  23. #23
    Fanatic Member Comintern's Avatar
    Join Date
    Nov 2004
    Location
    Lincoln, NE
    Posts
    826

    Re: So...why not?

    I personally try to avoid having Exit statements inside everything but the simplest functions. I put a label in for the error handler, but don't terminate execution above it. Instead I do an inline error test and let the main code fall through the handler to the common cleanup code:
    VB Code:
    1. Private Sub IE()
    2.    
    3.     On Error GoTo ErrorRoutine
    4.     '...
    5.  
    6. ErrorRoutine:
    7.     If Err.Number <> 0 Then conADO.RollBack
    8.    
    9.     If rsADO.State = adStateOpen Then rsADO.Close
    10.     Set rsADO = Nothing
    11.     If conADO.State = adStateOpen Then conADO.Close
    12.     Set conADO = Nothing
    13.  
    14. End Sub
    That's just a personal stylistic thing I've got in the habit of doing so that I can ensure that both errored code and normal code get the same cleanup.

  24. #24
    PowerPoster techgnome's Avatar
    Join Date
    May 2002
    Posts
    34,687

    Re: So...why not?

    Unfortunately that wouldn't work in our environment as we can and do have multiple error handlers in sections to handle different cases (not all of which result in sub termination).

    I think ultimately it comes down to standards.... and consistency. In a one or two person shop it's not as critical as it is in a 20+person shop. We have some very strict standards here to make it easier for new members to pick up on how things are done, and if some one leaves, any one can read their code because we all do things the same way.

    In those cases where we need cleanup after handling errors, we Resume to a cleanExit: label.

    -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??? *

  25. #25
    MS SQL Powerposter szlamany's Avatar
    Join Date
    Mar 2004
    Location
    Connecticut
    Posts
    18,263

    Re: So...why not?

    For what it's worth - this example shows our boilerplate convention for every SUB and FUNCTION in our apps. Standard DEBUG.PRINT statements - lead to a meaningful IMMEDIATE WINDOW. We declare 6 longs and 5 strings in every function - even if they aren't going to get used. Default ERROR trapping - it gets enhanced if required, otherwise the standard is left in place...

    Works good for us.

    VB Code:
    1. Public Function PrintManager(f As Form) As Long
    2. Dim i As Long, j As Long, k As Long, x As Long, y As Long, z As Long
    3. Dim s1 As String, s2 As String, s3 As String, s4 As String, s5 As String
    4.  
    5. Dim booDoReport As Boolean
    6.  
    7. Debug.Print "   PrintManager"
    8. On Error GoTo Error_Handler
    9.  
    10. Begin:
    11.    
    12.     f.MousePointer = vbHourglass
    13.  
    14.     x = f.mintTabNo
    15.    
    16.     booDoReport = False
    17.    
    18.     For i = 1 To gfrmFieldInfo(x, 0, 1)
    19.         If gfrmFieldInfo(x, i, 4) And 16 Then
    20.             booDoReport = True
    21.             Debug.Print "   PrintManager>DoReport=True w/"; gfrmFieldName(x, i)
    22.             Exit For
    23.         End If
    24.     Next i
    25.    
    26.     If booDoReport Then
    27.         PrintManager = PrintReport(f)
    28.     Else
    29.         Call PrintForm(f)
    30.         PrintManager = -1
    31.     End If
    32.    
    33. Rtn_Caller:
    34.  
    35.     f.MousePointer = vbDefault
    36.    
    37.     Exit Function
    38.  
    39. Error_Handler:
    40.     Call Fatal_Error(Err.Number, Err.Source, Err.Description, "PrintManager")
    41.     Resume Rtn_Caller
    42.  
    43. End Function
    btw - DIM means DIMENSION - back in the old days you DIM'd an array - other variables were already declared by use.

    *** Read the sticky in the DB forum about how to get your question answered quickly!! ***

    Please remember to rate posts! Rate any post you find helpful - even in old threads! Use the link to the left - "Rate this Post".

    Some Informative Links:
    [ SQL Rules to Live By ] [ Reserved SQL keywords ] [ When to use INDEX HINTS! ] [ Passing Multi-item Parameters to STORED PROCEDURES ]
    [ Solution to non-domain Windows Authentication ] [ Crazy things we do to shrink log files ] [ SQL 2005 Features ] [ Loading Pictures from DB ]

    MS MVP 2006, 2007, 2008

  26. #26
    Super Moderator Shaggy Hiker's Avatar
    Join Date
    Aug 2002
    Location
    Idaho
    Posts
    40,106

    Re: So...why not?

    You can still Dim an array, even in .NET. Redim and Redim Preserve are still with us.

    Has little obvious utility for anything other than an array, though. To dimension an array you are stating how many elements it will hold. When you Dim a variable, you state something like the size of the memory needed for that variable. Frankly, I suspect that all variables in .NET are 32 bits long, regardless of what MS says. I think there is nothing but a pointer regardless of whether it is a byte or an integer or a string, but that's a different subject....and one I've never bothered to confirm or refute.
    My usual boring signature: Nothing

  27. #27
    MS SQL Powerposter szlamany's Avatar
    Join Date
    Mar 2004
    Location
    Connecticut
    Posts
    18,263

    Re: So...why not?

    I meant the really, really old days

    Before MS...

    *** Read the sticky in the DB forum about how to get your question answered quickly!! ***

    Please remember to rate posts! Rate any post you find helpful - even in old threads! Use the link to the left - "Rate this Post".

    Some Informative Links:
    [ SQL Rules to Live By ] [ Reserved SQL keywords ] [ When to use INDEX HINTS! ] [ Passing Multi-item Parameters to STORED PROCEDURES ]
    [ Solution to non-domain Windows Authentication ] [ Crazy things we do to shrink log files ] [ SQL 2005 Features ] [ Loading Pictures from DB ]

    MS MVP 2006, 2007, 2008

  28. #28
    Software Carpenter dee-u's Avatar
    Join Date
    Feb 2005
    Location
    Pinas
    Posts
    11,127

    Re: So...why not?

    Quote Originally Posted by RhinoBull
    I'd rather let you go and have someone re-write that darn thing... Sorry.
    I've hoped you wouldn't have taken that seriously, it's just a funny idea of mine when I remembered something quoted in a member's signature about cluttering your code for job security. I don't use GOTO anymore though I have used it when I was just a noob in Turbo Basic era...
    Regards,


    As a gesture of gratitude please consider rating helpful posts. c",)

    Some stuffs: Mouse Hotkey | Compress file using SQL Server! | WPF - Rounded Combobox | WPF - Notify Icon and Balloon | NetVerser - a WPF chatting system

  29. #29

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