Wednesday, May 23, 2007

Difference Between VB.NET and C# (A comparision)

Below is a very good article describing the almost complete list of difference that VB.NET has with C#.

It basically compares one to one keywords and functions for both the languages.

It could be extremely useful for people who find it difficult to transit from VB.NET to C#


http://www.codeproject.com/dotnet/vbnet_c__difference.asp


--Ashutosh

Tuesday, May 8, 2007

Providing Custom Intellisense in VS.NET IDE (Thanks to Mikhail Arkhipov)

In the previous post I tried to validate my HTML in the VS.NET designer for HTML usingmy own custom validations.

While this proved quite helpful, I felt a deep need of intellisense in VS.NET for my objects and hense decided to implement the same.

After a bit of googling and researching, I could find a possible way of implementing the same.

Here's how it goes.

As we all know, VS 2005 implements Intellisense using the XSD files. So the idea was to provide VS IDE with my own XSD so that it could use that XSD instead of the default one.

The process involved the following steps:

1. Create your custom XSD:
2. Make this XSD available to VS.NET IDE
3. Using the custom XSD






1. Create your custom XSD:
Since I was creating intellisense for HTML, I always required the default HTML intellisense and a few of my own. So I decided to use the XSD that VS IDE uses to provide intellisense in HTML view. Those XSDs could be found located at

"%vsInstallDir%\Common7\Packages\schemas\html"




Here, since my IDE was using IE6_0.XSD, I decided to make a copy of it and make my own XSD out of it, so that I could get all the custom HTML intellisense. So I copied IE6_0.XSD and created "MyCustom.XSD"




Now to that XSD I made some changes that I required. For example, when you have a TD tag in the HTML, you do not have an attribute called TYPE. I required an attribute TYPE which could have two possible values: DATA / AGGREGATE.




So basically I required my TDs to be somewhat like :


<TD type="Data"/> OR <TD type="Aggregate"/>




So to attain this, following changes were made to the MyCustom.xsd





  • At the location where element TD is defined, add a new Attribute Group called
    "cellTypeAttributeForHiText" (You can have any name you like).



















  • Next we need to create this Attribute group called "cellTypeAttributeForHiText". For this we can define a new Attribute group as in the picture.
















  • While creating this Attribute group, we would be creating a simple type that would provide us the dropdown list in the intellisense when we write "Type=" in the IDE.























Apart from these, there are a couple more changes that are required so that the IDE distinguishes between the two schemas.

<xsd:schema version="1.0" targetNamespace='http://schemas.microsoft.com/intellisense/MyCustomSchema'
xmlns='http://schemas.microsoft.com/intellisense/MyCustomSchema'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
xmlns:vs='http://schemas.microsoft.com/Visual-Studio-Intellisense'
vs:clientom="ie6_0dom.tlb"
vs:ishtmlschema="true"
vs:isserverschema="false"
vs:htmlflavor="4.0"
vs:MultipleScriptLanguages="true"
vs:cssschema="CSS 2.1"
vs:SuccinctFriendlyName="My Custom Schema">


SO now we are all done with the changes. We have a well made XSD to use with our IDE.

2. Make this XSD available to VS.NET IDE

In order to make this XSD available to VS IDE, we need to perform two steps.

  • Firstly copy the XSD file to the location where the default XSDs for IDE are located.
  • Secondly make a registry entry to register this schema with the IDE. For this, create a .reg file with the following text:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Packages\{1B437D20-F8FE-11D2-A6AE-00104BCC7269}\Schemas\Schema 21]

"Friendly Name"="My Custom Schema"

"URI"="http://schemas.microsoft.com/intellisense/MyCustomSchema"

"File"="html\\MyCustom.xsd"

Running this script would add the information to the Registry and would register the schema to the VS.NET IDE.

One thing to note here is that I have hardcoded the name SCHEMA21. This was because on my machine, I had 20 Schemas already loaded. By default, VS.NET creats 20 schemas and hense we need to maintain the order to get the schema working. Hense the number.

3. Using the custom XSD

Once we close the IDE and reopen it, now this Schema would always be available to the IDE. For using this, goto the IDE, open the HTML designer and you would see a dropdown on the toolbar of the IDE for selecting TARGET SCHEMA FOR VALIDATION

In the dropdown we will find our custom schema listed and by selecting that schema, we could now have intellisense from our own XSD file

I would thank Mikhail Arkhipov for the help he provided

Thursday, May 3, 2007

Providing Custom Validations in VS.NET IDE

Hi all,

Just recently, working on Reporting system, I was required to create PDF reports out of HTML pages. I did those successfully using iTextSharp, a free online library for rendering PDFs from HTML.

