This is a list of stuff I've found after much heart-rending investigation that makes VB a really crappy language.
UserControls: The debugger lists internal properties of ActiveX controls, but you cannot actually access them. It turns out that this is because the properties of an ActiveX control are hidden by default, which makes sense, but damn, it shouldn't take 5 hours to figure this out. To get around this, you need to create public methods, variables and properties in the object and they will be automatically exposed.
The object model for dynamic controls is very screwed up, as well, with three different objects containing things: Object, Extender and UserControl. Extender is basically the information that can't be known until runtime and are created when you create the control: x, y, width, height, etc. You won't find these in the Object. Object is a link back to the actual object from the Extender. It's not so useful, really, since Extender (should) show you all the properties and methods of the object. Remember that for an ActiveX control the contained controls and ordinary properties are not available in Object or Extender. You can only access them from the UserControl object, and only in the actual UserControl (not outside). VB makes their object model "nice" for you by freely mixing these properties in different places.
Inheritance: No inheritance. Period. This is inexcusable for a graphical language where you're basically deriving from other controls all the freakin' time. Encapsulation is no fun.
Constructor Arguments: No constructor arguments either. This is slightly more understandable than the lack of inheritance because of the retarded way in which you create dynamic controls in VB, but still, not everything is a dynamic control, and sometimes you want to ensure that your control is not in an invalid state-- constructors ensure this.
Window Height: The zero point (top) of a window with a menubar
is actually just below the menubar. But the height of the window, when
you resize it, includes the size of the window. So
top + height is not in fact the amount of area you
have to place a control. It is actually 324 twips less.
Solid Frame Backgrounds: Well, that's not the problem. The problem is you can't make an invisible background on your frame. I don't know for sure if it is impossible to do this otherwise, though. I just need a container that allows you to place
Scrollbar Colors: Why the hell can't you set the colors on a scrollbar? All the MS products have prettier gray background, including the IDE you use to insert a scrollbar, and all we get is stark white? Pshah.
Objects on a Form: As you know, you can have controls nested inside controls on a form. But you don't access the nested controls from the controls they are nested in. You have to access them straight from the outside. Just a general violation of OO, in my opinion.
Missing, Empty, Null and Nothing: Missing and Empty apply only to variants. You can test for those two with IsMissing() and IsEmpty(). To test for Nothing however, you need to use "x Is Nothing". You can only set an object to Nothing; an object variable can be Null, but you can't apparently do that yourself. You can ask if something Is Not Null but you cannot ask if it Is Not Nothing. Make up your mind, people!
SourceSafe Is Evil. I could write volumes about this. Mainly it doesn't work very well when multiple developers are working on a project. I had too many problems to count. Files disappearing, having to reopen the project just about every time I checked stuff in, project files suddenly emptying, etc. It's not worth it, though. Use CVS instead.
No Short Circuit: And and Or do not short circuit. If you don't know what I'm talking about, you're not a programmer or you're a VB programmer. Sad.
Multimedia Control Doesn't Rewind: This ain't so bad. But still it took an hour and a half to figure out and I only did so because I found someone else's code. Whenever you want to play and record and such, make sure you rewind before play and record and after stop. If you want to replace the WAV, close the stream, kill the file and reopen the stream. Also, the "PlayFinished" event doesn't seem to happen just after play is finished ... it happens after someone is finished clicking the play button! Argh.
Not Resolution-Independent: What the hell is this about? They go to all the trouble of inventing a new platform- and screen-resolution-independent measure of distance (twips) and then *relative* positions of buttons on a form get screwed up between 1024x786 and 800x600? Give me a break!
This stuff don't so much stink up the place visibly; they are more like that faint weird smell you've had in the car for months but haven't bothered to deal with.
Form Defaults: The defaults of a form (created at design time) appear to be
available by using the form name. When you change the height of your object,
for example, <FormName>.height does not change. This just gets
confusing, especially with the "helpful" IDE showing you that name as available to
use, and with that object being a totally different but completely valid object.
(Editor's note: the first sentence is a supposition based on the evidence
presented in the second sentence.)