November 2007 - Posts

I hate having to open SQL Server or Microsoft Access just to look up a table or column name. Therefore I usually print out a data dictionary for future reference. Of course, I could just use Server Explorer in Visual Studio but I am not in the habit of using that (possibly because Server Explorer is not descriptive of what it actually does).

I've been referring to my data dictionaries as "database design" but I've checked Wikipedia and I guess database schema would be a better term for your data model and data dictionary is the correct term for documentation. I know phpMyAdmin allows you to generate this kind of information about your database and phpMyAdmin calls it a data dictionary.

Anyway, here is the ASP.NET code I use to generate my data dictionaries. The only interesting thing about the code is that it dynamically generates datagrids for each table.

<%@ Page Language="vb" AutoEventWireup="false" Codebehind="data_dictionary.aspx.vb" Inherits="data_dictionary"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
    <HEAD>
        <title>Data Dictionary</title>
        <meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.1">
        <meta name="CODE_LANGUAGE" content="Visual Basic .NET 7.1">
        <meta name="vs_defaultClientScript" content="JavaScript">
        <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
        <meta name="author" content="Robert S. Robbins">
    </HEAD>
    <body bgcolor="#FFFFFF">
        <h1 style="font-family:Arial;">Data Dictionary</h1>
        <hr noshade color="#000000">
        <font face="Arial">The purpose of this script is to document the database schema.</font>
        <br><br>
        <form id="Form1" method="post" runat="server">
        <asp:panel id="pnlErrorMessage" Visible="False" Runat="server">
            <BR>
            <asp:Label id="lblErrorMessage" Runat="server" Visible="False" ForeColor="#cc0000" Font-Name="Arial"></asp:Label>
        </asp:panel>
        </form>
    </body>
</HTML>

Imports System.Data.SqlClient
Imports System.Data
Imports System.Drawing

Public Class data_dictionary
    Inherits System.Web.UI.Page

#Region " Web Form Designer Generated Code "

    'This call is required by the Web Form Designer.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

    End Sub
    Protected WithEvents lblErrorMessage As System.Web.UI.WebControls.Label
    Protected WithEvents pnlErrorMessage As System.Web.UI.WebControls.Panel

    'NOTE: The following placeholder declaration is required by the Web Form Designer.
    'Do not delete or move it.
    Private designerPlaceholderDeclaration As System.Object

    Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
        'CODEGEN: This method call is required by the Web Form Designer
        'Do not modify it using the code editor.
        InitializeComponent()
    End Sub

