Office: 270.245.1188 Emergency: 270.752.0059
Site Contents

C O M P A N Y

Overview
Advantages — Blade's Edge
Personnel
Contracts & Rates
Contact


S E R V I C E S

Software Engineering
Systems Analysis
Networking & Security
Repairs & Upgrades
Training & Support


P O R T F O L I O

Overview
Landmark Projects
Government Projects
Non-Profit Projects
Development Tools
Scientific & Technical Projects
Support & Business Tools
Consumer Products
Portfolio: Development Tools
 
Jump To:  Overview |  VBMetrics |  AppAid |  RESonator |  Custom Controls
 
 

The utilities featured below arose naturally from inefficiencies (and sometimes deficiencies) encountered through daily use of standard integrated development environments.

Though originally intended to streamline operations for myself, employer, company, and/or clients — as with more than a few of the projects birthed from my impetuousness — I should've put a little polish on some of these and offered them commercially.

 
 
VBMetrics
 
Jump To:  Overview |  VBMetrics |  AppAid |  RESonator |  Custom Controls
 
 

I N T R O D U C T I O N

VBMetrics was originally written to give developers an objective (if extremely narrow) way to recognize areas where refactoring is most needed, and to keep them at least minimally accountable. (Because we all know that managing programmers is like herding cats.)

The initial focus was on measuring module and class size, but quickly grew to encompass an extensive breadth and depth of statistical analyses. This utility made it easy to identify a variety of development issues, such as who had the most blood on their hands from global-variable-declarations (although early versions of Visual Basic didn't exactly make such sins easy or to avoid).


D E V E L O P M E N T

VBMetrics automated some of the processes used in code-reviews and helped us peg some violations of best-practices that otherwise might only be stumbled upon while working on other tasks. For example, rather than relying on the "entire procedure should fit on one screen" guideline, a comprehensive list of procedure in a project could be sorted by line count and refactored from top-to-bottom (i.e. most-to-least-egregious).

Still, even this procedure relies on the manager, who may not remember to run this check as often as he should. To combat that problem, the manager can simply enable the "Procedures should not exceed X lines" rule and set the number of maximum lines in the "Code Quality" area. From that time on, every code analysis run on the project will produce the appropriate code-length warnings, ensuring that no violations are ever overlooked.

Code-quality analysis can also check for elements such as procedure-level error-handling, silent-consumption error-handlers, member naming conventions (user-configurable, of course), (potentially) unnecessary late-binding, failure to deallocate/dispose of resources, reckless string concatenation (a costly problem in VB), etc.


P O S T - M O R T E M

Of course, commercial tools such as CodeSmart soon surpassed VBMetrics' capabilities simply due to the resources allocated to them. Ours was simply an internal tool intended to drive efficient development of our "money" product. Thus, this is yet another on a lengthy roll of products that should've been polished and marketed. What's the expression? "It's not what you've done that you'll later regret as much as what you didn't do." Something like that.

Click Any Image to Enlarge

Click right half of image to move forward
Click left half of image to move backward
Or use LEFT and RIGHT cursor keys








 
 
AppAid
 
Jump To:  Overview |  VBMetrics |  AppAid |  RESonator |  Custom Controls


I N T R O D U C T I O N

From Blade Technologies proprietor Jason Purcell:

Those of you who worked Visual Basic in the mid-'90s will nod knowingly when I say that VB4 was a revelation. In the years immediately preceding my introduction to VB3, I spent my time in C, C++, and Ada. So as great as VB 3 was for popping out small-business database apps, it was horribly limited in so many ways, and I'd be lying if I said I didn't feel cheap and dirty using it on a day-to-day basis. (I wasn't my own boss at the time.)

Now, VB4 didn't solve these problems, but at the time, it represented by far the most significant advancement between VB versions. Hey, we've got classes! Not classes the way we'd hoped, but we were grateful to get something akin to "instantiable modules." ;-) ("It's life, Jim, but not as we know it.")

So to fill the gaps — and to further strengthen Visual Basic's heralded GUI functionality and database tools — AppAid was created. It was written as add-in to the IDE for immediate-access, and was comprised of a constantly-growing lineup of programming utilities. For example:


D E V E L O P M E N T

  1. Error-Code Manager: This component searched the source and added global error-handling code to any procedure that lacked it. Alternately, both global and error-specific code could be removed for temporary debugging purposes. The user could specify one of any number of error-handling snippets (all of which were "remembered" by the utility, of course) and target the code in the active form/module/class, a subset of same, or the entire project. The results of every operation were reported in detail and could be reversed with a single click.

  2. Layout Assistant: This utility was originally written to vertically and/or horizontally center one or multiple controls, a feature that Microsoft didn't ship until VB6, IIRC. Over time, additional functions were added: Every control's dimensions, container coordinates, and absolute form position were enumerated in a printable listbox for reference when writing resizing code and working with GDI calls. Multiple controls could be automagically resized to user-specification or to match a designated control. For many operations, the user was allowed to express dimensions in either pixels or percentages of current control size, available x/y space, or form size.

  3. Form-Generator: Using this tool, a new form could be cloned from an existing form or created from scratch. Any number of controls from the source form could be included in the destination, and user-determined code snippets could be programmatically inserted for any event in the new form, (typically the Load, Activate, Unload events, in our case) or added as standard procedures.

  4. Data-Mapper: Building on VBs calling-card of rapid database-application development, this component allowed the user to map database fields to controls either through a listview/combobox system or via drag-and-drop. (Controls without a DataField property were mapped via their Tags.) It also provided a one-stop view of all controls and their mappings, and inserted auto-generated binding code (for controls without native-binding) and code to format text from a user-customizable lists of masks.

  5. Control-Collection Generator: This utility generates a control array of a user-specified type and places it in a container of a user-specified type. Options include vertical or horizontal control layout and auto-sized or full width/height containers. For controls that don't support native arrays, Tag properties are used to store indices.

P O S T - M O R T E M

As much as AppAid streamlined our development, it was just that — for our development. We never considered marketing it because most of its features were built to fit our company's way of doing things.

I do regret not publishing the code and an accompanying article somewhere to demonstrate how to write a VB4 add-in (and to show off some of the actual utility code), but that was three or four years before Code Project, and I've always chosen to spend my programming time working on new, shiny stuff rather than talking about past efforts, anyway. That's why it's taken years for me to post these project descriptions on my own site!


No screenshots due to missing
OCXs, but dug this horrendous
thing out of the main screen!
 
 
RESonator
 
Jump To:  Overview |  VBMetrics |  AppAid |  RESonator |  Custom Controls
 
 

I N T R O D U C T I O N

One of our clients offered several sizable applications across multiple continents. Through our time on-site and some off-hand conversations with employees, we learned that even a fairly minor update to an application's translations normally took several days.

A summary of their tedious, error-prone process:

  1. During every development cycle, each coder is required to keep a list of resource identifiers whose value has changed in any way. Of course, developers are more concerned with coding than documenting, so oversights inevitably occurred.

  2. At the end of a cycle, the developers send their change logs to a designated employee in support or QA. We'll call this guy Kurgan.. Kurgan — who has been set up with an IDE for this task — opens each resource file one-by-one and copies newly-added resource ids and modified-id/value pairs to an Excel worksheet corresponding to the form name. If a new language/culture is slated for support, thousands upon thousands of copy/paste operations are in Kurgan' future. Although rare, an id or value is sometimes copied from or pasted into an incorrect row.

  3. The workbook is then e-mailed to multiple employees and consultants, since there isn't a single person with expertise in all the target languages, never mind all the target cultures. These consultants generate new translations, update those whose English source has changed, and return the workbooks to Kurgan.

  4. Kurgan then opens each worksheet in each workbook and copies the translations back to the correct row in the corresponding resource file.

    Except that sometimes, this cerebral mind-bore of a task short-circuits Kurgan' brain and a translation ends up in the wrong row. He might catch this immediately and be able to make the appropriate repairs. Or he might not, and end up duplicating a translation or participating in a human-executed off-by-one error for few iterations. Or maybe he doesn't learn of his mistake until he nears the end, at which time he may opt to revert to a saved copy and start over, since he's not sure exactly when or how he got out of sync and doesn't speak the languages he's working with.