In the process, I had to customize the particular HTMLs to contain several constraints and hense I had to validate them at the design level.

I found a great designer that did the trick. The well known Visual Studio.NET Designer. I decided to use that for my purpose as it did nost ofthe validations all by itself and I just had to add a few more of my custom ones.

Say for example, in my report, I was always required to have three DIVs in my tag in HTML, namely "HEADER", "FOOTER" and "DETAIL"

Now by default there is not such binding for user in case he is making it a regular HTML. But if it a Report then I had to put these validation checks.

For this I had to tweak the Designer to throw messages to the user if required.

The best way out seemed to be MACROS at that is what did the trick.

While creating any macro or a module in a macro project, we always have one Module in it "EnvironmentEvents". This module contains all events pertaining to all the events that occur in the Visual Studio IDE.

In the EnvironmentEvents module, choose the event
"DocumentEvents_DocumentSaved"


This event will be called every time a document is saved in Visual Studio IDE.

Here in you could have all your validations and all those will be thrown back to IDE using your own system of exception throwing, which could possibly be via MessageBox or some message in Output Window etc.

Now in order to get the items into Output window or task list, we can use the following piece of code.

Dim projItem As EnvDTE.Solution
Dim tw As TaskList = CType(win.Object, TaskList)
win = projItem.DTE.Windows.Item(Constants.vsWindowKindTaskList)

tw = CType(win.Object, TaskList)tw.TaskItems.Add("ErrorCategory", Document.Name, "Error Message", vsTaskPriority.vsTaskPriorityHigh, , True, Document.Name, -1, True, True)


-- Ashutosh




Wednesday, April 18, 2007

Properties in .NET

Last few days have been extremely hectic for me. We have been working with pace to set the tone up for the new HiText reporting tool that we @ EITS are planning to use to generate our reports.

Finally we got it to work. And in the mean time, I learnt quite a new concepts in the process itself. Be it Reflection, Be it Properties, Dynamically loading and calling assemblies, creating templates to use with Visual Studio IDE, tweeking IDE to implement my own Intellisense and many more..

Due to the lack of time, I could not update the place as frequently as before. So once I got some time out of work, I concentrated back on putting something up here.

So here is the first one from me:



The PROPERTIES in .NET are said to be faster than normal user defined functions.

But strange enough (to me atleast), the properties that are defined at the class level, at the grassroot level are implemented as functions itself.

Just to confirm the same.....you could create a simple class with a few properties defined. Compile it and then try checking the output in the ILDASM.

I came across this fact when I was playing around with Reflection and Invoking methods and getting properties to return values by just specifying the names of the properties as string.

Ususally any property in C# is written with two methods (get & set) and this property is in turn implements as two seperate functions. For example if we create a property called Prop1 with methods get and set defined, the they are at root level implemented as the following two functions:
1. GET - get_Prop1()
2. SET - set_Prop1()

I accidentally came across the fact when the compiler told me that I can not create function named get_Prop1 or set_Prop1..........as they already exist ?????????????

After a bit of exploration, here is the result .NET properties are implemented as functions itself. If so then how come using Properties be better than using Functions.

Well the .NET compiler are built up and are implemented in such a way so as to give preceeedence to these get and set functions over all other functions and hense they are faster. No special concerns about the same.


Hope this helps someone in there works.....

-- Ashutosh Vyas

Thursday, March 8, 2007

PDF Utility is ready.

Hi All,

Just out of curiosity and a zeal to learn, I started out on making a small utility that would split a given PDF file into pages.

I did that successfully using iTextSharp, a free Open Source library for PDF generation.

Next step was to enhance this utility to read and merge different PDFs into one single unit based on any criteria given by the user.

After quite long I could finish that work and now the utility is ready with the following features:

1. Split PDF into single page PDF files.
2. Split based on criteria given by user.
3. Select multiple files to MERGE into one.
4. Merge files based on criteria by user.


Further to this, I had a look at another utility called PDFBox and I could read the elementary text out of the PDF as well.

So now we have a utility that has the power to Split / Merge or even read a PDF file into a text file/ text stream.

If anyone needs that please get in touch with me.


-- Ashutosh

Friday, February 23, 2007

PDF Merging and Splitting

Working with my collegues on iText and seeing an application that wrote multiple PDF pages and created one document out of it, an idea clicked to me for writing an application that would merge multiple PDFs into one or even Splitt the single PDF into multiple files at will.

Currently I am done with the merging part and now the app merges the selected PDF files to generate single PDF with all the pDFs merged.