#End Region

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Put user code to initialize the page here
        Try
            'Create a connection string
            Dim connString As String
            connString = ConfigurationSettings.AppSettings("ConnectionString")

            'Open a connection
            Dim objConnection As New SqlConnection
            objConnection.ConnectionString = connString
            objConnection.Open()

            'Specify the SQL string
            Dim strSQL As String = "SELECT table_name FROM information_schema.tables " & _
		"WHERE table_catalog = 'YOUR_DATABASE_NAME_HERE' " & _
		"AND NOT table_name = 'dtproperties' " & _
		"AND NOT table_name = 'sysconstraints' " & _
		"AND NOT table_name = 'syssegments' " & _
		"ORDER BY table_name;"
            Dim objCmd As IDbCommand = objConnection.CreateCommand()
            objCmd.CommandText = strSQL
            Dim objReader As IDataReader = objCmd.ExecuteReader()

            Do While objReader.Read()
                CreateGrid(objReader("table_name").ToString())
            Loop

            objReader.Close()
	    objConnection.Close()

        Catch ex As Exception
            pnlErrorMessage.Visible = True
            lblErrorMessage.Text = ex.Message & "<br>Error loading data from database."
            lblErrorMessage.Visible = True
        End Try
    End Sub
    Public Sub CreateGrid(ByVal table_name As String)
        Dim DataGrid1 As New DataGrid
        Dim DataGridSpacer As New System.Web.UI.WebControls.Panel
        Dim DataGridHeader As New System.Web.UI.WebControls.Label

        DataGrid1.ShowHeader = True
        DataGrid1.AutoGenerateColumns = False
        DataGrid1.CellPadding = 3
        DataGrid1.HeaderStyle.Font.Bold = True
        DataGrid1.HeaderStyle.Font.Name = "Arial"
        DataGrid1.HeaderStyle.Font.Size = FontUnit.Point(10)
        DataGrid1.HeaderStyle.BackColor = ColorTranslator.FromHtml("#ECECEC")
        DataGrid1.ItemStyle.Font.Name = "Arial"
        DataGrid1.ItemStyle.Font.Size = FontUnit.Point(10)

        DataGridSpacer.Height = System.Web.UI.WebControls.Unit.Pixel(20)
        DataGridHeader.Text = table_name
        DataGridHeader.Font.Bold = True
        DataGridHeader.Font.Name = "Arial"
        DataGridHeader.Font.Size = FontUnit.Point(10)

        Dim datagridcol_1 As New BoundColumn
        datagridcol_1.HeaderText = "column_name"
        datagridcol_1.DataField = "column_name"
        DataGrid1.Columns.Add(datagridcol_1)

        Dim datagridcol_2 As New BoundColumn
        datagridcol_2.HeaderText = "data_type"
        datagridcol_2.DataField = "data_type"
        DataGrid1.Columns.Add(datagridcol_2)

        Dim datagridcol_3 As New BoundColumn
        datagridcol_3.HeaderText = "numeric_precision"
        datagridcol_3.DataField = "numeric_precision"
        DataGrid1.Columns.Add(datagridcol_3)

        Dim datagridcol_4 As New BoundColumn
        datagridcol_4.HeaderText = "character_maximum_length"
        datagridcol_4.DataField = "character_maximum_length"
        DataGrid1.Columns.Add(datagridcol_4)

        Dim datagridcol_5 As New BoundColumn
        datagridcol_5.HeaderText = "is_nullable"
        datagridcol_5.DataField = "is_nullable"
        DataGrid1.Columns.Add(datagridcol_5)

        Dim datagridcol_6 As New BoundColumn
        datagridcol_6.HeaderText = "column_default"
        datagridcol_6.DataField = "column_default"
        DataGrid1.Columns.Add(datagridcol_6)

        Try
            'Create a connection string
            Dim connString As String
            connString = ConfigurationSettings.AppSettings("ConnectionString")

            'Open a connection
            Dim objConnection As New SqlConnection
            objConnection.ConnectionString = connString
            objConnection.Open()

            'Specify the SQL string
            Dim strSQL As String = "SELECT column_name, data_type, numeric_precision, character_maximum_length,is_nullable, column_default FROM information_schema.columns WHERE table_name = '" & Trim(table_name) & "';"
            Dim objCmd As IDbCommand = objConnection.CreateCommand()
            objCmd.CommandText = strSQL
            Dim adapter As New SqlDataAdapter(objCmd)
            Dim rs As New DataSet
            adapter.Fill(rs)

            DataGrid1.DataSource = rs
            DataGrid1.DataBind()

            Page.Controls(1).Controls.Add(DataGridSpacer)
            Page.Controls(1).Controls.Add(DataGridHeader)
            Page.Controls(1).Controls.Add(DataGrid1)

	    objConnection.Close()

        Catch ex As Exception
            pnlErrorMessage.Visible = True
            lblErrorMessage.Text = ex.Message & "<br>Error loading data from database."
            lblErrorMessage.Visible = True
        End Try

    End Sub
End Class

How many Microsoft developers use the MSDN Library? Probably not many because I've just read a blog post where someone recommended not even installing it. I have to admit that I never even opened the Microsoft Document Explorer until I learned how to add my own notes as a custom help collection. Now I use the Microsoft Document Explorer every day. I'm a bit concerned that I am duplicating content that is already baked in so I've spent some time browsing the MSDN Library. You can save interesting help topics as favorites and here are a few of my favorites:

Colors by Lightness - ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WEBDEV.v10.en/css/workshop/author/dhtml/reference/colors/colors_light.htm

I have some color charts in my notes but these light colors are better for web design.

CSS Enhancements in Internet Explorer 6 - ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WEBDEV.v10.en/dhtmltechcol/dndhtml/cssenhancements.htm

This includes a diagram of the CSS box model.

C# Programming Guide - ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.en/dv_csref/html/ac0f23a2-6bf3-4077-be99-538ae5fd3bc5.htm

Lots of information about some of the more advanced features of C# like Generics and Delegates.

Visual Studio 2005 IDE Tips and Tricks - http://msdn2.microsoft.com/en-us/library/bb245788(VS.80).aspx

