Pascal Newsletter #28
The full source code examples of this issue are available for download.
![]() |
![]() |
Pascal Newsletter #28 - 20-NOV-2001 INDEX 1. A FEW WORDS FROM THE EDITOR 2. BAR CODES (and II) - Introduction . DrawToCanvas . Properties - How "TCodeBar" is used - "TBits" - Drawing bars - The test program - In the future 3. FORUMS - Delphi - Kylix - Free Pascal - Components 4. NEWS - Kylix 2 . Features . Downloads 5. TIPS & TRICKS - Determining if a logical drive exists - Hiding the cursor for all applications - Checking if a Windows feature exists. Hide your app in the Task List - Performing a lengthy operation when Windows shuts down 6. DELPHI ON THE NET - Articles, Tips and Tricks - Components, Libraries and Applications . Freeware . Shareware/Commercial - Tutorials ________________________________________________________________________ 1. A FEW WORDS FROM THE EDITOR In this issue I'm glad to present the second part of the article "Bar Codes" by Alirio Gavidia. In the "Delphi on the Net" section, now in charge of Dave Murray, we have added a place for shareware/commercial components, libraries and applications (apart from freeware, of course). In the last issue I gave you the wrong address for the Kylix forum, which pointed to the Spanish one. Oops! Sorry for the mistake. If you subscribed to that group, please accept my sincerest apologies and send me an email so I can move your account to the English group. This newsletter has recently reached 4850 subscribers, but the truth is that we feel this number is very small. We need your help to keep this newsletter going and growing. The easiest way you can help us is by voting for us in any or some of these rankings to help give more visibility to our web site and thus increase the number of subscriptions to this newsletter: http://www.sandbrooksoftware.com/cgi-bin/TopSite2/rankem.cgi?id=latium http://news.optimax.com/delphi/links/links.exe/click?id=70C517ECAE6E http://www.programmingpages.com/?r=latiumsoftwarecomenpascal http://www.top219.org/cgi-bin/vote.cgi?delphi&83 http://top100borland.com/in.php?who=20 http://top200.jazarsoft.com/delphi/rank.php3?id=latium http://213.65.224.200/cgi-bin/toplist.cgi/hits?Id=80 It's just a few seconds for you that REALLY means a lot to us. You can also help us by forwarding this newsletter to colleagues, or inviting them to subscribe: http://www.latiumsoftware.com/en/pascal/delphi-newsletter.php We dream of reaching 10,000 subscribers and we hope you can help us make that dream come true. By the way, the Pascal Newsletter was added to the list of Cumuli Ezine Finder, where you can: * Rate the newsletter: http://www.cumuli.com/ezines/ra22134.rate * Recommend it to friends: http://www.cumuli.com/ezines/pascal.ezine Regards, Ernesto De Spirito eds2004 @ latiumsoftware.com ________________________________________________________________________ JfControls Library. Multi-language. Multi-appearance. Skins. Privileges. More than 40 integrated and customizable components. Impressive GUI. Centralized resources administration. Multiple programming problems solved. For Delphi 3-7 and C++ Builder 3-6. http://www.jfactivesoft.com/ ________________________________________________________________________ 2. BAR CODES (and II) By Alirio A. Gavidia Introduction ============ The first part of this article was about bar codes type 39 and 128, of common commercial use. This second delivery includes and shows a set of routines developed in Delphi that implement part of the functionality of these codes. A project is annexed, where the class "TcodeBar" is defined. This class inherits part of its functionality from "TGraphicControl", where "TCustomLabel" derives from. In the end, this control works imitating certain functionality of a "TLabel" control. Its fundamental definition is: TCodeBar = class(TGraphicControl) : : public procedure Paint; override; constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure DrawToCanvas(aCanvas: TCanvas; ax, ay, EscX, EscY: Integer); property Price : string read FPrice write SetPrice; property Description : string read FDescrip write SetDescrip; property DisplayTextCode: boolean read FDisplayTextCode write SetDisplayTextCode; property CodeType : TCodeType read FCodeType write SetCodeType; property Caption : TCaption read FCaption write SetCaption; property CurrencyString : string read FCurrencyString write SetCurrencyString; end; DrawToCanvas ------------ procedure DrawToCanvas(aCanvas: TCanvas; ax, ay, EscX, EscY: Integer); This method is meant for printing the bar code scaled in any "canvas" (normally the printer's). Properties ---------- Since the main use of bar codes is to label products, here we defined properties to add text that can be read by humans. property Price: string; For printing the price of the product. property Descrip: string; For printing the description. property DisplayTextCode: Boolean; Sometimes it is required nothing else than just the bar code. property CodeType; Two options, ct128 or ct39, which determine the type of code to use. property Caption: TCaption; It's the text that will be turned to bar code. For this version it can only be numbers. property CurrencyString: string; The currency denomination. It is initially taken from the variable of the same name. How "TCodeBar" is used ====================== Like a label, it can be created, assigned a "Parent" and assigned the size properties that might be required. Additionally, the properties "CodeType", "Price" and "Description" can be set. Example: CodBar := TCodeBar.Create(Self); if RadioGroup1.ItemIndex=0 then CodBar.CodeType := ct128 else CodBar.CodeType := ct39; CodBar.Caption := Edit1.Text; CodBar.Left := Edit1.Left; CodBar.Top := Label2.Top; CodBar.Width := 250; CodBar.Height := 50; CodBar.Description := EdDescrip.Text; CodBar.Price := Edprice.Text; CodBar.Parent := Self; In order to print, "DrawToCanvas" provides a solution where it is given the destination "canvas", position and scale factors: CodBar.DrawToCanvas(Prn.Canvas, SELeft.Value, SETope.Value + step, SEX.Value div 2, SEY.Value) The scale is porcentage. "TBits" ======= It's a class for manipulating true/false values, mainly when they are more than 32 bits. It provides two properties: "Size" and "Bits". The second one allows access to each bit like part of an array. I used the class "TBits" to store the codification of format 128. You'll see that it is something "uncomfortable" to write 1166 values one by one by this method. Nevertheless, now I can say that I used this class once in my life. This class wasn't used with code 39. In the next version, with alphanumeric support, the use of "TBits" will be substituted for other means. Drawing bars ============ The routines "DrawCode128" and "DrawCode39" are fundamentally equal. The width and height of each element of the code is determined (bar or space) and the bars are drawn in the corresponding place (it is possible to draw the white spaces, but it seems unnecessary). In particular, with code 128 a parity character and a stop character are required. For the parity there exists a routine called "Getcheck128" that returns the number of the resulting character. The test program ================ This test program was developed for a company which distributes a large number of products. The code, description and price are displayed as part of the label. The quantity is the number of times each label is to be printed. The margins can be stored between sessions as "Set 1" and "Set 2" thru a menu accessible with the right button of the mouse. "English maincod.dfm" and "Spanish maincod.dfm" are versions of "maincod.dfm" in each language. Copy the one you find more suitable on "maincod.dfm". I hope you find it useful. In the future ============= Several changes and improvements are being considered for these routines: - Alphanumeric support both for code 39 and code 128. - Resolution of the problem of odd length codes in code 128. - "Autosize" property. - Dropping the initialization using TBits in favour of a resource file. - Keeping the size of each character constant (not the total width as it is done in this version). -------------------------- The source code that accompanies this article can be downloaded from: http://www.latiumsoftware.com/download/p0028.zip ________________________________________________________________________ IBAdmin 3.2 - Complete Interbase SQL tool - A powerful DBA/Development tool for managing Interbase servers and databases. IBAdmin provides many capabilities to help with your DB design and management. You can use the Database Designer to visually design the database structure, the Grant Manager to manage users, or the SQL Debugger which can be used to debug stored procedures and triggers. Comfortable SQL code editing with Code- Insight and Code Completion. >>>>>>>>> http://www.sqlly.com/ibadmin2.htm ________________________________________________________________________ 3. FORUMS Delphi ====== If you know much of Delphi but you are still far from being a guru this forum is for you. This is the only forum for intermediate-level Delphi programmers on the Web (Delphi hackers are also welcome :-)). The forum now has more than 350 members, while it maintains its low traffic: http://groups.yahoo.com/group/delphi-en If you want to join the group, the best way is to subscribe from the web since you can access the special features available at the web site (a Yahoo! ID is required and you can get yours free by registering as a Yahoo! user), but if you don't want to register or if you don't have full Internet access you also can subscribe by email: http://groups.yahoo.com/group/delphi-en/join delphi-en-subscribe@yahoogroups.com Kylix ===== The forum for Kylix programmers doesn't have much movement yet, but keeps steadily growing and now has more than 105 members. http://groups.yahoo.com/group/kylixgroup If you want to join the group, you can subscribe from the web or --more easily-- by email: http://groups.yahoo.com/group/kylixgroup/join kylixgroup-subscribe@yahoogroups.com Free Pascal =========== The forum for Free Pascal (freepascal.org) programmers also keeps growing and now has more than 110 members. http://groups.yahoo.com/group/freepascal-en If you want to join the group, you can subscribe from the web or --more easily-- by email: http://groups.yahoo.com/group/freepascal-en/join freepascal-en-subscribe@yahoogroups.com Components ========== This is a forum for searching/recommending software components (VCL and CLX components, ActiveX objects, DLL libraries, shared objects, etc.), as well as utilities, tutorials, information, etc.: http://groups.yahoo.com/group/components If you want to join the group, you can subscribe from the web or --more easily-- by email: http://groups.yahoo.com/group/components/join components-subscribe@yahoogroups.com ------------------ NOTE: Except temporarily for the Kylix forum (because Kylix is rather new), the forums about programming aren't meant for beginners, but for intermediate/advanced programmers, although if you are a beginner, you can participate as a "listener" and occasionally you can make questions to have key concepts clarified. ________________________________________________________________________ 5. NEWS Kylix 2 ======= Borland released Kylix 2, the first Web Services solution for Linux. Kylix 2 brings more compatibility with Delphi 6, incorporating features such as BizSnap, WebSnap, DataSnap and CORBA support. * Press release - Oct 23 http://www.borland.com/about/press/2001/kylix2.html * Borland updates Kylix - By Matthew Broersma http://news.zdnet.co.uk/story/0,,t269-s2097947,00.html * Luxury of Independence. Borland stands above the general web-services fray - By John Pallatto internetworld.com/magazine.php?inc=110101/11.01.01nothingbutnet.html * Borland Revamps Kylix - By Alan Zeichick http://www.sdtimes.com/news/041/story3.htm * Press release - Nov 6 http://www.borland.com/about/press/2001/k2_ships.html Features -------- * New features in Kylix 2 http://www.borland.com/kylix/k2/newfeatures.html * Datasheet (PDF) http://www.borland.com/kylix/k2/k2_datasheet.pdf * Feature Matrix (PDF) http://www.borland.com/kylix/k2/k2_featurematrix.pdf * Features & Benefits (PDF) http://www.borland.com/kylix/k2/k2_feaben.pdf Downloads --------- * Kylix 2 Enterprise Trial Edition http://www.borland.com/kylix/trial2/k2_entdown_steps.html * Kylix 2 Open Edition http://www.borland.com/kylix/trial2/k2_opendown_steps.html ________________________________________________________________________ 5. TIPS & TRICKS Determining if a logical drive exists ===================================== You can use the API GetLogicalDrives to get the logical drives present in the system. This function returns a 32-bit value where the bits represent the logical units. For example: +---------------------------------- bit 31 (most significant bit) | +--- bit 0 (least significant bit) | | 00000000000000000000000000101101 | |||||||| | |||||||+--- 1 ==> Drive A: present | ||||||+---- 0 ==> Drive B: absent | |||||+----- 1 ==> Drive C: present | ||||+------ 1 ==> Drive D: present | |||+------- 0 ==> Drive E: absent | ||+-------- 1 ==> Drive F: present | |+--------- 0 ==> Drive G: absent | +---------- 0 ==> Drive H: absent | : : : +---------------------------- 0 ==> Drive Z: absent To get the bit mask corresponding to a drive letter in order to test the result of GetLogicalDrives, we can use the following expression: 1 Shl (Ord(DriveLetter) - Ord('A')) For example, if DriveLetter was 'D', the result of this expression would be: 1 shl (Ord('D') - Ord('A')) = 1 shl (68 - 65) = 1 shl 3 = 8 In binary: 00000000000000000000000000001000 A bitwise And between the mask and the result of GetLogicalDrives will be zero if bit 3 isn't set (i.e. if drive D: isn't a valid logical drive). All right then, let's get to the function: uses Windows; function IsLogicalDrive(Drive: string): boolean; var sDrive: string; cDrive: char; begin sDrive := ExtractFileDrive(Drive); if sDrive = '' then Result := False else begin cDrive := UpCase(sDrive[1]); if cDrive in ['A'..'Z'] then result := (GetLogicalDrives And (1 Shl (Ord(cDrive) - Ord('A')))) <> 0 else Result := False; end; end; Sample call: if not IsLogicalDrive(Edit1.Text) then ShowMessage(Format('"%s" is not a valid drive.', [ExtractFileDrive(Edit1.Text)])); Hiding the cursor for all applications ====================================== The API ShowCursor can be used to hide/show the mouse cursor, but this only affects our application. If we want to hide the cursor for all applications, one way of doing it is confining the cursor to a position outside the limits of the screen with the API ClipCursor: uses Windows; procedure rShowCursor(bShow: BOOL); var r: trect; begin if not bShow then begin // Hide r.Top := 0; r.Left := GetSystemMetrics(SM_CXSCREEN) + GetSystemMetrics(SM_CXCURSOR); r.Right := r.Left; r.Bottom := 0; ClipCursor(@r); SetCursorPos(0,0); end else begin // Restore ClipCursor(nil); SetCursorPos(GetSystemMetrics(SM_CXSCREEN) div 2, GetSystemMetrics(SM_CYSCREEN) div 2); end; end; Checking if a Windows feature exists - Hide your app in the Task List ===================================================================== Some Windows API functions may or may not be present in your Windows version, but detecting the Windows version is not the best way to know if a function is present since it may yield a false negative if the user updated a DLL and the update includes the new function... To check if an API function exists, we have to load the DLL library where it is supposed to reside (calling the API LoadLibrary) and then we have to get the address of the function (calling the API GetProcAddress) which is finally used to call it. If GetProcAddress returns Nil, then the function isn't present, and if it returns a value other than Nil, then the function is present, but we have to take into account that it isn't necessarily implemented (it may be just a placeholder, and if we call it, we will get the error code ERROR_CALL_NOT_IMPLEMENTED). In the following example we implement a function called RegisterAsService which tries to call the API RegisterServiceProcess to register/unregister our application as a service. The function returns True if successful. function RegisterAsService(Active: boolean): boolean; const RSP_SIMPLE_SERVICE = 1; RSP_UNREGISTER_SERVICE = 0; type TRegisterServiceProcessFunction = function (dwProcessID, dwType: Integer): Integer; stdcall; var module: HMODULE; RegServProc: TRegisterServiceProcessFunction; begin Result := False; module := LoadLibrary('KERNEL32.DLL'); if module <> 0 then try RegServProc := GetProcAddress(module, 'RegisterServiceProcess'); if Assigned(RegServProc) then if Active then Result := RegServProc(0, RSP_SIMPLE_SERVICE) = 1 else Result := RegServProc(0, RSP_UNREGISTER_SERVICE) = 1; finally FreeLibrary(module); end; end; Notice that registering our application as a service has the side-effect of hiding our application in the Task List (in Windows Task Manager). Sample calls: RegisterAsService(true); // Hides the app from the Task Manager // by registering it as a service RegisterAsService(false); // Unregisters the app as a service and // it will be visible in the Task Manager NOTE: RegisterServiceProcess is a Windows 9x/Me API. It isn't present in Windows NT/2000, and I don't think there is a way to hide an application from the Task Manager in these Windows versions. Performing a lengthy operation when Windows shuts down ====================================================== When Windows shuts down, it allows applications a limited amount of time to respond to the shutdown request (WM_QUERYENDSESSION message). If an application doesn't respond to the request in that time, Windows normally displays a dialog box allowing the user to forcibly shut down the application, retry the shutdown, or cancel it. If we want our application to perform a process when Windows shuts down, for example a backup, which might take some seconds longer than Windows is willing to wait, and we don't want Windows to display that dialog box, then what we have to do is cancel the shutdown, perform our process and finally, when we are done, tell Windows to shutdown. Since we have to respond to Windows before executing our process, the trick we use is setting a timer -initially disabled- to allow the process to execute some milliseconds later. We use a variable ProcessStatus to know if we have to run the process (0), if it is currently running (1) or if it has finished (2), to know if we can allow the system to shut down or not, and if we have to run the process or not. interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm1 = class(TForm) Timer1: TTimer; procedure Timer1Timer(Sender: TObject); private { Private declarations } procedure WMQueryEndSession (var Msg: TWMQueryEndSession); message WM_QueryEndSession; public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} var EndSessionFlags: integer; ProcessStatus: integer; procedure TForm1.WMQueryEndSession(var Msg: TWMQueryEndSession); begin case ProcessStatus of 0: // First time begin ProcessStatus := 1; // To avoid entering here again EndSessionFlags := Msg.Source; // Save the flags for later use Msg.Result := 0; // Tell Windows not to end the session Timer1.Enabled := True; // Enable the timer so we can perform // the process some milliseconds later. end; 1: // We are processing... Msg.Result := 0; // Tell Windows we are not ready yet 2: // We are done with the process... begin ProcessStatus := 0; // Ready for next session (if applies) Msg.Result := 1; // We are done. OK to close Windows end; end; end; procedure TForm1.Timer1Timer(Sender: TObject); begin Timer1.Enabled := False; // Turn off the timer so the event doesn't // trigger again // Here we perform our lengthy process ShowMessage('Windows won''t close until you close this dialog.'); ProcessStatus := 2; // Flag to know we finished the process ExitWindowsEx(EndSessionFlags, 0); // Now we tell Windows to close end; NOTE: In Windows NT/2000 you need to have privileges to shut down the system. ________________________________________________________________________ 6. DELPHI ON THE NET By Dave Murray Articles, Tips and Tricks ========================= * Delphi Database Programming Course - by Zarko Gajic Free online database programming course for beginner Delphi developers focused on ADO techniques. http://delphi.about.com/library/weekly/aa010101a.htm Two new chapters have been added in the last month: Chapter 18 "Data Modules" shows how to use the TDataModule class - central location for collecting and encapsulating data access objects, their properties, events and code. http://delphi.about.com/library/weekly/aa101601a.htm Chapter 19 "Handling database errors" introduces error handling techniques in Delphi ADO development. Find out about global exception handling and dataset specific error events. http://delphi.about.com/library/weekly/aa103001a.htm * What’s New In Delphi 6? - by Brian Long A reviews the latest Delphi version http://www.thedelphimagazine.com/samples/1263/1263.htm * .NET complex types in a Delphi web service client - by John Kaster An article discussing prototype support for .NET web services that use Document Literal encoding in Delphi. http://community.borland.com/article/0,1410,27986,00.html * How to get the screensaver time-out value? - by Rainer Kümmerle http://www.swissdelphicenter.ch/en/showcode.php?id=854 * How to mount a share? (Kylix) - by Lukas Zurschmiede http://www.swissdelphicenter.ch/en/showcode.php?id=860 * How to create a cute gradient label - by Alain Gosselin http://www.delphi3000.com/articles/article_2794.asp * Give your menus a new look - by Vassilis Perantzakis This component gives your menus a customizable new look, a lot like the XP menus - only better! http://www.delphi3000.com/articles/article_2796.asp * Call AnimateWindow the safe way - by Adam Lanzafame AnimateWindow can enhance your GUI by adding special animations to your forms. However, the API is only valid from Win98 / 2000. This code shows you how to use it only when it is supported, without crashing and burning when it is not supported. http://www.delphi3000.com/articles/article_2799.asp * Converting from Windows > UNIX ASCII Text Files - by Lloyd Kinsella How do you convert between Windows and UNIX ASCII files? http://www.delphi3000.com/articles/article_2815.asp * Transparent Desktop Icon Text - by Lloyd Kinsella Annoyed at the icons on your Desktop with those damned colored text backgrounds, wouldn't it be nice if your wallpaper showed through? http://www.delphi3000.com/articles/article_2814.asp * TASPObject - ASP programming with Delphi - by Curtis W. Socha Introducing the TASPObject. See how to create a real application that incorporates the TASPObject - by creating an ASP page counter to see how many times your ASP has been called. http://delphi.about.com/library/bluc/text/uc110601a.htm * Help for component creators - by Pintér Gábor Create a help file for your component exactly like Delphi's help. With source code, examples, and installation instructions. http://community.borland.com/article/0,1410,26679,00.html * Using COM+ object pooling with Delphi 6 - by Vincent Parrett Delphi 6 introduces support for COM+ object pooling, which provides significant performance improvements under some circumstances. http://community.borland.com/article/0,1410,27568,00.html * Templates in Object Pascal - by Rossen Assenov Here's a quick guide to implementing C++ like templates in Delphi. http://community.borland.com/article/0,1410,27603,00.html * Paging Dr. WebSnap! - by Nick Hodges Using the TPagedAdapter component for fun and profit! http://community.borland.com/article/0,1410,27824,00.html * Implementing Professional Drag&Drop In VCL/CLX Apps - by Brian Long Simple intra-application drag and drop support is easy to add to a VCL/CLX application. However, customizing the operation, for example mouse sensitivity, info sent along with the operation, mouse cursor, the associated drag image, etc... All these things take more work. http://www.blong.com/Conferences/BorCon2001/DragAndDrop/4114.htm * VCL Sourcery - by Brian Long Very few Delphi Developers know the VCL source code like the back of their hand. Take a leisurely stroll through the VCL source code, removing its mystique and seeing what insights we can gain. www.blong.com/Conferences/BorConUK2001/VCLSourcery/VCLSourcery.htm * An Introduction to Kylix Open Edition - by Ray Lischner Explore Kylix Open Edition by covering topics such as selecting the Linux distribution, installation, FreeCLX issues, dbExpress, licensing, and more. www.delphimag.com/features/2001/11/di200111rl_f/di200111rl_f.asp * Media Player Autorepeat Function - by Cesario Lababidi How to write an Autorepeat Function for Mediaplayer? http://www.delphi3000.com/articles/article_2792.asp * Debugging With More Than Watches And Breakpoints - by Brian Long or How To Use The CPU Window. A BorCon UK 2001 and DCon 2001 paper. http://www.blong.com/Conferences/DCon2001/Debugging/Debugging.htm * Delphi and C++Builder Tips and Techniques - by Brian Long A BorCon 2001 paper of IDE/RTL/VCL/ObjectPascal Tips. It focuses mainly on how to be more productive within the Delphi, C++Builder and Kylix IDEs. http://www.blong.com/Conferences/BorCon2001/Tips/2106.htm * Access rights in WebSnap - by Nick Hodges How to limit access to specific pages based on a user access rights. http://community.borland.com/article/0%2C1410%2C27777%2C00.html * A database-enabled Web user list - by Jimmy Tharpe For most of us, user validation data needs to be stored in a database. Fortunately, writing a component to encapsulate this functionality is easy. (Delphi 6) http://community.borland.com/article/0%2C1410%2C27710%2C00.html * How can I get the printers installed? - by Josep Lainez Do you want to get your printer list without using the printer object? Let's see what's in the Windows registry. http://www.delphi3000.com/articles/article_2779.asp * Draw on DeskTop - by Master Tavi How to draw on DeskTop? http://www.delphi3000.com/articles/article_2773.asp * Windows Messages? - by Master Tavi How can I use Windows Message and what are they? This article explains the basics of windows messages and includes a list of the most commonly used Windows messages. http://www.delphi3000.com/articles/article_2772.asp * How to search a file for specified text? - by P. Below http://www.swissdelphicenter.ch/en/showcode.php?id=847 * How to write data directly to the printer port? - by Ramon Schenkel http://www.swissdelphicenter.ch/en/showcode.php?id=830 * How to convert TDateTime to Unix Timestamp? - by Thomas Greiner http://www.swissdelphicenter.ch/en/showcode.php?id=844 * InfoWorld interview with Borland CEO Dale Fuller who talks about competing with Microsoft for the hearts and minds of developers. http://www.infoworld.com/articles/hn/xml/01/10/19/011019hnfuller.xml * Optimizing Delphi Code - by Zarko Gajic How to make sure that the Murphy's law: "Any program will expand to fill available memory" does not apply to your Delphi applications. http://delphi.about.com/library/weekly/aa102301a.htm * Delphi 6 XML Document Programming - by Dr.Bob This is the first in a series of articles about Delphi 6 XML support starting off with XML Document Programming in Delphi 6. http://www.drbob42.com/examines/index.htm * Floating Menus, Etc. - by Bruno Sonnino How to put a menu in a toolbar so it can be detached and moved around.Plus: Setting Tab Stops in Memo and RichEdit Components. www.delphimag.com/features/2001/11/di200111bs_f/di200111bs_f.asp * User-modifiable DBGrids - by Ron Nibbelink How to provide users with highly versatile DBGrid components which can have their appearance changed at run time. www.delphimag.com/features/2001/11/di200111rn_f/di200111rn_f.asp * How to read / write a string to / from the serial port http://www.swissdelphicenter.ch/torry/showcode.php?id=841 * How to use the AnimateWindow function - by Simon Grossenbacher http://www.swissdelphicenter.ch/torry/showcode.php?id=838 * How to create an appointment in MS Outlook - by Mike Shkolnik http://www.delphipages.com/tips/thread.cfm?ID=111 * How to count words in a memo - by Ricardo Arturo Cabral Mejia http://www.delphipages.com/tips/thread.cfm?ID=109 * How to check if the BDE is installed - by Macroline Software http://www.delphipages.com/tips/thread.cfm?ID=106 * Delphi 6 Code Completion missing feature - by Brian Long How to enable an excellent new Code Completion feature in Delphi 6 http://community.borland.com/article/0,1410,27913,00.html * Is my CPU branded? / Extended CPUID How to use the extended CPUID instruction to retrieve the name of the processor from newer AMD (K5 Model 1/2/3, K6 Model 6/7/8, K6 III Model 9, Athlon & Duron) and Intel (P4) processors. http://www.delphi3000.com/articles/article_2718.asp * Exception Logger A simple way to record exceptions in a log file as well as displaying a custom error message. http://www.delphi3000.com/articles/article_2716.asp * How to add a gague to a status bar How to add a gague or any other component to a status bar. http://www.delphi3000.com/articles/article_2728.asp * How to get all table names in a database How to get all table names in a database with or without an alias. http://www.delphi3000.com/article.asp?ID=2754 * How to get BIOS date and version under Win 9X/Me/NT/2k How to get BIOS date and version under Win 9X/Me/NT/2k and how to read multi-string values from the registry. http://www.delphi3000.com/articles/article_2763.asp * Accessing Web Services from a URL How to access web services from a Delphi application. http://www.delphi3000.com/articles/article_2757.asp Components, Libraries and Applications ====================================== Freeware -------- * Orcka's Component Suite contains over 25 freeware components to aid in RAD. Most components come with demo applications and all of the source code is available. Components include: TOrckaAddinManager, TOrckaSpellChecker, TOrckaMap, TOrckaScreenSaver, TOrckaLabelEdit, TOrckaRuler, TOrckaVersionInfo, TOrckaButtonEdit, TOrckaTrayIcon, TOrckaFontButton, TOrckaLibraryLoader, TOrckaWebLabel. http://www.orcka.com/ * Synapse Serial Port Synchronous Library v.3.0 - by Lukas Gebauer Support for communicating on serial ports in blocking mode, high speed communication, same communication mechanism used in Synapse TCP/IP library, software and hardware handshake and more. http://www.ararat.cz/synapse * KDialControl An additional visual component for Kylix, encapsulates Dial Qt widget. http://www.mtu-net.ru/aborovsky/uk/progren.htm Shareware/Commercial -------------------- * CoolControls v. 3.03b, 23-Jul-2001, 5Mb - For Delphi 2-6 and BCB 1-5 Award winning package of 60+ highly advanced components and classes. Covers system, GUI and database programming, and original components. Forms of any shape, SKINS and TRANSPARENCY for ALL controls and forms, buttons of various shapes, flat borders, animation, original controls, powerful list and comboboxes, 3D view for most controls with text, multiline string grids with custom colors and fonts for cells, scrolling text, system level components. http://www.cooldev.com/coolcontrols.html * CoolMenus v. 3.08, 14-Sep-2001, 1.8Mb - For Delphi 2-6 and BCB 1-5 Award winning package that provides you with the way to create the most advanced Windows menus. CoolMenus, especially Multimedia edition has some unique features you will not find in any other menu related packages on the market. Native Delphi code, fast speed and helpful design windows are the reasons of CoolMenus popularity. http://www.cooldev.com/coolmenus.html * AppControls v 2.3.6, 01-Nov-2001 - For Delphi 2-6 and BCB 3-5 Advanced Application Controls is a set of 50+ top quality multipurpose components for Delphi and BCB. The package contains everything you need to add neat and, more important, truly professional appearance for your software, making development of great interfaces really rapid. All for those you usually spent days or weeks of hard coding, now you will be able to make for a few minutes of mouse clicking. :-) http://www.appcontrols.com/appcontrols.html * ConfigTreeView v. 1.6, 16-Oct-2001, 342Kb - For Delphi 3-6 ConfigTreeView is used to adjust the advanced options of an application, similar to the one seen in the Options dialog of MSIE. ConfigTreeView is designed for this particular purpose, adding only a very small overhead to your executables. It provides methods for loading and storing the settings. Ver 1.6 supports Windows XP themes! http://www.choosepill.com/components/cpcctree.htm Tutorials ========= * Delphi-Dolphin Will guide you through basic topics, such as form + menu design, to more advanced areas including databases, COM and customizing Delphi components. Aims to provide help and advice for budding Delphi novices & experts alike, through tutorials & articles. Includes new tutorials from Project Jedi's Jedi-Dolphin initiative. http://www.delphi-dolphin.com/ * Delphi COM Essentials - by Binh Ly Including: building a COM Client application, building a COM Server application , building COM components. http://www.techvanguards.com/stepbystep/comdelphi/ ________________________________________________________________________ If you haven't received the full source code examples for this issue, you can get them from http://www.latiumsoftware.com/download/p0028.zip ________________________________________________________________________ This newsletter is provided "AS IS" without warranty of any kind. Its use implies the acceptance of our licensing terms and disclaimer of warranty you can read at http://www.latiumsoftware.com/en/legal.php where you will also find a note about legal trademarks. Articles are copyright of their respective authors and they are reproduced here with their permission. You can redistribute this newsletter as long as you do it in full (including copyright notices), without changes, and gratis. ________________________________________________________________________ Main page: http://www.latiumsoftware.com/en/pascal/delphi-newsletter.php Group home page: http://groups.yahoo.com/group/pascal-newsletter/ Subscribe/join: pascal-newsletter-subscribe@yahoogroups.com Unsubscribe/leave: pascal-newsletter-unsubscribe@yahoogroups.com Problems with your subscription? eds2004 @ latiumsoftware.com ________________________________________________________________________ Latium Software http://www.latiumsoftware.com/en/index.php Copyright (c) 2001 by Ernesto De Spirito. All rights reserved. ________________________________________________________________________ |
The full source code examples of this issue are available for download.
![]() |
Errors? Omissions? Comments? Please contact us!