Even after Kurgan finishes his punishment-task, chances are, undetected errors remain. Historically, this process has never been without error.


D E V E L O P M E N T

Enter RESonator. With a few clicks, all resource files in a project can be exported to an Excel workbook. As above, this workbook is sent to translators, who fire it back after completing their work. Then, with a couple more clicks, the worksheets are merged with the resource files.

Once we had this process working, we coded to save both incoming and outgoing files. Admittedly, this was a CYA measure, but it gave us the ability to add comparison code to the program so that developers were no longer required to maintain resource change logs.


P O S T - M O R T E M

Kurgan is no longer required by any part of this process. No copy/paste errors. Hours — usually days — saved, per application per development cycle. Developers kiss us on the lips. Kurgan wants to have our baby. Mission accomplished.

From Blade Technologies proprietor Jason Purcell:

Two aspects of this case are highly-instructional:

  1. The Cobbler's Children Have No Shoes: Much like the situation we were in regarding VBMetrics, this client knew they had an automation issue but couldn't bring themselves to assign a developer to solve it when there was so much work to do on the products generating their revenue streams. In fact, this phenomenon has always been responsible for a great deal of our work: We often get the jobs no one else wants.

  2. We learned of this problem — and solved it — only because we were on the client's site completing another project: It's not uncommon for us to get a job just by keeping our eyes open and asking a few questions. Despite the ubiquitous platitude, opportunity doesn't come knocking as much as it waits to be recognized and knocked-upon. For another example, look no further than RESonator.
Click Any Image to Enlarge

Click right half of image to move forward
Click left half of image to move backward
Or use LEFT and RIGHT cursor keys




 
 
Custom Controls
 
Jump To:  Overview |  VBMetrics |  AppAid |  RESonator |  Custom Controls
 
 

I N T R O D U C T I O N

On many occasions, we've authored custom-controls for reuse across multiple projects belonging to the same client or in multiple locations within the same project. Typically, these controls combine standard GUI elements, the code governing their interactions, and stone-carved business logic or functions that retrieve and enforce dynamic business rules. Efficient stuff, but not so exciting.

On the other hand, we've managed to seize a few opportunities to actually create rather than simply synthesize controls. (As with most opportunities, these arose from obstacles, challenges, and limitations.) In brief:


S L I C K C O M M A N D

This Visual Basic 4 CommandButton replacement was written to recreate and explore some of the graphical UI enhancements that were just beginning to appear around 1996. It was built on our hybrid VB-class/C-library Win32/GDI wrappers. SlickCommand buttons included support for gradients, non-rectangular forms, and angular text, and mimicked the flat, transparent, borderless, pop-up buttons that had recently come to represent high-fashion Windows GUI. This control was used in PowerClaim 97 and 98, but for consistent object-hierarchy were replaced in PowerClaim 2000 with a similar control from a component-suite we'd adopted..


C A B I M E T

Our CabiMet (i.e. "cabinet metaphor") control, incorporates the SlickCommand control and duplicates and extends the new navigation interface featured in 1996's Outlook 97 beta. We generated additional GDI wrappers around fast bitmap operations to support vertical smooth-scrolling and skins/themes. Among other properties and behaviors, button-spacing, margins, scroll-speed, and transition-type can be programmatically specified.

CabiMet was used as the primary navigation mechanism in PowerClaim 97, but like computer-users as a whole, our customers resisted the new metaphor. For that reason and because we desperately needed to reclaim the horizontal screen space for other UI elements, CabiMet was soon replaced by a system that used a combination of universal and contextual toolbars, but it remains a complex and satisfying work.


T R E E L I S T

While building Hand.db on the earliest versions of the Compact Framework, we discovered a need for a more powerful TreeView control. TreeList, as its name implies, combines functionality from the TreeView and ListView controls. Basically, it provides multi-column treeviews. Different column configurations can be set for each node level, and each column can display both an image and a text value. Functions are built-in for searching by column or row and for sorting nodes by any column image and/or text value.


Outlook 97
inspired our superior
CabiMet control
 
 
[Back to Top]