I have an application having 2 Forms, each Form and Application have individual Icon. O
What is happening here is, in my view, due to a design flaw in the VCL framework. The underlying windows framework maintains not one, but two icons for each top-level window. These icons are associated with a window either via the window class (see WNDCLASSEX) or through WM_SETICON messages.
The VCL framework always calls WM_SETICON passing ICON_BIG and so only the large icon is assigned. For Windows 7 the large icon is used on the taskbar and the small icon is used on the window's caption bar. On earlier versions of Windows, which had smaller taskbars, the small icon was used on the taskbar. For 100% font scaling the large icon is 32px and the small icon is 16px. For large fonts, the required icon sizes change.
Now, if an application only supplies one of the required icons, the system will scale the icon provided when it needs to draw the icon size which has not been supplied. If you supply a large icon only then, generally, the resulting scaled small icon looks fine. If you supply a small icon only then it's much harder to scale and what typically happens is that the small icon (shown on the caption bar) looks fine, but the large icon is pixellated.
In fact what is happening to you is neither of these problems. The VCL code means that you are always specifying, to Windows, the large icon. However, you are clearly supplying a small icon, almost certainly 16px. This has the same result as calling WM_SETICON with ICON_SMALL and the 32px icon is pixellated.
The simplest solution for you is to use the 32px icon in for Form.Icon or Application.Icon, wherever it is that you set the icon. This will work fine for much of the time.
However, if your application ever runs with font scaling active then you will encounter pixellation again. With font scaling, both icon sizes can be increased. In order to handle this properly you must provide to the underlying Windows framework an icon of the correct size. If you don't then there will be pixellation. You can find out the icon sizes by calling GetSystemMetrics.
SmallIconSize := GetSystemMetrics(SM_CXSMICON);
LargeIconSize := GetSystemMetrics(SM_CXICON);
Now it is often sufficient just to supply a large icon and rely on the built in scaling to produce the small icon. If you really care about visuals you should of course use an icon specifically prepared for such small sizes. A 32px icon down-scaled to 16px will not be as effective visually as a 16px icon produced by a skilled visual designer. To make the VCL use the small icon you provide requires extra work. Specifically you need to send the WM_SETICON for ICON_SMALL. In my code base I do this and in fact avoid using TForm.Icon at all and call WM_SETICON for both icon sizes. In order to get the fine-grained control needed to do this right the VCL mechanisms just interfere.