Plenty of screen shots here. This is actually a live link because you can save any web address as a favorite in the Microsoft Document Explorer.

So why don't developers use the MSDN Library? There are several improvements that could be made to encourage you to use it. First and most importantly it needs to be customizable so you can take ownership of the information. You ought to be able to annotate the MSDN Library with comments and sticky notes like so many other applications allow. Unfortunately, you cannot even highlight text and retain it. It is possible to add your own help collection as I have done but this requires a lot of effort.

Second the search needs to be improved. I am unable to search my custom help collection and it does not even appear in the index. It would require a massive effort for me to create an index even though all of my help topics have keywords in their original web page format. I also never get anything in Local Help when I conduct a search no matter how I fiddle with the options to get it to search local help.

So what about the Community Content in the Online Help? Anyone can comment or add to the online content. Unfortunately, not many developers are bothering to do so except when the existing content has some really inaccurate information. This makes the Online Help's Community Content look like some sort of pathetic wiki that nobody bothers to contribute to.

 

Over the weekend I was busy fixing a shipping problem in the commercial ASP.NET 1.1 web application, Storefront 6.0 by LaGarde. When the United States Postal Service (USPS) changed their web services it caused some problems for many web sites that use shopping carts. I know OsCommerce, a PHP and MySQL open source shopping cart, had problems but this was quickly fixed because it is open source software. Web sites that used Storefront 6.0 were not so lucky because the developer has abandoned this product. I know they still support their high end version for some really big enterprise clients but they have angered many small business clients by dropping support for Storefront 6.0. This shopping cart already had 8 service packs but there have been no more code fixes for over a year. It was never converted to ASP.NET 2.0.

I am able to fix problems in Storefront 6.0 because I have the XE version which included the source code for the four additional projects that compile into DLLs which is all you get with the other versions. LaGarde no longer sells the XE version so you are out of luck if you need anything changed in those DLLs unless you can find a web developer with the XE version. The problem with the USPS web service is really simple. They longer accept the USPSINT code so there is a class file that needs to be edited so it does not send that code in the XML request for shipping rates.

I also recently fixed a similar problem with another shipping service that integrates with Storefront 6.0, Freightquote. They changed their web service so that you need to use a different name for a XML node in the XML request. Again, this is a simple thing to fix but it is in code that gets compiled into a DLL which you cannot touch without the source code for a Visual Studio 2003 project.

These problems raise several interesting considerations in evaluating web applications for use in your business. Should you go with open source web applications or commercial web applications? Commercial web applications that will not be maintained definitely put you at risk. I would not recommend going with a shopping cart if you don't get the full source code. You might assume that open source web applications are the better choice but keep in mind that these projects can be abandoned too. They can be abandoned by their original developers and nobody may be interested in picking up the ball. As an independent web developer, I need to decide which shopping carts are worth my time to learn. It requires a considerable investment of my time to learn how to customize a shopping cart to meet business needs.

OsCommerce is very popular and there is a high demand for customizations. I have not done much with it because I don't know PHP that well and there is a lot of competition. From my perspective, supporting Storefront 6.0 has been worthwhile because businesses that went with it are now in great need of customization work and they don't have a lot of options. However, many web sites are going to want to get off Storefront 6.0 so maybe it would be better to learn how to migrate it to something else. 

Finally, lets consider why this code rot is occurring at all. Both of the problems I've seen involve a provider of a web service changing their API without making it backwards compatible. They are responsible for breaking shopping carts and putting a burden on small businesses. So you should be leery of any web application that is integrated with a third party web service. This concerns me because I've built web applications that are dependent on third party web services and if the API changes I have to update my code. Web applications should be designed to be extensible in regards to web services but I'm not sure how to accomplish this. Maybe this is something that BizTalk is good for, assuming you can modify your XML requests and responses on the fly by capturing your web application traffic???

 

 

Raster graphics are bitmap image files where each pixel is defined as a point of color in a grid. Converting raster graphics to a vector graphic image format like SVG or XAML is not easy. Some graphics programs have an auto-trace feature which attempts to create the vector paths by tracing the raster graphic but I have had little success with that feature. The results are often terrible. You could try to trace an image to create paths using some pen tools but you'll find that requires you to be an expert with pen tools and it is exceedingly frustrating.

