Monday, January 31, 2005
Friday, January 21, 2005
Friday, January 14, 2005
Roy just added live message alerts to his blog and I wanted to be cool like him so I did it too. You can now sign up for alerts when this blog updates (see right-hand sidebar for the link or click here). This is handy if you're really really interested in what I have to say the minute I say it and you don't live in an RSS news reader all day. Not really sure who would subscribe... maybe I'll tell my mom.
Tuesday, January 11, 2005
I mentioned a few posts ago that I moved and as you know, if you've ever moved, it takes forever to get the little things unpacked and put in their correct place. I just hung my diploma on my office wall and I had a semi-proud moment. "Bachelor of Science in Computer Science and Minor in Mathematics" it reads. I'm pretty good at the computer dealio, but the math... can't say I remember calculus. I can't even balance my checkbook anymore :-/. OTOH, why would I need to? That's what online banking is for. It's funny how I ended up in the business side of software. I remember (vaugely) all those baloney C++ assignments about calculating how many slices in a 14" pizza or writing a craps game my sophomore year. It didn't get interesting until my junior year when I transfered to a real university and started programming with cool graphics packages on sparc station 10's... which were totally expensive back then. Of course I had all the math down and when I graduated I applied at Lawrence Livermore National Laboratory for some geek-y C++ programming job. Of course I didn't get the job because there were like 1000 applicants. So I took the summer off... practically. One August morning as I was heading out to the jacuzzi my mother found a job in the classifieds that read "Computer programmer. BS in CS required. No experience necessary." So I called, faxed my resume in (litteraly a half of a page) and got a call back for an interview. The company was a small healthcare software company nearby. I nailed the interview and was practiacally hired on the spot. The first month was basically me learning Clipper (summer 87 -- the cool version). I was too afraid to tell them that I wasn't a CIS graduate and I had no idea what an IDX was so I took the Nantucket book home and learned all about relational database programming. I couldn't believe I spent all that time in college and none of it prepared me for writing business software products. However, within four months I had rewritten their internal office management system and they promoted me from junior programmer and gave me a $10K raise (which let me tell you was a shitload because I was still living at home and driving an 81 LeBaron). I realized that college taught me how to think about programming. Even though they didn't specifically teach me about databases, I gained the skill to be able to make sense out of any computer gobbely-gook. (Granted, later going from Clipper to FoxPro 2.0 was maybe like 5 syntactical differences, but still). But of course I still can't figure out what Math ever gave me.....
Friday, January 07, 2005
Here's a complete subclass of the TabControl that has disabled tab page functionality built in. When you set one of the contained tab pages' Enabled property to False, the tab will render in a disabled font color and will not allow the user to open the tab. This version of the tab control handles the EnabledChanged event of any of its contained tab pages and redraws the tab appropriately. Add this class to your toolbox, drop it on a form, add a few tabs like normal. If you want to disable a tab simply set the Enabled property to false in your code:
MyTabControl.TabPage2.Enabled = FalseHere's the class:
Imports System.ComponentModel Imports System.Drawing Imports System.Windows.Forms <ToolboxBitmap(GetType(TabControl))> _ Public Class BaseTabControl Inherits System.Windows.Forms.TabControl #Region " Windows Form Designer generated code " Public Sub New() MyBase.New() 'This call is required by the Windows Form Designer. InitializeComponent() 'Add any initialization after the InitializeComponent() call Me.DrawMode = TabDrawMode.OwnerDrawFixed End Sub 'BaseTabControl overrides dispose to clean up the component list. Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) If disposing Then If Not (components Is Nothing) Then components.Dispose() End If End If MyBase.Dispose(disposing) End Sub 'Required by the Windows Form Designer Private components As System.ComponentModel.IContainer 'NOTE: The following procedure is required by the Windows Form Designer 'It can be modified using the Windows Form Designer. 'Do not modify it using the code editor. <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent() ' End Sub #End Region #Region "--- Disabled Pages Functionality ---" Private Const WM_LBUTTONDOWN As Integer = &H201 Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) If m.Msg = WM_LBUTTONDOWN Then Dim pt As New Point(m.LParam.ToInt32) For i As Integer = 0 To Me.TabPages.Count - 1 If Me.GetTabRect(i).Contains(pt) Then If Me.TabPages(i).Enabled Then MyBase.WndProc(m) End If Exit For End If Next Else MyBase.WndProc(m) End If End Sub Protected Overrides Sub OnKeyDown(ByVal ke As System.Windows.Forms.KeyEventArgs) If Me.Focused Then Dim selIndex As Integer = Me.SelectedIndex If ke.KeyCode = Keys.Left AndAlso Not ke.Control AndAlso Not ke.Alt Then For i As Integer = selIndex - 1 To 0 Step -1 If Me.TabPages(i).Enabled Then Me.SelectedIndex = i Exit For End If Next ke.Handled = True ElseIf ke.KeyCode = Keys.Right AndAlso Not ke.Control AndAlso Not ke.Alt Then For i As Integer = selIndex + 1 To TabPages.Count - 1 If Me.TabPages(i).Enabled Then Me.SelectedIndex = i Exit For End If Next ke.Handled = True End If End If MyBase.OnKeyDown(ke) End Sub Protected Overrides Sub OnDrawItem(ByVal e As System.Windows.Forms.DrawItemEventArgs) Dim leftImgOffset, topImgOffset As Integer Dim rBack As Rectangle Dim rText As RectangleF Dim img As Bitmap Dim format As New StringFormat Dim foreBrush As Brush Dim backBrush As New SolidBrush(Me.TabPages(e.Index).BackColor) If Me.TabPages(e.Index).Enabled Then foreBrush = New SolidBrush(Me.TabPages(e.Index).ForeColor) Else foreBrush = New SolidBrush(SystemColors.ControlDark) End If If Me.TabPages(e.Index).ImageIndex <> -1 Then img = CType(Me.ImageList.Images(Me.TabPages(e.Index).ImageIndex), Bitmap) rText = New RectangleF(e.Bounds.X + (img.Width \ 2), e.Bounds.Y, _ e.Bounds.Width, e.Bounds.Height) Else rText = New RectangleF(e.Bounds.X, e.Bounds.Y, _ e.Bounds.Width, e.Bounds.Height) End If If e.State = DrawItemState.Selected Then If e.Index = 0 Then rBack = New Rectangle(e.Bounds.X + 4, e.Bounds.Y, _ e.Bounds.Width - 4, e.Bounds.Height) Else rBack = e.Bounds End If e.Graphics.FillRectangle(backBrush, rBack) leftImgOffset = 6 topImgOffset = 5 Else leftImgOffset = 2 topImgOffset = 2 End If format.Alignment = StringAlignment.Center format.LineAlignment = StringAlignment.Center e.Graphics.DrawString(Me.TabPages(e.Index).Text, e.Font, foreBrush, rText, format) If Me.TabPages(e.Index).ImageIndex <> -1 Then Me.ImageList.Draw(e.Graphics, e.Bounds.X + leftImgOffset, _ e.Bounds.Top + topImgOffset, Me.TabPages(e.Index).ImageIndex) End If MyBase.OnDrawItem(e) End Sub Private Sub Tab_EnabledChanged(ByVal sender As Object, ByVal e As EventArgs) If TypeOf sender Is TabPage Then Me.Invalidate(Me.GetTabRect(DirectCast(sender, TabPage).TabIndex)) End If End Sub Protected Overrides Sub OnControlAdded(ByVal e As System.Windows.Forms.ControlEventArgs) If TypeOf e.Control Is TabPage Then AddHandler e.Control.EnabledChanged, AddressOf Tab_EnabledChanged End If MyBase.OnControlAdded(e) End Sub Protected Overrides Sub OnControlRemoved(ByVal e As System.Windows.Forms.ControlEventArgs) If TypeOf e.Control Is TabPage Then RemoveHandler e.Control.EnabledChanged, AddressOf Tab_EnabledChanged End If MyBase.OnControlRemoved(e) End Sub #End Region End Class
Thursday, January 06, 2005
Tuesday, January 04, 2005
Well I'm back after an *awesome* winter break! (Even though I was back to work yesterday, I was overloaded with catch-up work and I just couldn't spare anytime to get a post out.) Okay what's new? Well, we bought a house and we moved in right before Christmas! This was good and bad timing. I had last week off so it was nice to not have to take regular vacation to get moved. On the other hand dealing with the banks, getting new carpet installed and scheduling a move in the rain is not my idea of fun and would have probably been easier to do in the spring or at least away from the holidays. I was a total stress case. Now I'm back to work and felling more relaxed believe it or not. I'm still dealing with a bunch of boxes and my whiteboard in my office is still on the floor, but at least the cable modem is working.