Compact Framework build and deployment time.

As anybody who has developed mobile applications with the compact framework (with VS2008 anyway) will know, the build and deployment time on even the smallest projects can be painfully long regardless of whether deploying to the device or the emulator.

Finding this has been a complete life saver (I was almost at the point of self harm waiting for builds!), and has slashed my build times by nearly a minute.

Make sure you take the time to read the full article so you know exactly what the implications are of disabling the ‘PlatformVerificationTask’ validation.

Advertisements

Compact Framework – Increasing ScrollBar Width

The Datagrid in the Compact Framework has fixed 13 pixel wide/tall scrollbars but no way to resize them. Creating a control that inherits from Datagrid, overriding the size of the scrollbars would be one way to go, but it can be achieved without the need to do this by using reflection.


FieldInfo fieldInfo = dgBinDetail.GetType().GetField("m_sbVert", BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance);

((VScrollBar)fieldInfo.GetValue(dgBinDetail)).Width = 30; 

Remember to add the System.Reflection namespace to your list of using statements at the top of your class.

Pocket PC – Actually closing a form

You would be forgiven for thinking that clicking on the ‘X’ in the top right of your form would close it, as per all standard Windows applications…but be warned this is NOT the case with Pocket PC applications! I’m not sure what the wisdom is behind this decision, I guess it doesn’t really matter, I just wish it were more obvious!

Anyway, clicking the cross does nothing more than minimise your form, in order to fully close it, you must set it’s ‘MinimizeBox’ property to false. This will in turn display an ‘ok’ button instead of a ‘X’ at the top of your form, and it is clicking this ‘ok’ button that fires the form closing events!…obvious when you think about it!…hmmmmm.

So there’s an hour of my life I’ll never get back! Thanks Microsoft.

Barcode Scanning

This week marked my first foray into the world of the .NET Compact Framework. We’re using Motorola MC9090 scanners running Windows Mobile 5.0 and our application needs to read scanned barcodes directly into an existing SQL Server database.

First job was to download the Motorola EMDK kit containing the relevant .dll’s for the scanners, it even comes with a sample project demo’ing how to use them. The two main classes of note are symbol.barcode.reader and symbol.barcode.readerdata, which are pretty self explanatory and deal with the scanned data from the scanner. You need to setup a Reader object to read from the scanner and a ReaderData object to handle the read data (see told you they were self explanatory) and probably an event handler to do something with it once you have scanned.

The code snippet below demonstrates how to capture scanned data and display in a Windows MessageBox. (I’m using a Windows Smart Device Application for Windows Mobile 5.0 and .NET compact Framework 3.5)..

public partial class Form1 : Form
{
    //setup Reader & ReaderData objects
    Symbol.Barcode.Reader barcodeReader = null;
    Symbol.Barcode.ReaderData barcodeReaderData = null;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        barcodeReader = new Symbol.Barcode.Reader();
        //sets up ReaderData to receive text and allocates max buffer size for barcode (7905 bytes).
        barcodeReaderData = new Symbol.Barcode.ReaderData(Symbol.Barcode.ReaderDataTypes.Text, Symbol.Barcode.ReaderDataLengths.MaximumLabel);

        barcodeReader.Actions.Enable();  //enable scanner hardware.
        barcodeReader.ReadNotify += new EventHandler(barcodeReader_Read);  //eventHandler for when read is complete.
        barcodeReader.Actions.Read(barcodeReaderData);  //read scan.          
    }

    private void barcodeReader_Read(object sender, EventArgs e)
    {
        Symbol.Barcode.ReaderData nextReaderData = barcodeReader.GetNextReaderData();  //Get(s)NextReaderData
        MessageBox.Show(nextReaderData.Text);  //Display output in messagebox.
        barcodeReader.Actions.Read(barcodeReaderData);  //await next scan.
    }

    private void Form1_Closing(object sender, CancelEventArgs e)
    {
        //Dispose of everything
        barcodeReader.Actions.Flush();
        barcodeReader.Actions.Disable();
        barcodeReader.Dispose();
        barcodeReaderData.Dispose();
    }
}