Pascal Newsletter #33
The full source code examples of this issue are available for download.
![]() |
![]() |
Pascal Newsletter #33 - 04-MAR-2002 INDEX 1. A FEW WORDS FROM THE EDITOR 2. IN THE NEWS - Delphi 6 Update Pack 2 available - PocketStudio 1.1 - Name changes - Borland to support .NET - Vote for Borland! - Delphi Informant Magazine Readers Choice Awards 2002 - RAD Windows Database Development Survey - Antique Software: Turbo Pascal v5.5 - Borland updates the End User License Agreements - VCL Scanner Web Service - Programming Contest: Multi-threaded applications 3. HOW TO PROTECT YOUR SOFTWARE AGAINST PIRACY 4. SAVE POSITIONS OF TCOOLBAR BANDS 5. GOING UNDERCOVER IN DELPHI 6. SHOWING WINDOWS "OPEN FOLDER" DIALOG 7. FORUMS 8. DELPHI ON THE NET - Components, Libraries and Utilities . Shareware/Commercial . Freeware - Articles, Tips and Tricks - Tutorials - Other Links ________________________________________________________________________ 1. A FEW WORDS FROM THE EDITOR Hello folks, Well - my first newsletter. I got the job from Ernesto, the guy that did this before me. That is - now we do it together. I hope I will do a good job. If you want to comment on that, feel free to send me a message to the email address shown below. Also, you can submit good articles and links. We need you to improve this newsletter! As a reward, in the next issue we'll be giving away a license of Greatis Print Suite, a set of components for print and preview, provided by Greatis Software: http://www.greatis.com/printsuite.htm Charl Linssen 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. IN THE NEWS Delphi 6 Update Pack 2 available ================================ The second Update Pack is available for all editions of Delphi 6 (including the Open Edition) at www.borland.com/devsupport/delphi/downloads/ds_registeredusers.html It is recommended that you download and install this patch (you don't need to have installed the Update Pack 1). The Update Pack fixes some problems with Delphi 6 and contains some little enhancements, but users of the Professional Edition will find this Update Pack will allow them to build client-side applications that consume W3C-compliant Web Services using SOAP, XML, WSDL and more! If you want to learn more about this Update Pack: http://community.borland.com/article/0,1410,28405,00.html PocketStudio 1.1 ================ Pocket Technologies, Inc. announces a new version of PocketStudio, their Delphi-like IDE for Palm OS development, that now comes in 3 editions: - PocketStudio Professional Version 1.1 (Download Only).... $ 199.99 - PocketStudio Professional Version 1.1 (Training Included) $ 249.99 - PocketStudio Standard version 1.1 (Download Only)........ $ 59.99 For more information, visit http://www.pocket-technologies.com Name changes ============ Developer 21 is now vpsource.com, and Kylix Developer Network is now CodeBake.com: * vpsource.com Portal for webmasters and programmers (Delphi, C++, VB, Pascal), also vp webdesign and programming services, e-store. Many more! http://www.vpsource.com * CodeBake.com A website designed for developers to exchange and share resources and information about Kylix, Delphi and Linux. CodeBake.com's mission is to provide quality information to the developer community by sharing information and resources so that everyone can benefit. http://www.codebake.com Borland to support .NET ======================= Last February 12, Borland announced Delphi and C++Builder will support the Microsoft .NET Framework during the second half of 2002. These RAD tools will support the Microsoft Intermediate Language (MSIL), allowing developers to preserve their investments in RAD skills and source code. * Borland .NET strategy http://www.borland.com/net/ * Borland Unveils Product Strategy for Microsoft .NET Platform Announces Delphi and C++Builder Support for Microsoft .NET Platform http://www.borland.com/about/press/2002/net_platform.html Vote for Borland! ================= The Web Services Journal (http://www.sys-con.com/webservices/) is taking votes for the First Annual WSJ Readers' Choice Awards. You can vote for your favorite Web Services products in 17 categories: http://www.sys-con.com/webservices/readerschoice If you want to know which Borland products are nominated, and even vote for them all together, go to http://www.borland.com/vote_borland.html Delphi Informant Magazine Readers Choice Awards 2002 ==================================================== The Delphi Informant Magazine (http://www.delphizine.com/) is also taking votes for their 2002 Readers' Choice Awards. You can vote for your favorite components and utilities in 21 categories: http://www.delphizine.com/ballot2002/Default.asp RAD Windows Database Development Survey ======================================= Borland is conducting a customer survey about database development support for their Windows RAD tools. Your answers would help Borland guide their future efforts in support for database development in Delphi and C++ Builder. It's just a simple questionnaire: http://infopoll.net/Live/surveys/s15713.htm Antique Software: Turbo Pascal v5.5 =================================== Yes, that's right. The old and beloved Turbo Pascal 5.5 is now available for free download from Borland's web site: http://community.borland.com/article/images/20803/tp55.zip To learn more: http://community.borland.com/article/0,1410,20803,00.html Borland updates the End User License Agreements =============================================== Last January 15th, Borland acknowledged the End User License Agreements (EULAs) of the newest Borland products (Delphi 6, C++Builder 6, Kylix 2 and JBuilder 6) was specific to major enterprise customers that buy licenses in volume, very much forgetting individuals and companies that buy licenses individually. Last February 13th Borland published the new EULAs, which supersede the previous ones: http://community.borland.com/article/0,1410,28401,00.html VCL Scanner Web Service ======================= This is a Web Services version of the VCL Scanner, the application that generates a VCL class usage report based on the Delphi and C++ Builder executables, DLLs and packages found on your hard disk. The source code of this new version, both for the client and the server, is available for download, and by using the program and sending the report to Borland you get a chance to win a license of a Borland product! http://community.borland.com/article/0,1410,28438,00.html Programming Contest: Multi-threaded applications ================================================ The rules are easy: you have until March 29th to submit a multi-threaded application (with full source code) that provides visual feedback of the thread progress. You can develop it using any Borland development tool. You can participate with as many submissions as you want. Submissions should be posted to Borland's CodeCentral: //codecentral.borland.com/codecentral/ccweb.exe/contest?contest_id=1 For more information about this contest: http://community.borland.com/article/0,1410,28448,00.html ________________________________________________________________________ Greatis Print Suite Pro - An extremely convenient set of VCL components which provides advanced print and preview features into Delphi and C++ Builder applications. Forget BeginDoc, EndDoc, NewPage and other low- level printing procedures, just draw your print job and Print Suite will handle the rest! >>>>>>>> http://www.greatis.com/printsuite.htm <<<<<<<< ________________________________________________________________________ 3. PROTECTING YOUR SOFTWARE AGAINST PIRACY By Fernando Martins <fmp.martins@megamail.pt> Before I start, let me tell you that whatever protection system you use it's just a matter of time until someone breaks it. So what you must have in mind is: "what is the best protection system for this special case?" You also must have in mind that the best you got is still breakable. Once I needed to develop an application where preventing piracy was a must. I did some investigation and found out what were the possible systems to prevent this. I also did some investigation on how to break those same protection systems. Let me say that I got a bit disappointed. I thought that mass protection systems would be better than they are... Here's a summary of what I found among the most common: - Anti-Copy: prevents the disk copy, CD in this case. - Disk check: when application starts up checks for the original disk, CD in this case. - Hardware check-up: you plug-in some hardware on your RS-232 port and check for it in your application from time to time. - Key activation: the software requires a key to be activated. Here's what I found out about breaking these systems: - Anti-Copy: can be broken with a "clone copy" (bit-by-bit) of the disc... - Disk check: can be broken with a "clone copy" also... - Hardware check-up: read too much complains about it interfering with the system, and it also generates too much calls into your help-line, plus read somewhere that this can be fooled through software also... - Key activation: once the user registers, he can spread the key among friends and everybody can activate the application. If someone takes some time, he can break the code and create a patch to ignore activation or create a key generator. Looking at this, you must agree that it didn't look too good... After thinking a while on each of these systems I concluded that: - Anti-Copy: to easy to break. - Disk check: to easy to break. - Hardware check-up: causes to much troubles and can make customers to become unsatisfied. - Key activation: would be great if key proliferation could be stopped. So I stick on the key activation idea and gave it a second thought, exploiting the pros and cons of this system. I simulated the regular use of this system to better understand it: 1. Get the product 2. Install the product 3. Request key 4. User requests the key 5. User gets the key 6. User activates the product Here's another way to do it: 1. Get the product from friend 2. Install the product 3. Request key 4. User asks friend for friend's key 5. User uses the friend's key I concluded that it was definitely the best - having in mind what I needed to protect this specific product - if I could prevent the key from spreading. Preventing key spreading became my next goal. I knew I needed something that could give me guarantees that the application being activated was a legal copy and not a pirate one. How could I guarantee this? How do you prove that what you own is legal? How do you prove that you bought something? The answer was easy: invoice. Every product sold comes with an invoice, which has different data, like the invoice number, date and entity sold to. My next step was using the invoice data when activating the product. But invoice data "per se" was not enough, I mean, if someone gives a copy of the product can also give the invoice data to activate the product. I simulated the piracy process again, using the invoice data: 1. Get the product from friend 2. Install the product 3. Request the invoice data 4. User requests the invoice data from friend 5. Request the key 6. User requests the key from friend Now, this has the same hole that usual key activation has... I knew that I needed to force the key request for all installed products. That became my next goal. How could I force the user to request a new key? After some more neuron work, I came up with the answer: time. On my simulations, both users, the legal an non-legal, did the same steps to activate the product, but they didn't do it at the same time... Time is continuous and non-repeating, so time was the answer. What did I do with time then? Basically, I generated a key using it. To activate the product you must have a key, which is generated using the invoice data and the time you have installed the product in the system. Here's how I made it work: 1. After product installed, an encryption of the current time - year, month, day, hour, minute, second, millisecond - is saved somewhere in the system. This is easy to do and there's a lot of ways to hide something is the system. 2. Invoice data request. 3. Generate a "request-key" using the time from 1. and the invoice data from 2. 3. Inform the user that it must request the activation key for the "request-key". 4. Key for product activation request. I had found the solution. To request the activation key, the user must specify what is the "request-key", which is guaranteed to be unique, since time is involved and the algorithm I used makes sure of that. ;) Here's a simulation of the legal case: 1. Buy product and receive invoice 2. Install the product 3. Request invoice data 4. Inform user what the "request-key" is 5. User requests the activation key referring the "request-key" and the invoice data 6. User receives the key 7. User activates the product It's quite simple, really, the only "visible" change from the original key activation system is the "request-key" that the user must specify when requesting the key. But this is just half the solution, the other half is you controlling the number of installations. But that is quite easy. Every time a key is requested, you know who is requesting it, since the invoice data is specified, so if you got a customer that has 154 key requests in one month, there's something wrong... :) I've also exploit the possible holes on the system: 1. A couple of non-legal installations may be done, the customer - or "customer friend" - may say that the system crashed and must reinstall... That will just work for a couple of non-legal installations, since you may ask why that is the 98th key request done this week or the 3rd this day... 2. Disk clone can be done. There are tools on the market that clone hard-disks. But what the heck, you cannot prevent that. 3. Someone takes some time and patches the security or creates a key generator. Like said in the beginning, there's no way to prevent this... This system does not work just as a piracy stopper, it also prevents it. When the invoice data is requested, it's more unlike to someone to give it away, since you can track the customer that gave the invoice data to a friend, that gave it to a friend, that gave it to a friend... The original customer knows he can get troubles with the law by giving that information. If you get some "customer" requesting its 10th activation key because "We got a new computer that is faster and want the application running on it.", you can say "Why have you bought 9 computers in the last 4 weeks?..." If you get some "customer" requesting its 50th activation key because "the system crashed and need to reinstall everything", you can say "Maybe there's something wrong, I'll send someone there to take a look at it. Please have your invoice in hand..." If you get some "customer" requesting its 154th activation key, you can say that unless proven to be the legal owner of the product you will not give the activation key... The "customer" may say he is - he even can be -, but unless he has the invoice, he cannot prove it... And if you want to be a bit "nasty", you code a special key that will show the "Do you know that non-legal software may give you 3 years in jail?" and uninstalls the application from the system... The "customer" will get the point. ;) __________________ Editor's note: Before you make any comments on this article, please read it twice. The author does never claim his solution is original, that his is the ultimate or the best solution, that this solution is applicable or convenient to all cases, or that this solution is unbreakable... ________________________________________________________________________ Join our Delphi forum for intermediate-level Delphi programmers in Yahoo! Groups >>>>> http://groups.yahoo.com/group/delphi-en <<<<< ________________________________________________________________________ 4. SAVE POSITIONS OF TCOOLBAR BANDS By Patrick de Kleijn http://www.patrick.nl/ This was fun to do. Yesterday's Delphi3000.com Newsletter #76 dropped a line on a reader's request for functions to restore the positions of TCoolBand objects at run-time. Lacking a property to check how many band are in place (something like CoolBar.Bands.Count) I thought of another way to test if all bands are stored. I have included the properties that tend to change mostly (Index and Width) but it's easy to add other properties to the Set and Get clauses which I marked in the comments. Parse all available coolbands and write their properties to file: Store(CoolBar1, 'c:\coolbar1.ini'); Parse all available coolbands and check for their properties by matching IDs: Restore(CoolBar1, 'c:\coolbar1.ini'); procedure Store(aCoolBar: TCoolBar; aFilename: string); var I, ID: Integer; aFile: TStringList; begin I := 0; ID := 0; aFile := TStringList.Create; { Parse all available coolbands } while I=I do // Make this an endless loop begin try ID := aCoolBar.Bands.Items[I].ID; except { Raise an EAbort exception to break out of the endless loop when properties of all coolbands are written to file. We know all coolbands are parsed when EListError is raised if we try to collect properties of a coolband that does not exist } on EListError do begin { All done? Save! } aFile.SaveToFile(aFilename); aFile.Free; Abort; // Crack the loop with EAbort end; end; { Write it's properties to file - Set } aFile.Add(IntToStr(ID) + 'Index=' + IntToStr(aCoolBar.Bands.Items[I].Index)); aFile.Add(IntToStr(ID) + 'Width=' + IntToStr(aCoolBar.Bands.Items[I].Width)); I := I+1; end; end; procedure Restore(aCoolBar: TCoolBar; aFilename: string); var I, ID, J: Integer; aFile: TStringList; begin I := 0; ID := 0; aFile := TStringList.Create; aFile.LoadFromFile(aFileName); { Parse all available coolbands } while I=I do begin try ID := aCoolBar.Bands.Items[I].ID; except on EListError do Abort; end; { Restore properties from file - Get } aCoolBar.Bands.Items[I].Index := StrToInt(aFile.Values[IntToStr(ID)+'Index']); aCoolBar.Bands.Items[I].Width := StrToInt(aFile.Values[IntToStr(ID)+'Width']); I := I+1; end; // Result := True; end; Enjoy! Regards, Patrick de Kleijn The Netherlands ________________________________________________________________________ 5. GOING UNDERCOVER IN DELPHI By Charl Linssen By default, your application has a corresponding button in the taskbar. You can switch to it using the [Alt] + [Tab] combination, and it shows in the 'Close Program' window (when you press [Alt] + [Ctrl] + [Del]). Suppose you don't want your application to show there, suppose you want to hide it completely from the user. In this tutorial I'll give you some code snippets to show you how that is done. >> Disable task switching You can block [Alt] + [Tab] task switching, as well as other key combinations like [Ctrl] + [Esc] using the SystemParametersInfo API. This tricks Windows into thinking the screensaver is running. procedure SystemKeys(Disable: Boolean); var OldVal : LongInt; begin SystemParametersInfo (SPI_SCREENSAVERRUNNING, Word(Disable), @OldVal, 0); end; After a call to SystemKeys(True) the program runs, but you are unable to Alt-Tab to it nor switch to it in the task list. You can't invoke the Start button, either. >> Hiding the application's taskBar button A major part in going undercover, is hiding your application's button from the taskbar. That can be solved easily, by inserting the following code into the OnCreate event: procedure TForm1.FormCreate(Sender: TObject); begin ShowWindow(Application.Handle, SW_HIDE); SetWindowLong(Application.Handle, GWL_EXSTYLE, GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW ); ShowWindow(Application.Handle, SW_SHOW); end; >> Hide from the 'Close Program' box Now that you've hid you app from task switching and the taskbar, it can still be terminated, using the 'Close Program' box. That can be solved _really_ easily. To do so, you have to remove your programs title, which normally also shows in the taskbar button. That is done like this: procedure TForm1.FormCreate(Sender: TObject); begin Application.Title := ''; end; When you combine these things and add a 'Form1.Hide', there's no way that app is going to shut down (except when the computer is rebooted, of course). ________________________________________________________________________ 6. SHOWING WINDOWS "OPEN FOLDER" DIALOG By Ernesto De Spirito If you want to show the standard Open Folder dialog, you have to call the API SHBrowseForFolder. I've seen components that encapsulate the API call, but I really don't like to plug more and more components into my Delphi IDE when the tasks could be easily implemented as functions in a unit, so here you have a function BrowseForFolder which encapsulates the complexities of the call to SHBrowseForFolder: Syntax: function BrowseForFolder(Title: string; RootCSIDL: integer = 0; InitialFolder: string = ''): string; Parameters: Title: The caption of the label on the top of the Open Folder dialog window RootCSIDL (optional): The CSIDL of the special folder that defines the subtree to browse. By default, it's the Desktop (CSIDL_DESKTOP = 0), but you can limit the tree the user can browse using constants like CSIDL_DRIVES, CSIDL_NETWORK, CSIDL_PERSONAL, CSIDL_PROGRAMS and in general you can use any other value accepted by the API SHGetSpecialFolderLocation (see the unit ShlObj). InitialFolder (optional): The folder initially selected in the treeview. By default it's the root folder (specified by the RootCSIDL parameter, or the desktop if omitted). Return value: The function returns the full path of the folder selected by the user. It returns the empty string ('') if the user canceled the dialog. Compatibility: The function is compatible with the Shell 4.0 version of Shell32.dll, so it doesn't require IE 4.0 or superior. Sample calls: Folder := BrowseForFolder('Select destination folder:'); Folder := BrowseForFolder('Select destination folder:', CSIDL_DRIVES); ShowMessage('Selected folder: "' + BrowseForFolder( 'Select destination folder:', 0, 'C:\Delphi') + '"'); The source code of the function is included in the example attached to this newsletter. ________________________________________________________________________ 7. 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 570 members and last February it had a nice level of traffic with almost 250 messages: 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 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. The forum is rather new and currently counts with a bit more than 100 members and almost no messages: http://groups.yahoo.com/group/components I hope you join the forum to help us build a larger group. You can subscribe from the web or --more easily-- by email: http://groups.yahoo.com/group/components/join components-subscribe@yahoogroups.com ________________________________________________________________________ 8. DELPHI ON THE NET By Dave Murray Components, Libraries and Utilities =================================== Shareware/Commercial -------------------- * Self-Extracting Archive Utility (SEAU) SEAU binds and compresses a group of files into a single, professional and self-contained installation program. It supports uninstallation, multiple languages, shared files, interface customization, license agreements, readme files, file associations, batch operations, multiple disk spanning, DLL installation, automated installations, patches, expiration dates, and much more. http://www.gammadyne.com/seau.htm Freeware -------- * Encryption and security software - By Uri Fridman Uri Fridman invites us to try his freeware applications and give him some feedback (bug, comments, suggestions, ideas). http://www.geocities.com/urifrid/soft.html * TDirectoryDialog v1.7 - by Aivar, FREEWARE with source (KYLIX) Displays a modal dialog box for selecting directory. Call Execute to show dialog, selected directory is stored in DirName property. http://www.torry.net/kylix/clx/dialogs/directorydialog.zip * PBFolder Dialog v4.0, FREEWARE with source Browse for folder dialog that can create new folders. The New button caption and a Label caption (above the path) are automatic localized every time the application runs. Also includes a localized error-message if a new folder could not be created. http://www.ciemmesoft.com/componenti/categorieing.asp?ID=11&PAG=1 * TicButton v.1.0.0.1 - by Halfpenny Software, FREEWARE Button images are Up, Down and Disabled and you can change the button state at run time. Transparent colour is set to pixel 1,1 colour. http://www.icarus.surf3.net/ * TicButtonA v.1.0.0.1 - by Halfpenny Software, FREEWARE As TicButton above but with a 'Roll' image, displayed when the cursor is over the button. http://www.icarus.surf3.net/ * TicSbutton v1.0.0.1 - by Halfpenny Software, FREEWARE On mouse down the image changes and a wav sound is played, when cursor enters the image it rolls over. Images are Up, Down, Disabled and Roll and you can change the button state at run time. http://www.icarus.surf3.net/ * TicSButtonA v1.0.0.1 - by Halfpenny Software, FREEWARE As TicSButton above but with Transparent colour set to the pixel 1,1 colour for each image. http://www.icarus.surf3.net/ * TicBGimage v1.0.0.2 - by Halfpenny Software, FREEWARE Sets an image that can be Stretch or Tiled as a backdrop for the form or placed in a Panel. The Image can be set to transparent. http://www.icarus.surf3.net/ * Best Random Generator v1.0 - by Anton Zhuchkov, FREEWARE with source Passes all of the tests for random number generators with a period of 2^144. Completely portable - gives bit identical results on all machines with 24-bit+ mantissas in the floating point representation. The algorithm is a combination of a Fibonacci sequence and an "arithmetic sequence" (using subtraction). http://www.torry.net/vcl/science/other/rmar.zip * NC OCI8 v1.0.0 - by Dmitry Arefiev, FREEWARE with source Component library for direct access to Oracle8i. Includes 7 core components and 3 advanced. http://www.da-soft.com/ * PsvDialogs v2.0 - by Sergiy Perevoznik, FREEWARE with source Library of Windows Dialog components based on undocumented Windows functions. 17 dialogs include: Add Hardware, Browse Folder, Change Icon, Control Panel, Format, New Shortcut, Organize Favorites, Run. http://www.torry.net/vcl/dialogs/stddialogs/psvdialogs.zip * KWizard v1.6 - by Wei Yu, FREEWARE with source Fully customizable, easy to use wizard construction kit. http://members.rogers.com/wyu66/index.htm Articles, Tips and Tricks ========================= * Adding Custom HTML to your TAdapterPageProducers Provides a component framework and sample components for adding custom HTML as child components to TAdapterPageProducers. http://community.borland.com/article/0,1410,28205,00.html * Microsoft ComCtrls and Delphi / C++Builder v6 - by Eddie Churchill Eddie Churchill describes the pitched battle to maintain compatibility with the XP version of ComCtrls and discusses Themes. http://community.borland.com/article/0,1410,28423,00.html * System Tray Delphi application - quick and easy - by Zarko Gajic Placing Delphi applications in the System Tray in easy steps. The perfect place form programs that are left running for long periods of time with no user interaction. http://delphi.about.com/library/weekly/aa121801a.htm * Delphi dot NET - by Zarko Gajic As Borland unveils product strategy for Microsoft's NET platform, a Delphi developer should find out what .NET is and what the future of Delphi will be! http://delphi.about.com/library/weekly/aa021902a.htm * Indy Step by Step Part 1 - by Romeo Lefter Part 1: Overview of TCP/IP and Indy. http://www.delphi3000.com/articles/article_3049.asp * Indy Step by Step Part 2.1 - by Romeo Lefter Part 2.1 Overviw of TIdTcpServer Component. http://www.delphi3000.com/articles/article_3050.asp * Making 'Safe' ActiveX items for use in HTML Pages - by Scott Price Actions required to make ActiveX/COM Objects safe for use in Internet Explorer without "Control may be unsafe for use" dialogs. http://www.delphi3000.com/articles/article_3053.asp * Delphi trick for implementing VB's Control Arrays - by Malek Badi A trick for implementing "arrays of components" similarly to VB's "Control Arrays" allowing access to controls on a form via an index. http://www.delphi3000.com/articles/article_3056.asp * Enhanced Tray Icon and Task Bar Component - by Stewart Moss How can I hide the program icon on the TaskBar under Win2000 / WinNT? http://www.delphi3000.com/articles/article_3057.asp * Extra Color codes for Delphi - by Stewart Moss Nice list of color codes. http://www.delphi3000.com/articles/article_3058.asp * Why use Assembler? - by Max Kleiner Why use Assembler code and a general understanding of what is meant by instantiation, null pointer and register memory allocation. http://www.delphi3000.com/articles/article_3059.asp * Impersonating a User on WinNT - by Stewart Moss How to simulate Unix SU command under WinNT and run an application as a different user. http://www.delphi3000.com/articles/article_3061.asp * Some useful Windows NT API functions - by Stewart Moss http://www.delphi3000.com/articles/article_3062.asp * Easy Shareware limitation - Liquid Snake How to determine the number of times an application has been run using the registry. http://www.delphi3000.com/articles/article_3063.asp * Static property of a class in Delphi - Ya Xiang How to implement a static property like the C++ static member. http://www.delphi3000.com/articles/article_3064.asp * Indy Step by Step Part 2.2 - by Romeo Lefter Part 2.2. The TIdTCPServer in detail. http://www.delphi3000.com/articles/article_3065.asp * Get images (GIF/JPG) dimensions - by Khai Vuong Quang Get width and height of GIF/JPG images stored as arrays of bytes. Optimized to use within server apps. http://www.delphi3000.com/articles/article_3066.asp * Read the text of TEdit from another application - by Maarten de Haan How to read the text in a TEdit from another application, even if you only see ****. Eg. the TEdit containing internet address from MS-IE. http://www.delphi3000.com/articles/article_3067.asp * Overriding Registration exports from COM In-Process Automation Server or ActiveX OCX Control - by Scott Price How to perform additional work during the Registration routines of a COM In-Process Automation Server or OCX Control. Eg. to create additional registry keys relating to your configuration settings. http://www.delphi3000.com/articles/article_3068.asp * Implementing 'Drag Scrolling' in a Grid - by Duncan Parsons When dragging an object over a grid, if the cell you require is not visible it would be useful to have the grid automatically scroll to bring the cell into view (a kind of drag-hot-tracking). Excel can do it, let's make a humble TStringGrid do it. Builds on information given in the article ID 3039. http://www.delphi3000.com/article.asp?id=3069 * Indy Step by Step Part 3 - by Romeo Lefter Part 3: Building the client. http://www.delphi3000.com/articles/article_3070.asp * NULL Values in a DBGrid - by Andreas Schmidt How to display and modify NULL-Values in a DBGrid. http://www.delphi3000.com/articles/article_3071.asp * TOP ADO programming TIPS - by Zarko Gajic The last chapter of this ADO tutorial is a collection of frequently asked questions, answers, tips and tricks about ADO programming. http://delphi.about.com/library/weekly/aa021202a.htm * TOP 10 Delphi - by Zarko Gajic Most popular Delphi Programming articles on delphi.about - Feb 2002. http://delphi.about.com/library/weekly/bltop10.htm * The fastest path to Delphi localization - by Zarko Gajic How to change the captions on [Yes], [No], [Cancel] and similar buttons that appear on dialog and message boxes in Delphi applications. Plus how to personalize error, warning and other messages in those dialogs. http://delphi.about.com/library/weekly/aa020502a.htm * Technique for handling mouse actions - by William Egge A paint program requires that the mouse do different things depending on what mode you are in. Want a clean way to handle all those mouse actions without cluttering your form code? http://www.delphi3000.com/articles/article_3045.asp * Smart threads with a central management - by Erwin Molendijk Want to fire up some threads in your application, let them do some time consuming stuff and then report the results to the user? This causes some synchronisation trouble. Shutting down while threads are still running, updating the user interface... This unit gives a good basis to avoid all kinds of multi-threading trouble using a TSmartThread class and SmartThreadManager object http://www.delphi3000.com/articles/article_3046.asp * TSmartThread: Using blocking Indy sockets in a thread - E Molendijk An example on how to use the SmartThreadLib (article 3046). Provides a class called TTCPSmartThread that contains some basic routines to perform TCP communication using blocking sockets. http://www.delphi3000.com/articles/article_3047.asp * Support for Windows Visual Styles API in your controls - by A Abdulin http://www.delphi3000.com/articles/article_3048.asp * How to use Strings in a Case Statement? - by Loïs Bégué http://www.swissdelphicenter.ch/torry/showcode.php?id=1028 * How to calculate the factorial of a given number? - by Loïs Bégué http://www.swissdelphicenter.ch/torry/showcode.php?id=1026 * How to copy Files to the Windows clipboard? - by Thomas Stutz http://www.swissdelphicenter.ch/torry/showcode.php?id=1038 * How determine the minimum margins for a printer? - by Thomas Stutz http://www.swissdelphicenter.ch/torry/showcode.php?id=1039 * How to get all the Permutations of a String? - by Fatih Ölçer A permutation is an arrangement of n objects arranged in groups of size r without repetition, where order is important. Example: Find all two-letter permutations of the letters "ABC" Answer: AB AC BA BC CA CB http://www.swissdelphicenter.ch/torry/showcode.php?id=1032 * Additional dbExpress driver options - by John Kaster List of third-party dbExpress drivers culled from newsgroups. http://community.borland.com/article/0,1410,28371,00.html * HTML Stylesheets - by Rick Spence Why and how to use stylesheets in the HTML that Delphi CGI apps return as well as avoiding some of the tedium of stylesheets. //www.delphimag.com/features/2002/03/di200203rs_f/di200203rs_f.asp * How to detect if Alt, Shift, Control are pressed? - by Thomas Stutz http://www.swissdelphicenter.ch/torry/showcode.php?id=1002 * How to set TListBox Items right aligned? - by Rainer Kümmerle http://www.swissdelphicenter.ch/torry/showcode.php?id=1023 * How to rename a directory? - by Thomas Stutz http://www.swissdelphicenter.ch/torry/showcode.php?id=1024 * How to create a Font Combo Box with OwnerDraw - by Florin Stroiescu Display the names of system installed fonts in a combo box drawn with in the actual font. http://www.delphi3000.com/articles/article_3033.asp * MDI application without annoying ScrollBars - by Rafael Cotta How to create a MDI app without scrollbars (like MS-Word) when a child form is moved outside main form area. http://www.delphi3000.com/articles/article_3035.asp * How to export a dataset to Excel - by Steven van Els How to make the VBA parameters visible for the end-user when exporting a dataset to Excel. http://www.delphi3000.com/articles/article_3037.asp * Published Objects in Components - by Duncan Parsons How to make properties which have object subproperties drop-down in the Object Inspector in Delphi 6. http://www.delphi3000.com/articles/article_3039.asp * Unsigned 64 bit Integer support - by Erwin Molendijk This article presents a new unsigned 64 bit integer type: UInt64. Also two routines to convert between UInt64 and strings. http://www.delphi3000.com/articles/article_3040.asp Tutorials ========= * Get to know the Delphi 6 container classes - by Bob Swart A container stores a number of items in a useful way. A collection stores of a list of items but a container adds special meaning to the way the items are stored. Eg. a component list, ordered list, stack, and queue - very handy if you know where to find them and use them. http://www.techrepublic.com/ article.jhtml?id=r00820020204swa01.htm&page=1&vf=tt Other Links =========== * Delphi Search Engine and Directory Delphi search engine for websites and newsgroup. Delphi link collection. http://www.neuber.com/delphi * vpsource.com Portal for webmasters and programmers (Delphi, C++, VB, Pascal), also vp webdesign and programming services, e-store. Many more! http://www.vpsource.com * CodeBake.com A website designed for developers to exchange and share resources and information about Kylix, Delphi and Linux. CodeBake.com's mission is to provide quality information to the developer community by sharing information and resources so that everyone can benefit. http://www.codebake.com ________________________________________________________________________ YOU CAN HELP US We need your help to keep this newsletter going and growing. You can help by referring the newsletter to your colleagues: http://www.latiumsoftware.com/en/pascal/delphi-newsletter.php Or you can help by voting for us in some or all of these rankings to 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 mean a lot to us. ________________________________________________________________________ If you haven't received the full source code examples for this issue, you can get them from http://www.latiumsoftware.com/download/p0033.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) 2002 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!