I am onto the second part: Splitting. I foresee myself completing the basic part in a day or two, i.e. it will take a single PDF and splitt it into multiple files with one page each (for ex- a PDF file with 10 pages will result in 10 PDF files with single page each.)

Now I am looking to make it more generic like you provide the resulting file name, location and each page in each file and the files are created on that basis.

Really Looking forward to it.


So wait and watch..................

--Ashutosh

Wednesday, February 14, 2007

Year 2038 problem

The Year 2038 problem The Year 2000 problem is understood by most people these days because of the large amount of media attention it received. Most programs written in the C programming language are relatively immune to the Y2K problem, but suffer instead from the Year 2038 problem.
This problem arises because most C programs use a library of routines called the standard time library (time.h). This library establishes a standard 4-byte format for the storage of time values, and also provides a number of functions for converting, displaying and calculating time values.
The standard 4-byte format assumes that the beginning of time is January 1, 1970, at 12:00:00 a.m. This value is 0. Any time/date value is expressed as the number of seconds following that zero value. So the value 919642718 is 919,642,718 seconds past 12:00:00 a.m. on January 1, 1970, which is Sunday, February 21, 1999, at 16:18:38 Pacific time (U.S.). This is a convenient format because if you subtract any two values, what you get is a number of seconds that is the time difference between them. Then you can use other functions in the library to determine how many minutes/hours/days/months/years have passed between the two times. If you have read the Tech Touch on Bits and Bytes, you know that a signed 4-byte integer has a maximum value of 2,147,483,647, and this is where the Year 2038 problem comes from. The maximum value of time before it rolls over to a negative (and invalid) value is 2,147,483,647, which translates into January 19, 2038. On this date, any C programs that use the standard time library will start to have problems with date calculations. This problem is somewhat easier to fix than the Y2K problem on mainframes, fortunately. Well-written programs can simply be recompiled with a new version of the library that uses, for example, 8-byte values for the storage format. This is possible because the library encapsulates the whole time activity with its own time types and functions (unlike most mainframe programs, which did not standardize their date formats or calculations).
So the Year 2038 problem should not be nearly as hard to fix as the Y2K problem was. An alert reader was kind enough to point out that IBM PC hardware suffers from the Year 2116 problem. For a PC , the beginning of time starts at January 1, 1980, and increments by seconds in an unsigned 32-bit integer in a manner similar to UNIX time. By 2116, the integer overflows. Windows NT uses a 64-bit integer to track time. However, it uses 100 nanoseconds as its increment and the beginning of time is January 1, 1601, so NT suffers from the Year 2184 problem.


-- Ashutosh

Friday, February 9, 2007

Strange Maxlength behaviour

Hi,

Okay another interesting issue. Anyone ever wondered about the MaxLength property of a textbox in .NET.

Yeah by default, the MaxLength is 0 and 0 obviously in this case means INFINITE stating you can put any number of characters in the textbox.

Theoritically its perfect but practically speaking, it never takes characters more than 32K

WHY....??

Okay to the extent I got to know about it, here is the reason.

TEXTBOX ---------object
TEXTBOX.TEXT ----------string
STRING.LENGTH -------- integer / int32

SO basically its the limitation of String Class and its length property (which is of Int32 type)
that limits the length of a textbox to type (Int32) and hence the reason for limitation of textbox maxlength.


--Ashutosh

Monday, February 5, 2007

Creating a new form at runtime....

Hi all,

Yesterday while supporting user @ Experts-Exchange, I came across a question asking if I could create an instance of a new FORM at runtime and show it on the screen.

Well thinking at the first instance, looks quite straight forward. Theoritically its like creating a new instance of an object and using its methods and properties.

But practically its not as easy as with any other object. Theoritically the below code shows what exactly he wanted and its exactly what we can do in general coding with any other objects.

String strFormName = "Form1";
Form frmNew = (Form)(strFormName); //A new form with the name "Form1"
frmNew.Show();

So exploring through for the same at first hit it looked impossible and thats what I thought.
But then I was guided to an article on MSDN that explained using Activator.CreateInstance For all such tasks and it looked quite obvious.

Here's the code for it.

String strFormName = "Form1";
System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();
Form frmNew = (Form)asm.CreateInstance(asm.Getname.name + "." + strFormname, true);
frmNew.Show();

Hope someday this would be of use to me as well ;-)

--Ashutosh


Monday, January 29, 2007

Hi all,

Here is a small doc for all who always wanted to know the Keyboard shortcuts for the general tasks in VS.NET IDE like commenting a code block, switching between the different views etc.

Download the doc from THIS link.


--Ashutosh