Fortunately, I am subscribed to Chris Pirillo's lockergnome channel on YouTube and saw his video about VectorMagic, a web site that provides a free service to convert raster graphics to vector graphics: http://vectormagic.stanford.edu/ I've used this web application to convert my company's complex logo into a vector graphic and I was quite impressed by the results.

VectorMagic will give you the download for a SVG version of your bitmap image. This SVG image file will be in the compressed, binary format so you may have some trouble opening it in some graphics programs. However it can be opened in Adobe Illustrator and you can then save it as a SVG file which will not be compressed. To convert the SVG file to XAML you need Mike Swanson's Illustrator plug in for exporting to XAML: http://www.mikeswanson.com/xamlexport/

I spent my entire Saturday working on a Silverlight application and studying the technology only to discover that I was unable to deploy my application to the Internet so I could blog about Silverlight. My application requires a reference to the Silverlight plug-in and I was unable to work around a JavaScript error: slPlugin.content is null or not an object. I was even unable to get any of my Silverlight applications to run on my local web server from the localhost web address. In fact, nothing seems to work unless you launch the application from the Visual Studio development environment! Needless to say, this was very frustrating and has lessened my interest in Silverlight.

 However, I am still very interested in vector graphics because they can be used in Adobe's After Effects. In After Effects, vector graphics can be scaled to any size and they will still remain sharp. But more importantly, you can convert vector graphics into 3D shapes for 3D animation using the Zaxwerks 3D Invigorator plug-in for After Effects. 3D Invigorator runs very slow on my system, I need to upgrade to the pro version which uses OpenGL, but the results are eye-popping and extremely impressive. 3D Invigorator has given me a great need for vector graphics and the VectorMagic web site gives me the ability to convert any image to a vector graphic.

I've recently started reading the book Professional ASP.NET 2.0 Design: CSS, Themes, and Master Pages by Jacob J. Sanford and skipped ahead to Appendix B: An Introduction to Microsoft Silverlight. This chapter provides an excellent introduction to Silverlight projects using Visual Studio 2008 and the Silverlight 1.1 Alpha SDK. Unfortunately, the Wrox web site did not have a download for this chapter and I had to type in all the code and come up with one image. I learned that XAML tags are case sensitive! I finally got the analog clock example working. Clocks seem to be a popular demonstration project for Silverlight!

I learned enough to tackle my own project. A long time ago I found some sample code for generating spirograph designs and it is been my favorite algorithm ever since. I've used this code wherever a language permits one to draw lines. I've used Perl and the Tk GUI library to draw spirograph designs in Linux and I've even used it on my Palm handheld device. Since the analog clock example demonstrated drawing lines on the canvas dynamically that was all I needed to know to use my favorite graphic trick.

Silverlight Spirograph

The canvas does not require any objects because all of the lines will be drawn through code:

<Canvas x:Name="parentCanvas"
        xmlns="http://schemas.microsoft.com/client/2007"
        
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        
Loaded="Page_Loaded"
        
x:Class="Spirograph.Page;assembly=ClientBin/Spirograph.dll"
        Width="590"
        Height="590"
        Background="White"
        >
</
Canvas>

You can create a variety of interesting patterns just by changing the radius of the fixed circle or the offset of the moving circle. Usually I would add textboxes so you can change these values and then redraw the screen but I have not learned how to do this yet in XAML.

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents; using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Diagnostics;

