Delphi comes with several tools to aid in your application development. Today you learn about some of Delphi's tools. Specifically, you learn about the following:
First, you take a general look at these tools. Then you learn how to add your own tools to the Delphi Tools menu. The day ends with a look at the Delphi Environment Options dialog box.
NOTE: In addition to the tools listed here, Delphi also comes with a host of database tools such as Database Desktop, BDE Administrator, SQL Builder, and SQL Explorer. A discussion of those tools would be too lengthy for today's purposes.
The Delphi Image Editor is a tool that enables you to create and edit bitmaps (.bmp), icons (.ico), and cursors (.cur). You can also create a resource project containing multiple bitmaps, icons, and cursors in a single resource file (.res). The resource file can then be added to your Delphi project, and you can use the resources as needed. Figure 11.1 shows the Image Editor editing a bitmap.
FIGURE 11.1. The Image Editor.
NOTE: All Windows images are bitmaps, whether they are actual Windows bitmap files (.bmp) or icons or cursors. In this chapter, I refer to all images collectively as bitmaps.
Image Editor deals only with Windows bitmap files. Other file formats such as PCX, TIFF, JPEG, and GIF are not supported.
You can start the Image Editor by either double-clicking on the Image Editor icon in the Delphi folder or choosing Tools|Image Editor from the Delphi main menu. The Image Editor is a stand-alone program and doesn't have to be run from the Delphi IDE.
The Image Editor enables you to create 2-color, 16-color, and, in the case of bitmap files, 256-color images. You can choose any available colors when drawing on a bitmap. In the bottom-left corner of the Image Editor are two boxes containing the current foreground and background colors. (The foreground color is represented by the far left box.)
When using a drawing tool, you can draw with either the foreground color or the background color. To draw with the foreground color, use the left mouse button. For example, if you choose the filled rectangle tool and draw a rectangle on the bitmap, the rectangle will be filled with the foreground color. To draw a filled rectangle with the background color, use the right mouse button to drag the rectangle. The same is true for most of the other drawing tools.
NOTE: The Text tool uses only the foreground color. You cannot place text with the background color. If you want to use the background color, you have to change the foreground color and then place your text.
To change the foreground color, click a color on the color palette with the left mouse button. (The color palette is located along the bottom of the Image Editor window.) When you choose a new foreground color, the square that represents the foreground color changes to show the new color selected. To change the background color, click a color in the color palette with your right mouse button.
NOTE: If you are editing a 256-color image, the color palette will have scroll buttons on either side so that you can scroll through the available colors.
The colors that appear in the color palette are determined by the bitmap when you are loading a bitmap that already exists. If you are starting a new 256-color image, the default 256-color palette is used.
You can also set the foreground or background colors with the Eyedropper tool. The Eyedropper enables you to set the foreground or background color by picking up a color that is already used on the image.
To set the foreground color with the Eyedropper, choose the Eyedropper tool from the Tools palette, place the tip of the Eyedropper over a portion of the image that has the color you want to use, and then click the left mouse button. The foreground color changes to the color under the Eyedropper. To set the background color, click with your right mouse button instead of the left mouse button. The Eyedropper tool is invaluable when you want to exactly match a color that was previously used on your bitmap.
NOTE: The foreground and background colors might work differently in the Image Editor than in other bitmap editors you have used. For example, in some bitmap editors, the outline of a filled rectangle is drawn with the foreground color and filled with the background color. With the Image Editor, filled objects have no discernible border. A filled rectangle is in either the foreground or the background color.
In the case of icons and cursors, you can also choose the transparent color (the word color being relative here). When you use the transparent color, the background beneath the icon shows through wherever the transparent color is used. That could mean the Windows background in the case of a shortcut, or it could mean the title bar of your application.
Whether you use the transparent color depends on your personal tastes and the particular icon you are creating. In the case of cursors, you will almost always use the transparent color as the background for the icon. Rarely do you have a cursor that appears as a solid block.
Choosing the inverted color causes the background underneath the icon to be inverted (like reverse video). Use of the inverted color isn't common, but it is there if and when you need it.
Both the transparent and inverted colors are shown next to the color palette when editing icons and cursors. They are represented by color squares with a curved line running through them.
NOTE: By default, new icon and new cursor resources have the background filled with the transparent color.
The Image Edi tor drawing tools are similar to most paint programs. Because these are common drawing tools, I'm not going to go over each and every one. Fifteen minutes of experimentation with the Image Editor will be more beneficial than anything I can tell you. Fire up the Image Editor and experiment with it for a while. I'll wait.
At the top of the Image Editor Tools palette, you find the Marquee and Lasso tools. These work in essentially the same way, so I'll cover them together. Both tools enable you to select a region on the current image. The Marquee tool is used to define a rectangular region. Choose the Marquee tool and then drag a bounding rectangle on the image. When you stop dragging, a marquee is drawn around the region to mark it. The Lasso tool works in much the same way but enables you to define a freehand region. A Lasso region is filled with a hatch pattern to identify it.
TIP: When using the Lasso tool, you don't have to close the region. When you release the mouse button, the Image Editor automatically closes the region by drawing a connection line between the start point and the end point.
When a region is defined, you can cut or copy the image within the region and paste it somewhere else on the image or to another image you are working on (you can have multiple bitmaps open at one time). When you choose Edit|Paste from the main menu, the image within the marquee is placed in the upper-left corner of the bitmap with a marquee around it. The pasted image can now be dragged into position.
When you place your mouse cursor within the marquee, the cursor changes to a hand. When you see the hand cursor, you can drag the bitmap within the marquee to another location and drop it. You can continue to move the bitmap until you have it positioned exactly where you want it. After you have the bitmap where you want it, click again on the image outside the marquee and the bitmap within the marquee merge into the existing image.
TIP: The Image Editor has a shortcut method of cut and paste. Create a Marquee or Lasso region, place your mouse cursor inside the region, and drag. The image within the region moves as you drag.
When you cut a region or move it by dragging, the current background color will fill the area that the image originally occupied. The background shows through the hole created by the cut operation.
TIP: You can copy portions of one bitmap to another using cut and paste. First, open both images in the Image Editor. Place a marquee around the portion of the original image you want to copy and then choose Edit|Copy from the main menu. Switch to the other image and choose Edit|Paste from the main menu. Move the pasted image as needed.
NOTE: If you have a marquee selected when you paste, the pasted image will shrink or stretch to fit the size of the marquee.
The Eraser tool works just the opposite of the other tools in regard to the left and right mouse buttons. With the Eraser, the left mouse button draws with the background color and the right mouse button draws with the foreground color.
The Text tool enables you to place text on the image. The text is drawn using the current text settings. The text settings can be changed by clicking the Text item on the main menu. Here you can set the text alignment (left, right, or centered) or the font (typeface). To change the typeface, choose Text|Font from the main menu. Now you can choose a new typeface or make the font bold, italic, underlined, and so on.
The other drawing tools are self-explanatory. As I said earlier, a little time behind the wheel of the Image Editor will teach you just about everything you need to know about those tools.
TIP: When drawing rectangles, you can press and hold the Shift key to force a rectangle to a square . Likewise, you can draw a perfect circle by choosing the Ellipse or Filled Ellipse tool and holding the Shift key as you drag. Using the Shift key with the Line tool enables you to draw straight lines (vertical, horizontal, or 45-degree angles).
The Image Editor enables you to zoom in so that you can work on your bitmaps up close and personal. You can zoom either by using the Zoom tool or via the View menu. To zoom in on a particular part of your image using the Zoom tool, first select the Zoom tool from the Tools palette and then drag a bounding rectangle around the portion of the image you want to magnify. The magnification will change depending on the size of the rectangle you created when you dragged. You can now see well enough to change fine details in your bitmap.
To zoom using the menu, choose View|Zoom In or press Ctrl+I. When you choose Zoom In from the menu, the image is magnified by a predetermined amount. To zoom out again using the menu, choose View|Zoom Out (Ctrl+U) or View|Actual Size (Ctrl+Q).
When you are creating a cursor or an icon, the Image Editor shows a split view. Figure 11.2 shows an Image Editor window while creating an icon.
FIGURE 11.2. Editing an icon.
Although you can zoom either side of the split window, you will usually work with a zoomed-in copy on the left side and an actual-size image on the right, as shown in Figure 11.2.
The Line Width palette is displayed directly below the Tools palette. Depending on the currently selected tool, the Line Width palette might show line widths or brush shapes that you can choose. To pick a line width, click one of the five widths displayed. Subsequent drawing operations will use the new line width until you change it. Similarly, to change a brush shape, just click the brush shape you want to use. If you refer to Fi gure 11.1, you will see the Line Width palette showing brush shapes.
You can create a bitmap from scratch or load an existing bitmap and modify it. To open an existing bitmap file, choose File|Open from the main menu (bitmap files have a BMP extension). To create a new bitmap file, choose File|New from the main menu and then choose Bitmap File from the pop-up menu. The Bitmap Properties dialog box is displayed, as shown in Figure 11.3.
FIGURE 11.3. The Bitmap Properties dialog box.
Here you can set the initial size of the bitmap (in pixels) as well as the color depth. You can create a 2-color, 16-color, or 256-color bitmap.
NOTE: The Image Editor does not support bitmaps of more than 256 colors.
Select the size and color depth you want and click OK. A blank bitmap is displayed in an editor window. Do any drawing you want on the bitmap. When you are finished editing, choose File|Save or File|Save As to save the bitmap file to disk.
Any time you are working with a bitmap file, the Image Editor main menu has a menu item called Bitmap. This menu has a single item under it called Image Properties. Choosing Bitmap|Image Properties displays the Bitmap Properties dialog box just as when you create a new bitmap file. The Bitmap Properties dialog box enables you to change the size and color depth of the bitmap. Select a new width, height, or color depth and click OK.
NOTE: There is one difference in the Bitmap Properties dialog box when it is displayed for an existing bitmap as opposed to when you're creating a new bitmap. When displayed for an existing bitmap, the Bitmap Properties dialog box has a check box labeled Stretch. This is used by the Image Editor when changing the bitmap size. If the Stretch option is off, the bitmap will not be stretch ed (either larger or smaller) when the bitmap size is changed. If the Stretch option is on, the bitmap will be stretched to fill the new bitmap size. Stretching a bitmap is an inexact science, so sometimes the results of stretching are less than perfect.
All in all, there isn't much to working with bitmap files. Although the Image Editor is fine for simple bitmaps, you will probably not find it adequate for sophisticated graphics. If you need high-quality bitmaps, you might consider purchasing a full-featured image-editing package or hiring a computer artist to create your bitmaps.
TIP: Don't forget to check online sources for computer-graphic artists. These people know their craft far better than all but the most gifted programmers and are often very reasonable in their pricing. Repeat this 10 times: "I am a programmer, not an artist." (Okay, maybe some of you are doubly blessed.)
Creating icons is also an art form, but icons are not quite as demanding as full-color bitmaps. Most of the time you can create your own icons, but great-looking icons still require skill. If you flip back to Figure 11.2, you will see an icon as it is displayed in the Image Editor while editing.
TIP: Load icon files from any source you can find and zoom in on them to get tips on how the best-looking icons are created. Creating 3D icons takes practice (and is something I never get quite right).
An icon in 32-bit Windows is actually two icons in one. The large icon is 32¥32 pixels. The large icon can be placed on a dialog box such as an About box. It is also the icon that Windows uses when creating a shortcut to your application. In addition, the large icon is used by Windows Explorer when the file list view is set to display large icons.
The small icon is 16¥16 pixels and is the icon u sed by Windows on the title bar of your application, on the Windows taskbar, in the File Open dialog box, and in Windows Explorer when the view is set to small icons. Both the large and the small icons are stored in the same icon file (.ico).
NOTE: You don't have to supply both a large icon and a small icon. If you supply only the large icon, Windows will shrink the large icon when it needs to display a small icon. Sometimes, however, the results are not quite what you expect and might not be good enough quality for your tastes. In those cases, you can also create the small icon so that you are in control of how your application looks, rather than rely on Windows to do the right thing.
Creating a New Icon Resource
To create a new icon resource, choose File|New from the main menu and then choose Icon from the pop-up menu. When you create a new icon in the Image Editor, you see the Icon Properties dialog box, as shown in Figure 11.4.
FIGURE 11.4. The Icon Properties dialog box.
This dialog box enables you to choose the icon you are creating (either the large or the small icon) and the number of colors to use for the icon. The default is to create the standard icon (the large icon) and to use 16 colors. (In reality, 2-color icons are rarely used. When was the last time you saw one?)
NOTE: Even if you are creating both the large icon and the small icon, you must choose one or the other to start with. For example, if you are creating a new icon, you should start with the large icon. After creating the large icon, you can then create the small icon.
When you are editing an icon, the Image Editor menu bar has an item called Icon. The Icon menu has items called New, Delete, and Test. The New menu item enables you to create a new large or small icon. For example, if you had alrea dy created the large icon, you could choose Icon|New from the main menu to create the small icon.
TIP: The Icon Editor window has a button called New that also creates a new icon and is faster than using the main menu (refer to Figure 11.2).
When you choose New to create a second icon, the Icon Properties dialog box is displayed just as before. If you have already created the large icon, the small icon will be selected by default and all you have to do is click OK. The editor window will change to display the new, blank icon. The Image Editor will not let you create an icon that already exists in the icon file.
TIP: When both icons are present, you can switch between them using the combo box at the top of the Icon Editor window.
The Delete item on the Icon menu enables you to delete either the large or the small icon from the icon resource. You cannot delete the last icon in the icon resource.
The Test item on the Icon menu displays the Icon Tester dialog box, which shows you what the icon will look like when displayed. Figure 11.5 shows the Icon Tester dialog box in action.
FIGURE 11.5. The Icon Tester dialog box.
The Icon Tester enables you to change the background color so that you can view the effect that different backgrounds have on the appearance of your icon. If you are currently editing the large icon, the large icon appears in the Icon Tester. If you are currently editing the small icon, the Icon Tester dialog box displays the small icon.
Working with cursors is not much different than working with icons. A cursor has only two colors: white and black. (Multicolor and animated cursors are not supported by the Image Editor.) Draw the cursor as you want it to appear.
As when editing bitmap files and icons, the Image Editor menu displays a menu item called Cursor when you are editing a cursor. This menu item has two items: Set Hot Spot and Test.
The Set Hot Spot item enables you to specify the cursor's hot spot. The hot spot is the specific pixel of the cursor that Windows uses to report the mouse coordinates when your cursor is being used. For example, the hot spot on a crosshair cursor is the exact center of the crosshairs. For a pointer cursor, the hotspot is set to the tip of the arrow's point. To set the hot spot, choose Cursor|Set Hot Spot from the main menu. The Set Cursor Hot Spot dialog box appears, where you can enter the x and y coordinates of the hot spot.
TIP: You must enter the exact x and y coordinates for the hot spot. To make this easier, before setting the hot spot, place the editing cursor over the point on the cursor where you want the hot spot. The Image Editor status bar will display the x and y coordinates of the point under the cursor. Make note of the x and y coordinates, and then choose Cursor|Set Hot Spot from the main menu and enter those x and y coordinates.
The Test item on the Cursor menu gives you the opportunity to try out your new cursor. Choose Cursor|Test from the main menu and the Cursor Tester dialog box will be displayed, as shown in Figure 11.6.
FIGURE 11.6. Testing the cursor.
Hold down either mouse button to draw on the Cursor Tester window. If you haven't yet set the hot spot, you will probably notice that the hot spot is set to the upper-left corner of the cursor by default. You should always set the hot spot to a point on your cursor that will be logical to users of your application.
The Image Editor has context menus for each editing mode (Bitmap, Cursor, and Icon). You might recall that the right mouse button is used for drawing, so you can't bring up the context menus by clicking the mouse button while over the image. To display the Image Editor context menus, right-click when the cursor is within the editor window but outside the image. The context menus contain the same items found on the individual menus, as discussed in the previous sections.
Creating Resource Projects
The Image Editor also enables you to create a resource project file for storing all your bitmaps, icons, and cursors. To create a resource project, choose File|New from the main menu and then choose Resource File from the pop-up menu. A project window is displayed. The project window is a tree view control that shows the bitmaps, icons, and cursors in the project. Figure 11.7 shows the project window for a sample project.
FIGURE 11.7. The Image Editor project window.
The project window has a context menu that can be used to create new resources, edit resources, rename resources, and delete resources. The items on the context menu are also duplicated on the main menu under the Resource menu item.
When you save the resource project, the Image Editor will compile it into a binary resource file (.res). You can then add the binary resource file to your Delphi project.
To create a new resource for your project, choose New from the project window context m enu or Resource|New from the main menu. You can then choose to create a new bitmap, icon, or cursor, as you did before when creating an individual resource file. A resource editor window will be displayed where you can create the resource using the drawing tools as needed.
When you have a resource created, you might need to edit it to make changes to the resource. To edit a resource in a resource project, locate the resource in the project window tree and double-click the resource name. A resource editor window will appear where you can edit the resource as needed.
Renaming resources can be accomplished using in-place editing on the tree view. To select the item you want to rename, just click it and then click on it again to begin editing the item. You can also choose Rename from the context menu to begin the in-place editing. After you have typed a new name for the resource, press Enter or click on another item in the tree view, and the name of the resource will change.
To delete a resource from the resource project, just click the resource name in the project tree to select it and then choose Delete from the context menu. You will be prompted to make certain you want to delete the item, after which it will be deleted. There is no undo for deleting a resource, so make sure a resource is no longer needed before you delete it.
Unfortunately, there is no simple way to add a resource contained in a separate file to a resource project. What you can do, however, is open your project file and then open the individual bitmap, icon, or cursor file that contains the resource you want to add to the project. Go to the individual file and choose Edit|Select All from the main menu to select the resource; then choose Edit|Copy to copy the object to the Clipboard. Create the new resource in the resource project. When the resource editor window is displ ayed, choose Edit|Paste from the main menu to paste the resource into the new resource.
NOTE: If the object you are adding to the resource project is a bitmap, be sure you check the bitmap attributes so that you know the width, height, and color depth of the bitmap. You will need those settings when you create the new bitmap in the resource project.
The Image Editor is not a high-end image editor, but it's good enough for many image-creation tasks. It's easy to use and is more than adequate for creating most icons and cursors.
WinSight is a utility that enables you to spy on Windows. WinSight will show you every application running and every window running under that application. (Remember: Controls are windows, too.) WinSight shows you every message generated by Windows (every message sent to a window, that is).
You can elect to view all messages or just messages sent to a specific window. To start WinSight, locate WS32.EXE from Windows Explorer and double-click the file (it's in the Delphi 4\Bin directory). WinSight, like the Image Editor, is a stand-alone program that can be run outside the Delphi IDE. Figure 11.8 shows WinSight spying on Windows Explorer.
FIGURE 11.8. WinSight in action.
As you can see in Figure 11.8, the WinSight window is split into two panes. The top pane lists the active windows, and the bottom pane shows the messages being sent to a particular window or to all windows. You can adjust the size of the panes by dragging the sizing bar between the two windows. The default is for the windows to be split horizontally, but you can opt to split the windows vertically. To change the window layout, choose either Split Horizontal or Split Vertical from the View menu.
You'll examine each of the two windows in more detail in just a bit, but first let me take a m oment to talk about Windows messages.
Spying on Windows isn't helpful if you don't know what any of it means. (The thrill of being a legal Peeping Tom wears off quickly.) The truth is, you have to spend a fair amount of time at Windows programming before you can understand all the information presented by WinSight.
Delphi is great for enabling you to write true stand-alone Windows applications in the shortest time possible. If there is a disadvantage to this kind of programming environment, it is that you do not have the opportunity to learn what really makes a Windows program run.
What makes a Windows program run is messages. Lots and lots of messages. Windows sends a window message to instruct the window to do something or to notify the window that some event has taken place. When a window is in need of repainting, for example, Windows sends it a WM_PAINT message. The WM_PAINT message instructs the window to repaint itself.
When a window is resized, Windows sends a WM_WINDOWPOSCHANGING message to notify the window that its size and/or position is changing. This message is followed by WM_WINDOWPOSCHANGED and WM_SIZE messages after the window has been sized. The sending of messages happens dozens or even hundreds of times each second in an average Windows environment.
There are more than 100 messages that Windows can send to an application. I talked a little about that on Day 5, "The Visual Component Model," when I discussed events in VCL. Many events that a Delphi program responds to are Windows messages. The OnCreate event is generated in response to a WM_CREATE message, the OnSize event is generated in response to a WM_SIZE message, and the OnMouseDown event corresponds to both the WM_LBUTTONDOWN and WM_RBUTTONDOWN messages. The list goes on and on. Delphi enables you to deal with messages at a higher level, thus freeing you to write the more important parts of your application.
Eventually you will want to learn more about what makes Windows tick. The great benefit of Delphi, though, is that you can write Windows programs immediately and gradually learn about all the low-level stuff.
NOTE: Some very good Windows programmers would argue that you should first learn to write Windows programs in C like in the good old days. The theory is that this kind of foundation is necessary for a Windows programmer to be effective in any programming environment. Although I would agree that that is the optimum scenario, I also recognize that few programmers these days have the time for that kind of learning process.
With that primer on Windows messages behind you, let's get back to WinSight and how it works.
The Window Tree
The top pane of WinSight is called the Window Tree. The Window Tree shows you
all windows currently open. It also tells you some details about the window class
of a specific window. The detail looks like this (except that onscreen it all appears
on one line):
Overlapped 00000D74 {ExploreWClass} EXPLORER.EXE (730,14)-(935,460) `Exploring - aTemplate'
The first item in this line shows the window style of the window. In this case it is an overlapped window (WS_OVERLAPPED for you old Windows hackers). Other possibilities include child and pop-up windows. (There are other window types, but overlapped, child, and pop-up are the most common.) The second column shows the window handle (HWND) of the window, which correlates to the Handle property of a VCL windowed component.
Next, you see the window class name in curly braces. This is the class name that the application used to register this particular window with Windows. Frequently, windows share a class name. The common button control, for example, has a class name of Button. Dozens of buttons might exist in different applications at any given time, but they are all of the same window class. In the case of Delp hi applications, forms and components show the VCL class that represents that component. For a button component, the class name in WinSight shows TButton.
NOTE: When Delphi 1 was in development, the code name for the project was Delphi. The intended name for the product, however, was AppBuilder. The name Delphi stuck and became the official product name. If you spy on the Delphi IDE with WinSight, you will discover that the Delphi main window has a class name of TAppBuilder, thereby lending credibility to this tale.
Following the class name is the module name of the process that created the window. Usually the module is an executable program. In this example, the module name is EXPLORER.EXE. After the module name, you see the window's size and position. Finally, you see the window text of the window. For overlapped windows, this usually means the text appearing in the title bar. For other types of windows, it means different things depending on the window type. For a button, for example, it will show the text on the button.
NOTE: A common practice with commercial applications is to create hidden windows to accomplish a specific task in the application. Hidden windows just show the text (hidden) after the module name. Because the window is hidden, there is no size and position information, nor is there any window text.
The Window Tree is hierarchical. At the top of the tree is the Windows Desktop. Under that are any windows created as children of the desktop. An executable file, for example, appears under the desktop node. A given window can have other child windows under it. Lines connect the parents, their children, and any siblings.
You will notice back in Figure 11.8 that a diamond appears to the left of each item in the Tree Window. If a window has children, the diamond contains either a plus sign or a minus sign. If the diamond has a plus sign, it means t he node is contracted and can be expanded to reveal the child windows. If the node has a minus sign, the plus is already expanded. You can expand or contract a node by clicking anywhere to the left of the item. Blank diamonds indicate a window without children.
NOTE: If a particular window is enabled in the Window Tree, the diamond next to the item flashes whenever the window receives a message from Windows.
The Message Trace window shows the individual messages as they are generated by Windows. A typical Message Trace item looks like this:
000684:00000854 {TMemo} WM_KEYDOWN Dispatched 48h 72d VK_H Scan 23h Down
It doesn't pay to analyze this in detail because the exact details vary so much from message to message. In this case, a memo component received a WM_KEYDOWN message with a parameter of VK_H. In other words, the user pressed the h key with the cursor in a memo component. As you can see, some of the information shown in a Message Trace item also appears in the Window Tree. For example, the window handle is displayed as well as the class name.
You begin the message trace by choosing the Start! item in the main menu. The messages will begin appearing in the Message Trace window as they are received by the window or windows you have selected. To stop the message trace, choose the Stop! item in the main menu.
NOTE: The Stop! and Start! items in the main menu occupy the same place on the menu bar. If the message trace is off, the menu item reads Start! If the trace is running, the menu item reads Stop!.
Messages scroll through the Message Trace window as they are received. You can always stop the message trace and scroll back through the list to view any messages that have scrolled out of view. Another option is to send the message output to a log file. WinSight options are discussed later in the section "Message Trace Options."
WinSight enables you to view all messages sent to all windows or messages sent to a particular window. To view all messages, choose Messages|All Windows from the main menu. Although you can choose to view all messages sent to all windows, it isn't usually productive. There are so many messages flying around that it is hard to pick out the specific ones you are looking for.
A better method is to select a specific window and then watch the messages for just that window. That will keep the clutter in the Message Trace window to a manageable level. To view the messages for a specific window, locate the window in the Message Tree and click on it to select it. Now choose Messages|Selected Windows from the main menu. Choose Start!, and any messages sent to the selected window will show up in the Message Trace window.
TIP: It's best to have a specific idea of what you are looking for when you are using WinSight. Because there are so many messages sent to an individual window, the message you are looking for will probably scroll off the screen very quickly. To maximize the effectiveness of WinSight, select the window for which you want to see messages, start the message trace, manipulate the window any way you need to, and turn off the message trace again.
You can control the messages displayed in the Message Trace window via the Message Trace Options dialog box (see Figure 11.9). You can also change the way the message is displayed. To view the Message Trace Options dialog box, choose Messages|Options from the main menu.
FIGURE 11.9. The Message
Trace Options dialog box.
The section entitled Messages to Trace comprises the bulk of this dialog box. This
section shows severa
l message groups on the left and a list box displaying all Windows
messages on the right. As you select or deselect message groups, the corresponding
messages will be selected or deselected in the list box.
NOTE: The list box messages that are all uppercase are the standard Windows messages. The lowercase messages are undocumented Windows messages. Undocumented messages are messages that are used by Windows, usually for internal use, but are not documented in the Windows API help files.
When the All Messages option is checked, WinSight will trace all Windows messages. To further specify your messages and thus to reduce clutter in the Message Trace window, you can elect to view only certain groups of messages. If, for example, you want to view only mouse messages, you can turn off the All Messages check box and turn on the Mouse check box. To further specify, you can turn off all options and then choose a specific message from the list box on the right of the dialog box. For example, if you want to see only the WM_LBUTTONDOWN message, you can turn off all options and then select just the WM_LBUTTONDOWN message from the list box. Only the WM_LBUTTONDOWN messages will be reported in the Message Trace window.
Another group of options on the Message Trace Options dialog box controls how the messages are displayed in the Message Trace window. The Interpret Values option tells WinSight to break down each message's parameters into a more readable format. For example, given a WM_KEYDOWN message, would you rather see
0000309:00000474 {TMemo} WM_KEYDOWN Dispatched
or
0000309:00000474 {TMemo} WM_KEYDOWN Dispatched 44h 68d VK_D Scan 20h Repeat
Most of the time I opt to see more detail, so I generally leave the Interpret Values option on.
The Hex Values option tells WinSight to display the values in the Message Trace window in hexadecimal format. This is useful in some situations but pro bably not until you've been programming for a while. The Show Times option is of limited use because it shows a system time that isn't generally meaningful.
The Log file option enables you to send the message trace output to a file on disk. When this option is on, the messages are still displayed in the Message Trace Window. This option is useful when you need a hard copy of the messages being generated.
TIP: Creating a log file has another advantage. After you create a log file and load it into a text editor, you can use the text editor's Find function to search for specific messages or message parameters you want to review.
WinSight has other features that make finding and examining windows easier.
The Detail feature of WinSight shows you all the pertinent details of a particular window. To view a window's details, select the window in the Window Tree and then choose Spy|Open Detail from the main menu. You can also double-click the window in the Message Tree or press Enter on the keyboard. Figure 11.10 shows the details of Windows Explorer.
FIGURE 11.10. The WinSight
Detail window.
As you can see, the Detail window shows you a great deal about the window you are
examining (probably more than you want to know!).
This option enables you to select a window in an application and have that window become the active window in the Window Tree. The Window Tree usually contains dozens of windows. It is often difficult to find the window you are looking for, so the Follow Focus feature really comes in handy.
To use this feature, choose Spy|Follow Focus from the main menu. Next, switch to the application that contains the window for which you want to view messages and, if needed, click the specific control within that window that you want to spy on. WinSight automatically selects the window in the Window Tree. To begin spying on the window, choose Start! from the main menu.
TIP: The Follow Focus option stays on until you turn it off. Unless you want to view other windows or controls in your application, you should turn off Follow Focus as soon as you locate the window you want to spy on.
The Find Window feature of WinSight is the opposite of Follow Focus: In the Window Tree, you locate the window you're searching for and then choose Spy|Find Window from the main menu. WinSight will place a thick frame around the window and will flash the frame.
The frame stays around the window until you click the window or choose another window from the Window Tree. The thick frame is drawn on top of all windows so that you can find a window even if it's hidden under other windows. A window located with Find Window doesn't come to the top or gain input focus; it is merely identified for you.
NOTE: Find Window cannot find hidden windows or windows that are minimized.
The Find Window mode shuts off as soon as focus leaves the Window Tree. If you click on another application or anywhere else in WinSight, the Find Window mode will turn off.
The Switch To feature enables you to switch to a particular window in an application. To switch to a window, just find the window in the Window Tree and then choose Spy|Switch To from the main menu. The window will come to the top and will have input focus. If the window is minimized, it will be restored to its previous location. Switch To has no effect on hidden windows.
It will take time working with WinSight before you understand each message and its significance. In time, though, you will pick it up.
TDUMP is a command-line program that out puts the structure of an .exe or .dll (and other file types as well). By default, the output from TDUMP goes to the console, but it can be redirected to a text file that you can later examine to obtain information about the program. TDUMP will tell you about the structure of the file, what DLLs the program uses, what functions in those DLLs the program calls, and other information. For example, here is part of the file dump results on a program produced by Delphi:
Portable Executable (PE) File Header base: 00000200 CPU type 80386 Flags 818E [ executable 32bit ] DLL flags 0000 [ ] Linker Version 2.19 Time stamp 00000000 O/S Version 1.0 User Version 0.0 Subsystem Version 4.0 Subsystem 0002 [ Windows GUI ] Object count 00000008 Symbols offset 00000000 Symbols count 00000000 Optional header size 00E0 Magic # 10B Code size 0003C000 Init Data size 00009000 Uninit Data size 00001000 ...(other information)... Imports from OLEAUT32.dll SysAllocStringLen SysStringLen VariantChangeTypeEx VariantClear VariantCopyInd Imports from MPR.dll WNetGetConnectionA Imports from USER32.dll AdjustWindowRectEx BeginPaint CallNextHookEx
CharLowerA ... (more DLL imports) ...
Typically you run TDUMP from the command line. Because the output from TDUMP is usually long, you are better off if you redirect the output to a text file. The following illustrates this:
tdump MyApp.exe > dump.txt
Now you have an ASCII text file that you can browse with the Delphi Code Editor or any other text editor. Although you might not use TDUMP often, it can be invaluable when you need it.
NOTE: TDUMP is mostly used for obtaining a list of exported functions and procedures in a DLL.
The Package Collection Editor provides a way of deploying several packages that are meant to work together. To invoke the Package Collection Editor, choose Tools|Package Collection Editor from the main menu. The Package Collection Editor has a help menu that explains more about how to use it.
This tool is primarily meant for component vendors who ship several packages together. The Package Collection Editor has undergone some change in Delphi 4 and is therefore more useful than it was in Delphi 3. You'll have to experiment with this tool to see if it is something that you can use. Still, you might find that it is not robust enough to be used in heavy-duty commercial component deployment.
The Delphi Tools menu is configurable. By default, the Delphi Tools menu has items for Database Desktop and Image Editor. You can add your own tools to the Tools menu, add other Delphi tools, or add any other program you use frequently. You can also change the order of items on the Tools menu or even delete items.
Just about any application you use frequently can be added to the Tools menu. By adding items to the Tools menu, you can quickly load any program you frequently use during program development. Adding a tool to the Tools menu is a trivial task and takes only a few minutes. Adding, deleting, and moving items on the Tools menu is accomplished through the Tool Options dialog box. To display the Tool Options dialog box, choose Tools|Configure Tools from the main menu (see Figure 11.11).
FIGURE 11.11. The Tool Options dialog box.
The list box labeled Tools shows the tools that currently appear on the Tools menu. The tools are listed in the order in which they appear on the Tools menu. To reorder the list of tools, click the tool you want to move and click either the up or down arrow button. To remove a tool from the Tools menu, select the tool from the list box and click the Delete button. The tool will be removed from the menu.
To add a tool to the Tools menu, click the Add button. The Tool Properties dialog box is displayed, and you can enter the properties for the tool you are adding. The Tool Properties dialog box is shown in Figure 11.12 with the properties for Windows Explorer displayed.
FIGURE 11.12. The Tool Properties dialog box.
The Title field is where you type the tool's title as you want it to appear on the Tools menu. You can use an ampersand to indicate the shortcut key character. The Program field is where you enter the tool's path and filename. To ensure finding the program, you should enter the program's full path. If you don't know the exact path and filename, you can click the Browse button and go hunting for the file. The Working dir field is used to set the working directory for the tool. If you browse to find the tool, the working directory will be automatically set to the directory where the program resides.
The Parameters field requires some explanation. In its simplest form, this field is used to set the tool's command-line parameters. Type any parameters needed to run the tool. You can, however, use Delphi's predefined macros in the Parameters field. If you click the Macros button in the Tool Properties dialog box, you get a list of macros from which you can choose.
To use a macro, you can type it in directly or you can choose it from the list and click the Insert button. Figure 11.13 shows the Tool Properties dialog box with the list of macros displayed.
FIGURE 11.13. The Tool Properties dialog box showing macros.
The $EXENAME macro will return the full path of the project's target executable. For example, if you have a project named MyApp in a directory called Projects, the $EXENAME parameter will pass the string c:\Projects\MyApp.exe to the program. Some macros require parameters. To use only the path from your project's target without the filename, you would specify a parameters string of $PATH($EXENAME). Continuing with this example, that combination of parameters would yield c:\Projects\. For a complete list of the macros available, see the Delphi online help.
Editing Tools on the Menu
Editing a tool on the Tools menu is as easy as clicking the Edit button on the
Tool Options dialog box. The Tool Properties dialog box is displayed, and you can
change any of the fields as necessary.
When you are done adding, editing, or rearranging your tools, click the Close button. The Delphi Tools menu will reflect your changes.
The Delphi Environment Options enable you to make changes to the Delphi IDE at the global level. (The Project Options dialog box controls settings at the project level.) To display the Environment Options dialog box, choose Tools|Environment Options from the main menu. This is a tabbed dialog box with nine pages. You learned about the Editor, Display, Color, Code Insight, and Explorer pages when you looked at the Code Editor and Code Explorer on Day 9. You'll look at the Preferences, Library, and Palette pages now.
NOTE: The Environment Options dialog box also contains a page for the Browser settings. This requires more explanation than I can provide in this chapter, so I won't attempt to cover the Browser or the Browser options.
The Preferences page of the Environment Options dialog box is where you set general Delphi preferences: how the Delphi IDE controls compiling, autosaving, and the appearance of the Form Designer. You can also set the Form Designer preferences on this page (see Figure 11.14).
FIGURE 11.14. The Preferences page of the Environment Options dialog box.
The Desktop contents section determines how much of the desktop layout Delphi will save when the project is saved.
The Autosave options section enables you to specify that either the Editor files or the Desktop be saved automatically every time the program is run. Personally, I do not like to have my editor files saved automatically; I want the ability to abandon current edits if necessary. Still, I know others who really like this feature and wouldn't program without it.
For one, if your application misbehaves and crashes the Delphi IDE or Windows, you know that your last edits have been saved. The Desktop option saves the current size and position of the Code Editor, all forms, the Alignment palette, the Object Inspector, and so on.
For the most part, the Form Designer section is self-explanatory. The Display grid option turns the visible grid in the Form Designer on and off. This affects only the grid's visible display, not whether objects snap to the grid. The Snap to grid option determines whether components placed and moved will snap to the grid points. The X and Y grid size fields enable you to set the size of the grid. By default, it is set at eight pixels. The Show component captions option pertains to nonvisual components placed on your forms. When this option is on, the Form Designer displays the Name property of nonvisual components below the icon representing the component.
The Compiling and Running section has four options as follows:
NOTE: When the Minimize on run option is on, any action in the program that requires the debugger (exceptions, breakpoints, and so on) results in the Delphi IDE being displayed again.
The Shared Repository section enables you to specify where the Object Repository information is saved by specifying the appropriate path in the Directory edit box. This can be very helpful in the case of repository items being used by a group of people working on the same project. You can set the Shared Repository's Directory to point to a place on the network, and all the items that you add to the Object Repository will be saved to the location on the network and can be inherited from by the other group members.
The Library page of the Environment Options dialog box has just three fields. The Library Path field is used to specify the path to the library files that Delphi uses for the Component Palette. Normally you don't have to change this path. The BPL output directory and DCP output directory fields are used to specify directories in which package output files will be placed. For example, you might opt to have your packages (.bpl files) created in your Windows\System or Winnt\System32 directory (package files need to be on the system path).
The Palette page of the Environment Options dialog box enables you to customize the Component Palette (see Figure 11.15).
FIGURE 11.15. The Palette page of the Environment Options dialog box.
This page enables you to change the order in which the pages appear in the Component Palette. The Pages list box on the left side of the dialog box shows all the pages currently in the Component Palette. Note that depending on the version of Delphi you own, the palette pages you see listed might differ from those shown in Figure 11.15. (The Midas tab, for example, is only available for the Client/Server version of Delphi.) At the bottom of the list you will see an item labeled [All]. This item shows all the installed components in all pages of the Component Palette. The Components list box shows the components appearing in the page that is selected in the Pages list box.
To reorder the pages, drag a page within the Pages list box to the position you want it to occupy in the Component Palette. If you want the Samples page to appear first on the Component Palette, you can drag it to the top of the list in the Pages list box and drop it. You can also click on a page and use the Move Up or Move Down buttons to move the page to a new location.
Pages can be added, deleted, or renamed, and those operations work exactly as you would expect. To add a page, click the Add button. You will be prompted for a name for the page. After you supply the page name, the new page is created. You might add a page, for example, if you have created your own components and want them on their own page in the Component Palette. You can also take any of the VCL components that you use a lot and move them to a new page so that you can get to them quickly.
TIP: You can move components from page to page, but you cannot copy components from one page to another. You can, however, add any installed component to any page on the Component Pa lette. First select [All] in the Pages list box. Then drag a component from the Components list box to any of the pages in the Pages list box.
Deleting and renaming pages is straightforward. As with the Object Repository, you delete a page only after it has been emptied of its components.
Components on a page can be rearranged just as pages can. To move a component, drag it to its new position in the Components list box or use the Move Up or Move Down buttons. To move a component to a new page, drag and drop it on the name of the page in the Pages list box where you want it to appear. To delete a component, first select the component and then click the Delete button.
So now you know more about the tools included as part of the Delphi suite. Some of these tools are easy to miss, so it helps to have an overview of what is available to you. Some tools you might not use right away, but in the future you can take another look at what's available to you. I ended the day by going over the Environment Options dialog box. For the most part, you can leave these settings on their defaults. When you begin customizing the IDE, you will have a better understanding of what the individual options do.
Workshop
The Workshop contains quiz questions to help you solidify your understanding of the material covered and exercises to provide you with experience in using what you have learned. You can find answers to the quiz questions in Appendix A, "Answers to the Quiz Questions."
© Copyright, Macmillan Computer Publishing. All rights reserved.