namespace Spirograph
{
    
public partial class Page : Canvas
    {
        
public void Page_Loaded(object o, EventArgs e)
        {
            
// Required to initialize variables
            InitializeComponent();

            
int x = 0;
            
int y = 0;
            
int prevx = 0;
            
int prevy = 0;
            
int t;
            
int R = 35; // Radius fixed circle
            int I = 400; // Iterations
            int r = 1; // Radius moving circle
            int O = 150; // Offset in moving circle
            string hex = "#0000FF";
            
string xaml = "";
            
Line line = new Line();
            
Canvas parentCanvas = (Canvas)this.FindName("parentCanvas");

            
for (t = 0; t <= I; t++)
            {
                prevx = x;
                prevy = y;
                x = (
int)((R + r) * Math.Cos((double)t) - (r + O) * Math.Cos((double)(((R + r) / r) * t)));
                y = (
int)((R + r) * Math.Sin((double)t) - (r + O) * Math.Sin((double)(((R + r) / r) * t)));
                
if (t > 0)
                {
                    
if (hex == "#00FF00")
                    {
                        hex =
"#FF0000";
                     }
                    
else if (hex == "#0000FF")
                    {
                        hex =
"#00FF00";
                    }
                    
else if (hex == "#FF0000")
                    {
                        hex =
"#0000FF";
                    }
                    xaml =
"<Line X1=\"" + x + "\" Y1=\"" + y + "\" X2=\"" + x + "\" Y2=\"" + y + "\" Stroke=\"" + hex + "\" StrokeThickness=\"1\" Canvas.Left=\"289\" Canvas.Top=\"289\"></Line>";
                    
Debug.WriteLine(xaml, "xaml");
                    line = (
Line)XamlReader.Load(xaml);
                    parentCanvas.Children.Add(line);
                    xaml =
"<Line X1=\"" + prevx + "\" Y1=\"" + prevy + "\" X2=\"" + x + "\" Y2=\"" + y + "\" Stroke=\"" + hex + "\" StrokeThickness=\"1\" Canvas.Left=\"289\" Canvas.Top=\"289\"></Line>";
                    
Debug.WriteLine(xaml, "xaml");
                    line = (
Line)XamlReader.Load(xaml);
                    parentCanvas.Children.Add(line);
                }
            }
        }
    }

I have not read any blog entries about how developers are using ASP.NET in their work so I thought I'd write about my current projects. I think a professional blog should be used to keep your clients and colleagues informed about your work activities, project progress, and current research or studies.

Currently I am working a project that requires me to generate a PDF based on data supplied by an online form. Unfortunately there are over 200 form fields required so progress has been very slow. With that many form fields and associated database table columns, I have written a few scripts to generate ASP.NET code. I wrote scripts to define all the variables and variable assignments for hundreds of webcontrols. I used regular expressions for that and learned more about backreferences and submatches in VBScript.

I tried to use ceTe Software's DynamicPDF Designer and DynamicPDF ReportWriter for this project but it was very tedious to design the PDF entirely through code. The DynamicPDF Designer is an interesting tool, similar to Visual Studio with its own toolbox, properties window and design view but it was unable to import an existing PDF and that forced me to completely recreate a 5 page PDF.

Fortunately, I read an article about iTextSharp, a port of the iText, a free Java-Pdf library. I was able to import an existing PDF into Adobe LifeCycle Designer and get information on all the AcroFields. Now I am writing the ASP.NET code to populate the AcroFields with data from the SQL Server database and generate a PDF form that has been filled out with the required data.

I will probably use this on another project that also requires me to generate PDFs based on templates with data pulled from a database. Currently that project is also using Word RTF templates with fields defined by brackets. My ASP.NET code reads in the Rich Text File and replaces the brackets with data from the database. Unfortunately this requires me to figure out some RTF syntax to format text and the template file is very fragile. Making a minor edit to the template will often screw up my fields.

I am also working on many projects to customize the Storefront 6.0 ecommerce shopping cart from LaGarde. This shopping cart was developed in ASP.NET 1.1 and has never been upgraded for ASP.NET 2.0. That is the biggest reason for me being so unfamiliar with ASP.NET 2.0. Storefront 6.0 has had 8 service packs but now its development has been abandoned so there is a high demand for fixes, customizations, and maintenance by ecommerce sites that are deperate for support. Storefront 6.0 requires 5 projects in a solution and there are a huge number of classes. Fortunately I have found a way to make my work easier using the log4net logging service. Log4net allows me to "instrument the code" so I can figure out if a method is being called and if its variables have the expected value. This would all be a lot easier if I could use Visual Studio 2005 and ASP.NET 2.0.

This week I fixed a problem with the Freightquote component of Storefront 6.0. They made a slight change to the syntax of the XML request you make to their web service for obtaining shipping quotes. Apparently the developer of Storefront 6.0 is not going to bother to fix this. I will also be troubleshooting a problem with the changes USPS made to their web service.

Last night I spent some time learning about displacement maps. A displacement map is used to distort an image by displacing pixels based on the luminance of the map which is a grayscale image. Displacement maps are used to warp an image but they can also be used to project an image onto an uneven surface.

First I read a chapter of the book Creating Motion Graphics with After Effects, Vol. 2: Advanced Techniques by Trish Meyer and Chris Meyer because I was interested in using displacement maps in video. A displacement map in a video can be used to create an undulating image like in a dream sequence. You can also create an invisible man effect by having a figure in an underlying layer displace the topmost layer.

However, I did not have many displacement maps to experiment with so I then read a chapter of The Photoshop 7 Wow! Book by Jack Davis. This book has a tutorial on the other use of displacement maps, to project an image onto an uneven surface. It showed me how to project the American flag onto a cliff face without affecting the rock climber who was masked out. I was able to apply the same technique to a random image with good results. I was very pleased with this technique so I then spent some time documenting the complicated series of steps required to use displacement maps in Photoshop.

Displacement Map Example Image

 You may be wondering what this has to do with web development and ASP.NET. I think a web developer has some responsibility to know Photoshop. I've been working alone as a freelance developer so I don't have a graphics designer on my team to handle the creative work. Clients often expect me to do graphics design work because they just see it as more technical work that only requires a computer genuis. Creating a web site design from scratch is very time consuming so I just recommend buying a template from Template Monster. I'm very good at customizing a web site design by editing the CSS and working with the PSD file in Photoshop but I really need something that has already been designed.

Microsoft does not have many content creation tools which is mostly left to the arty Macintosh crowd. Their only video editing software is Movie Maker which is popular with some vloggers but not very sophisticated. The only graphics program features I can think of are some limited toolbars you find in Word and FrontPage. I've begun to use Microsoft Expression Web which is superior to FrontPage in supporting web design standards but only in terms of markup and CSS. Silverlight may be promoted as a signficant step towards creating rich media applications but it still seems too heavy on the developer side and does not address the need for tools to create the eye candy and the audio and video content. I've seen numerous examples of rich media applications which actually allow you to create media content online which demonstrates the growing need for user generated content creation tools in the social networking space.

Did you know you can assign sounds to a few Visual Studio events? You can assign a WAV file to play when a build fails or succeeds. Just open the Control Panel, select Sounds and Audio Devices and then click the Sounds tab. Scroll down to Microsoft Development Environment. I assigned my Build Succeeded to a WAV file of Darth Vader saying "All Too Easy" and my Build Failed to a WAV file of Han Solo saying "I got a bad feeling about this."

Sound Events

I have been keeping an extensive set of technology notes since 1999 which I used to keep organized in a compiled help file. Being a web developer, I liked to write my notes as web pages rather than use a word processor. I could even include sample code and functional examples in my notes if the topic was JavaScript or anything that runs client-side in the browser. I liked a compiled help file because it provides a navigation structure, searchable indexing, and reduced everything to one file which I could easily copy to other computers and thumb drives.

However, I eventually got fed up with the Microsoft Help Workshop which is the buggiest software Microsoft has ever produced. As my help project grew to include hundreds of files, it would frequently crash whenever I moved a topic in my table of contents. Since I update my notes every day this became very frustrating.

Finally I learned how to convert my HTML Help 1.x compiled help file into a new MS Help 2.x help collection which requires the Microsoft Document Explorer to view. Now all of my personal notes are available alongside the MSDN documentation.

To integrate your personal help files into The Visual Studio .NET Combined Help Collection you first need to download the  Visual Studio .NET Help Integration Kit 2003 at: http://www.microsoft.com/downloads/details.aspx?FamilyID=ce1b26dc-d6af-42a1-a9a4-88c4eb456d87&DisplayLang=en You will also need far42_inst660.exe from http://helpware.net/ The process is actually quite long and rather involved but the FAR Collection Wizard found in Far-V4.2.0 is the key to doing this.

My help collection now has 912 topics and I maintain it in Visual Studio 2003 rather than use the awful Microsoft Help Workshop. Unfortunately, Visual Studio 2003 frequently chokes on this huge project so I've learned to directly edit the HxF include file, the HWProj project file, and the HxT table of contents file. Today I learned how to use the hxcomp.exe command line compiler to build my help project without opening it in Visual Studio 2003. This will save me a lot of time!

Below you can see my help collection of personal notes integrated into the Visual Studio 2003 help collection. This is the only time you will ever see RPG II help topics appearing in a Visual Studio environment!

Visual Studio 2003 Help Collection

My help collection also integrates into the Microsoft Document Explorer. Here you can see that I have a lot of personal topic files covering ASP.NET 2.0 which I am still studying. 

Visual Studio 2005 Help Collection

 

More Posts