Pascal Newsletter #46
The full source code examples of this issue are available for download.
![]() |
![]() |
Pascal Newsletter #46 - 21-APR-2003 Contents 1. A few words from the editor 2. Interbase Performance Guidelines (I) - Database development · Normalize your database · Primary keys · Foreign keys · Use indexes on joined columns · SQL · Correlated subqueries · Outer joins · Stored procedures · Do not use large Char's or Varchar's · BLOB's · Use client-server processing · Query plan · RDB$DB_KEY - Server Guidelines · Use a dedicated server · Use Linux or Unix as a server OS · If you have to use Windows · Use single-processor machines with InterBase · Use a dedicated hard drive · Fast disk I/O · Use a static IP on the server · Use TCP/IP as your network protocol · Don't use screen savers · Console logins · Use the same Interbase client version as your server · Overcoming disk I/O restrictions · Windows File Protection 3. Including components into a StatusBar 4. Enumerating Network Connections Detecting current network connections 5. Searching for files in Delphi 6. Inline Assembler in Delphi (VIII) - 128-bit integer arithmetic (2) 7. Forums / mailing lists 8. Delphi on the Net - Components, Libraries and Utilities · Shareware/Commercial · Freeware · Delphi updates - Articles, Tips and Tricks - Tutorials - Other Links - News ________________________________________________________________________ 1. A few words from the editor Sorry for the delay in publishing this issue. As usual, I'd like to start by thanking the authors who contributed articles for this issue: Peter Mc Leod, Alex Schlecht, Igor Siticov and Charl Linssen. I'm glad to give the prizes available for this issue to the first two: * Peter Mc Leod (Interbase Performance Guidelines) · llPDFLib v1.1 - by llionsoft, Shareware ($70, $280 with source) llPDFLib is pure Object Pascal library for creating PDF documents. Does not use any DLL and external third-party software to generate PDF files. Library consists of TPDFDocument component with properties and methods like Delphi's TPrinter but designed to generate a PDF file. http://www.llion.net/ * Alex Schlecht (Including components into a StatusBar) · LMD StoragePack - by LMD Innovative - Shareware (EUR 59) Eight components for saving/restoring of configuration data (e.g. at design time, via extended Property Selection dialog) to/from the Windows Registry or Ini-, XML- and binary files, being easy to switch between these formats. Full source code and demo projects included. http://www.ceberus.com/lmd/products/index.php3#P9 For the next issue, we have available the following prizes for two of our contributors: * SDL Component Suite 7.0 - by Software Development Lohninger ($99) The SDL Component Suite provides a wide range of components for science and engineering, e.g. math, statistics, chemistry, charts, data visualization, Fourier transform (FFT), 3D plots, geographic maps, curve fitting, etc. Available for Delphi 3-7 and BCB 4-6. http://www.lohninger.com/sdlindex.html * NTTools 7 For Delphi - by i-tivity (US$39.95) Stop battling the Windows NT Security API! Get your copy of NTTools 7 for Delphi 4/5/6/7 now and save countless hours with this collection of 40 VCL components written specifically to deal with the Windows NT Security functions. Full source code is included. http://www.i-tivity.biz/nttools.htm In the news, Borland is preparing the next release of Delphi, codename Octane, planned to be released by the end of this year. This new version will keep supporting the VCL and CLX, allowing developers to build traditional Win32 applications, but the Delphi language will also add full support for .Net and a pure .Net version of a large subset of the VCL will also be available, this way enabling developers to also build applications for the .Net platform from the same new IDE, using the Delphi knowledge and skills they already have. For more information about the next version of Delphi: - Open Letter to the Delphi Community - by Simon Thornhill http://bdn.borland.com/article/0,1410,29951,00.html - Octane and Delphi Q&A - by Anders Ohlsso http://bdn.borland.com/article/0,1410,29952,00.html If you are using Delphi 6, there is a new Update Pack for the Runtime Library. don't forget to download the new Update Pack for the Runtime Library. Delphi on the Net I hope you enjoy this issue. Regards, Ernesto De Spirito eds2004 @ latiumsoftware.com __________________ Collaborated in this issue: Dave Murray ________________________________________________________________________ Join our Delphi forum for intermediate-level Delphi programmers in Yahoo! Groups. >>>>> http://groups.yahoo.com/group/delphi-en <<<<< ________________________________________________________________________ 2. Interbase Performance Guidelines (I) By Peter Mc Leod <PeterMcLeod@practical.com.au> This article attempts to set down several guidelines on how to get the best performance out of Interbase. Before getting down to the aspects that I would recommend when designing a database to meet the needs of your clients, I would ask that you remember that usually the most expensive (in order) aspects of the project costs are: 1. Developers 2. Network 3. Server So when prioritizing your resources, keep the above in mind. Also a shortcut taken initially (such as not testing on a fully populated database) always takes at least three times as long to fix later on and costs at least three times as much. Database development ==================== Normalize your database ----------------------- No matter what database you are developing for, you have to start with a good design. Ensure that you have normalized your database to at least third normal form. Ensure that your primary keys are independent of any business objects that you are storing, and for performance reasons use an integer whenever possible (integers are 32 bits and sorted faster by most sort algorithms compared to char and varchar fields), unless you can't do that for a specific reason (such as when you need a unique identifier for replication, or when you are using a relational database to store objects). Primary keys ------------ If you define a compound primary key, more than one index is created (one is created for each column that makes up the compound key). Since the Query Optimizer will use the multiple indexes to solve a query, this can cause a bottleneck for the optimizer as the multiple indexes being used by the optimizer are the same as the fields in the query. Foreign keys ------------ Foreign keys are essentially referential integrity constraints. The problem with foreign keys is that they will create an index on the respective table, to facilitate the constraint. Normally this is not a problem, however if you have a foreign key constraint on columns that tend not to have fairly unique values, then you have a very poor index. If the Query Optimizer gets hold of these indexes then this will cause a performance bottleneck due to the poor index. In these cases, removing the indexes can increase the performance of queries by a few hundred percent. So be careful where you define your foreign keys. Use indexes on joined columns ----------------------------- An index is a balanced tree data structure that provides an improvement in sort speed for a database. Interbase indexes are direction specific (ascending or descending), so if you look back through a table you should define a descending index. Indexes work better with data that tends to have some uniqueness about it. The Interbase Query Optimizer will use indexes to speed up queries. Indexes are actually detrimental to performance when created on a column that has few unique values. Indexes slow the insertion of data into a table, as the indexes have to be recalculated. If you are going to do a large number of inserts into a table you may want to consider temporarily deactivating the indexes to minimize the performance impact (ALTER INDEX name INACTIVE), and reactivate the index after the inserts have been done (ALTER INDEX name ACTIVE). To determine the effectiveness of an index, run the following SQL statement: Select RDB$INDEX_NAME, RDB$STATISTICS from RDB$INDICES The RDB$STATISTICS value shows the effectiveness of the index. The lower the value, the better the index, with a value of one indicating a very poor index. As a general rule of thumb, you should only define a few indexes on a table (the Query Optimizer will use multiple indices to reference the same fields as needed by a query, so too many indices can degrade performance). SQL --- Certain SQL statements are slower than other SQL statements. In general avoid the use of functions like "CONTAINING", "LIKE", "<>", "COUNT" and "UPPER" as these functions will not use indexes during their operation, making them slower than other commands. The book "SQL Performance Tuning" by Peter Gulutzan and Trudy Pelzer covers in very good detail how to increase the effectiveness of your SQL statements without reference to specific proprietary functionality. I would recommend this book to anyone involved in database development. Correlated subqueries --------------------- A correlated subquery is a subquery where the conditions of the subquery are different for each row in the parent query. Because of this, the subquery needs to be executed several times (once for each row of the parent query). In some instances, a join can replace a correlated subquery and will result in a faster query execution time. Outer joins ----------- Outer joins are a reality of database programming. Left outer joins have a tendency to be slow, and an index will only be used for the resolution of the first outer join in a query. Where possible reduce the need for left outer joins. This can be done by: · Designing your tables so they are not needed · Using sub-queries (this can be faster than resolving left outer joins) · Using a Select stored procedure to increase speed Stored procedures ----------------- When creating a stored procedure that contains nested loops ensure that the outer loop returns the least possible number of records. If possible, structure your stored procedures so that the inner loops are always the fastest, as they are iterated through the most number of times. Do not use large Char's or Varchar's ------------------------------------ Before Interbase 7.0, Varchar's and Char's were padded out to the field length when being returned to the client. If you only populate part of a large varchar or char field and then return the results from the client, a large amount of network traffic is being generated, which will degrade your application's and network's performance. If possible do not use large Varchar or Char fields, or alternatively use BLOB's. A Blob also has the advantage that it is stored on it's own page in the database and thus reduces the chance of any locking occurring. Alternatively upgrade to Interbase version 7.0. BLOB's ------ A BLOB (Binary Large OBject) is a data type that supports large objects. A Blob is defined with a segment size, and in Interbase this defaults to eighty (80) bytes. If a Blob field is defined with a segment size equal to the page size of the database, then queries of blob fields become extremely fast, as only one page needs to be retrieved to return the data. Under these situations Interbase is not a bottle-neck for data transfer, other systems such as the system hardware, network etc. usually slow the data transfer rate down. Use client-server processing ---------------------------- Interbase provides a number of features that allows processing to be performed on the server (which often has more processing capacity than the client machines, and also reduces network traffic). Triggers, UDFs and Stored Procedures are all adequately detailed in the Programmer's Guide and Data Definition Guide without being detailed here. Query plan ---------- Interbase uses a cost based optimizer to optimize the execution of SQL statements. In most cases the optimizer does a very good job. Under some circumstances the optimizer does not select the best plan for performance. Be warned that if you specify your own query plan, the optimizer will not analyse your plan to ensure that it is correct. Details on when and how to adjust Interbase's query plan can be found at the following sites: * Specifying Query Access Plans in the Interbase Optimizer http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_quep * Managing your Interbase Server - by Paul McGee http://www.mers.com/MANAGE.HTML RDB$DB_KEY ---------- The rdb$db_key is a low level record identifier which is faster than primary keys for retrieving records. Rdb$db_key's are only valid for the life of the current transaction, and can't be thought of as an unchanging record identifier. It is still possible to utilize rdb$db_keys to increase performance of SQL routines in an Interbase database. The disadvantage is that this performance gain is Interbase specific. For more details on how to utilize the rdb$db_key, please refer to the documents located at the following website: * IB Documentation http://www.cvalde.com/ibDocumentation.htm Server Guidelines ================= Use a dedicated server ---------------------- A dedicated server provides the best performance for a client-server database. The cost of inadequate performance far outweighs the cost of purchasing a dedicated server. Poor performance will reflect on you as a developer and will usually result in time spent identifying, and rectifying problems. It does not take too much of your time before the cost of a dedicated server is justified. Use Linux or Unix as a server OS -------------------------------- Linux or Unix servers, have better memory and virtual memory utilisation, has a good multi-processor prioritisation model, and often requires less CPU and memory resources than other operating systems. Linux servers demonstrate impressive uptimes when compared to their Windows counterparts. Linux also does not seem to be plagued by mysterious processes which degrade performance, and which seem to disappear as soon as you log onto the server to examine the problem. Linux or Unix servers can be integrated into a Windows network with SAMBA providing a seamless environment as far as the client machines are concerned. If you have to use Windows -------------------------- Check the configuration of your Windows server to see if it is configured to provide maximum resources to file sharing or to background applications. As these options are located in different areas on different Windows machines refer to your Windows documentation. This setting can have a large impact on the performance of Interbase. Use single-processor machines with InterBase -------------------------------------------- If you are using a version of Interbase under Windows NT before version 7.0 then do not use a Multi-processor server on the Windows platform. If you do the Interbase server process will flip from processor to processor causing degradation in your Server's performance. If you do want to use Interbase (prior to version 7.0) on a multi-processor system then use a tool to tie Interbase to only one processor (there are a few of these available including one from Microsoft). However you should still be aware that since some of the earlier Windows NT operating systems have not implemented a proper SMP support model, the performance gain might not be as much as you would expect. Linux systems have proper SMP support. Use a dedicated hard drive -------------------------- If you have your Database stored on the same drive as the pagefile of a server, the increased I/O operations of the server's virtual memory operations will impact on your applications performance. Always locate your database on a separate drive. If you have the money then I would suggest that your operating system goes on one drive, your Database on another drive, and the swap file on another drive. Fast disk I/O -------------- Disk I/O operations are often a bottleneck for Database performance. IDE drives often use some of the CPU resources. Always go for the fastest SCSI systems you can afford. Skimping in this area will cost you big in terms of degraded performance. RAID systems also offer better performance than single disk systems. Aproper RAID array comprized of SCSI drives is the best solution. Use a static IP on the server ----------------------------- A static IP on the server means that the IP address of the server can be found faster, than using name address translation services. This IP should be recorded in the Server's Hosts file, and in the host files of client machines. Use TCP/IP as your network protocol ----------------------------------- TCP/IP is a connection-based protocol (packets are routed to the intended recipient rather than going to all machines) which generates less network traffic than connectionless protocol's like NetBEUI and IPX/SPX. TCP/IP is also faster than either of these protocols, and has the advantage of being available on a wider variety of platforms. Where-ever possible TCP/IP should be used to communicate with Interbase for its speed advantage. To further enhance performance it is advisable not to install multiple protocols on the network as this increases "noise" on the network. If this is unavoidable then ensuring that the network protocol that you use is first on the stack will give you more priority across the network. Don't use screen savers ----------------------- Screen savers, particularly 3GL types can be processor intensive, and will degrade system performance noticeably. In most cases screen savers are not necessary as modern monitors are designed so that the risk of screen burn in is negligible, energy saving monitors will switch themselves off and save power. If you don't have an energy saving monitor, then just turn it off, in the very least you are using less electricity and not generating as much heat in your server room. If you have to use a screen saver then the blank screen or the marquee (set the speed of the text scrolling across the screen to as slow rate to avoid excessive CPU utilisation) screen saver as these use the least amount of resources. Console logins -------------- Many people tend to use Windows NT/2000 as they are more familiar with the Windows operating system. If you do use Windows NT, then don't unnecessarily log into the server, or stay logged in. Apart from being a security issue, leaving the server logged in allows process to run in the background, which can degrade the server's performance. Even background processes can use 20-30% of the server's resources. There are numerous tools that allow you to maintain your Interbase server without the need to have the server continuously logged in. Use the same Interbase client version as your server ---------------------------------------------------- If you have an outdated version of Interbase Client Installed on your client machine, compared with version installed on your Server you may be suffering a performance hit. Tests with Interbase 5.1 and 5.6 can demonstrate a performance difference of slightly more than 50% by using an outdated client installation. Also newer features may not be available if you are not using the same client and server versions and program errors could result (in some cases this can cause your Interbase Server to crash and possibly corrupt your database). Overcoming disk I/O restrictions -------------------------------- It is possible to reduce the problem of disk I/O operations in Interbase. After having performed a backup and restore, create a temporary table in the database (using Blob fields or large Varchar columns). Populate this table with a large amount of data. Then drop the temporary table and sweep the database. This means that Interbase will reclaim the space inside the database during operations, and will not have to ask the OS for disk space until the empty space inside the database has been reclaimed. This increases the speed of the write operations to the database, as disk I/O is essentially not a limiting factor. Windows File Protection ----------------------- Some versions of Windows (Windows XP) have implemented Windows file protection mechanisms for files with the .GDB extension (Interbase database). If you are using a Windows Operating System greater than Windows 2000 you may wish to experiment with de-activating Windows File Protection or renaming your database to have a different extension (for Interbase Database greater than 7.0 or Firebird 1.5). The cynical amongst us might wonder if Microsoft did this to reduce the performance of Interbase in comparison to Microsoft's own database SQL Server? ________________________________________________________________________ When was the last time you voted for the Pascal Newsletter? Please support this initiative voting for us in The Programming Top 100! http://www.sandbrooksoftware.com/cgi-bin/TopSite2/rankem.cgi?id=latium ________________________________________________________________________ 3. Including components into a StatusBar By Alex Schlecht http://www.bombus-software.de The TStatusbar usually does not allow you to place components on itself. But sometimes it would be very useful to add -for example- a TProgressBar on a Statusbar. This Article shows how to add components to a TStatusbar and how to fit it into one of the Statusbar-Panels. There are (at least) two ways to add Components on your Statusbar: 1) Create your own Statusbar-Object ----------------------------------- Create your own Statusbar and allow adding components to it. This is possible by overriding the Create constructor: type TMyStatusBar = class(TStatusBar) public constructor Create(AOwner: TComponent); override; end; implementation constructor TMyStatusBar.Create(AOwner: TComponent); begin inherited Create(AOwner); ControlStyle := ControlStyle + [csAcceptsControls]; // that's all! end; That's all! Now this component accepts other components as "children" and you can place them at design-time onto the StatusBar! But I don't like this way very much because you have to use this new component. I prefer to use the "old" component by manipulating it a little bit. So let's have a look at my favourite way: 2) "Adopt" the other component ------------------------------ The simplest way to include components in a StatusBar is to adopt the components! Place the TStatusbar on your Form, and also place the ProgressBar (or other component you wish to include on your StatusBar) on the form(!). Then do this in the Form's OnShow event: ProgressBar1.Parent := StatusBar1; ProgressBar1.Top := 1; ProgressBar1.Left := 1; Now the ProgressBar is "adopted" by the StatusBar. But unfortunatley it doesn't look very nice because the ProgressBar is larger than the panel and the position is not correct. So we have to determine the exact position of the ProgressBar by using the StatusBar's Border, Width and Height properties (we have to add this code to the OnShow event of the form because in the OnCreate event no handles are avalible). uses CommCtrl; procedure TForm1.FormShow(Sender: TObject); var r : TRect; begin StatusBar1.Perform(SB_GETRECT,0,integer(@R)); // Determine the size of panel 1 // SB_GETRECT needs Unit CommCtrl // 0 = first panel of StatusBar; 1 = the second and so on. ProgressBar1.Parent := StatusBar1; // Adopt the ProgressBar ProgressBar1.Top := r.Top; // Set size of the... ProgressBar1.Left := r.Left; // ...ProgressBar to... ProgressBar1.Width := r.Right - r.Left; // ...fit within the... ProgressBar1.Height := r.Bottom - r.Top; // ...panel end; Now the ProgressBar fits exactly into the first panel of the StatusBar! If you want to use the second or another panel, you only have to change the parameter of the "Perform" command. Comments and improvements are welcome! Alex Schlecht ________________________________________________________________________ Vote for the Pascal Newsletter in The Programming Pages! http://www.programmingpages.com/?r=latiumsoftwarecomenpascal ________________________________________________________________________ 4. Enumerating Network Connections Detecting current network connections By Igor Siticov SiComponents: http://www.sicomponents.com How to detect current network connections? From the MS-DOS prompt, you can enumerate the network connections (drives) by using the following command: net use Programmatically, you would call WNetOpenEnum() to start the enumeration of connected resources and WNetEnumResources() to continue the enumeration. The following sample code enumerates the network connections: procedure TForm1.Button1Click(Sender: TObject); var i, dwResult: DWORD; hEnum: THANDLE; lpnrDrv, lpnrDrvLoc: PNETRESOURCE; s: string; const cbBuffer:DWORD = 16384; cEntries: DWORD = $FFFFFFFF; begin dwResult := WNetOpenEnum(RESOURCE_CONNECTED, RESOURCETYPE_ANY, 0, nil, hEnum); if dwResult <> NO_ERROR then begin ShowMessage('Cannot enumerate network drives.'); Exit; end; s := ''; repeat lpnrDrv := PNETRESOURCE(GlobalAlloc(GPTR, cbBuffer)); dwResult := WNetEnumResource(hEnum, cEntries, lpnrDrv, cbBuffer); if dwResult = NO_ERROR then begin s := 'Network drives:'#13#10; lpnrDrvLoc := lpnrDrv; for i := 0 to cEntries - 1 do begin if lpnrDrvLoc^.lpLocalName <> nil then s := s + lpnrDrvLoc^.lpLocalName + #9 + lpnrDrvLoc^.lpRemoteName + #13#10; Inc(lpnrDrvLoc); end; end; end else if dwResult <> ERROR_NO_MORE_ITEMS then begin s := s + 'Cannot complete network drive enumeration'; GlobalFree(HGLOBAL(lpnrDrv)); break; end; GlobalFree(HGLOBAL(lpnrDrv)); until dwResult = ERROR_NO_MORE_ITEMS; WNetCloseEnum(hEnum); if s = '' then s := 'No network connections.'; ShowMessage(s); end; __________________ Igor Siticov is the author of TsiLang Components Suite (a full set of professional components for building elegant, useful and user friendly multilingual applications in two minutes) and Resource Builder (a full featured RC script visual editor that can be a cool replacement for the standard Borland Image Editor and Borland Resource WorkShop for creating and editing resource files), by SiComponents: www.sicomponents.com ________________________________________________________________________ 5. Searching for files in Delphi By Charl Linssen Hello reader! For a project of mine, I needed a procedure that would search a directory and all its subdirectories for me, and show all of the files inside. I thought I'd be able to find a procedure like this on the Internet, but I couldn't find one which was suited. So, I decided to write my own. Here it is: Const MAXFILES = 1000; var CurrSearchedDir: Array [1..MAXFILES] of String; OriginalPath, OldSearchedDir: String; InSubDir: Boolean = False; CurrInstance: Integer; [...] procedure search(BasePath:String); var DirInfo: TSearchRec; I:Integer; begin Inc(CurrInstance); If InSubDir then CurrSearchedDir[CurrInstance] := OldSearchedDir + '\' + CurrSearchedDir[CurrInstance-1]; FindFirst(BasePath+'\*', faDirectory, DirInfo); repeat If (DirInfo.Name = '.') or (DirInfo.Name = '..') then Continue; If (ExtractFileExt(DirInfo.Name) <> '.html') and not ((DirInfo.attr and faDirectory) = faDirectory) then Continue; // Remove above line when you want to search for any file. if (DirInfo.attr and faDirectory) = faDirectory then Begin InSubDir := True; OldSearchedDir := CurrSearchedDir[CurrInstance]; CurrSearchedDir[CurrInstance] := DirInfo.Name; Search(BasePath + DirInfo.Name + '\'); Continue; End; frMain.ListBox1.Items.Add(OriginalPath + CurrSearchedDir[CurrInstance] + '\' + DirInfo.Name); Until FindNext(DirInfo) <> 0; Dec(CurrInstance); end; As you can see upon closer examination of this procedure, it is recursive. This means that it calls itself. It does so when it has found a subdirectory and needs to search that subdir for files and possibly other subdirectories. This makes the procedure suited for as many subdirectories as needed. Have fun! -- Charl ________________________________________________________________________ 6. Inline Assembler in Delphi (VIII) - 128-bit integer arithmetic (2) By Ernesto De Spirito In the source code example (attached) you'll find the implementation of some functions to operate with the Hugeint data type that was introduced in the past issue. The purpose is to exemplify the instructions we've seen so far along with some new ones: BT (Bit Test): BT dword ptr [eax], edx --> CF = value of the EDXth bit in the memory pointed by EAX BTS (Bit Test and Set): BTS dword ptr [eax], edx --> sets to 1 the EDXth bit in the memory pointed by EAX CF = previous value of that bit BTR (Bit Test and Reset): BTR dword ptr [eax], edx --> sets to 0 the EDXth bit in the memory pointed by EAX CF = previous value of that bit BTC (Bit Test and Complement): BTC dword ptr [eax], edx --> toggles the value of the EDXth bit in the memory pointed by EAX CF = previous value of that bit We won't reproduce the functions here since you can find them in the source code attached, but we'll show different possible implementations of the function _IsNeg, simply to provide more examples of the instructions we've seen so far: function _IsNeg(x: Hugeint): boolean; // Result := x < 0; // if x < 0 return True (1) else return False (0) // Parameters: EAX = @x asm mov eax, [eax+_3_] // EAX := High order 32 bits of x shr eax, 31 // AL := High order bit of EAX (sign bit) end; function _IsNeg(x: Hugeint): boolean; asm cmp dword ptr [eax+_3_], 0 // if x[3] < 0 then jl @@negative // goto @@negative mov al, 0 // Result := False; ret // exit; @@negative: // @@negative: mov al, 1 // Result := True; end; function _IsNeg(x: Hugeint): boolean; asm // set the Sign Flag and then put it in AL mov eax, [eax+_3_] // EAX := High order 32 bits of x or eax, eax // SF := Sign bit of EAX // alt.: add eax, 0 // also: sub eax, 0 // also: and eax, eax // also: and eax, -1 // or any negative value // also: test eax, eax // also: test eax, -1 // or any negative value sets al // AL := SF; // Sign Flag // alt.: lahf; shr ax, 31 // also: lahf; rol ax, 1; and al, $1 end; function _IsNeg(x: Hugeint): boolean; asm // set the Carry Flag with the Sign Bit to put it in AL mov eax, [eax+_3_] // EAX := High order 32 bits of x bt eax, 31 // CF := Sign bit of EAX // alt.: shl/rol/rcl eax, 1 setc al // AL := CF; // Carry Flag // alt.: mov al, 0; rcl, 1 // also: mov al, 0; adc al, al // also: lahf; mov al, ah; and al, $1 // also: lahf; ror/rcr/shr/sar ax, 1; shr al, 7 // also: lahf; ror/shr/sar ax, 8; and al, $1 // also: lahf; rol ax, 8; and al, $1 // also: lahf; rcl ax, 9; and al, $1 end; function _IsNeg(x: Hugeint): boolean; asm // set the Parity Flag and then negate it in AL mov al, [eax+_3_+3] // EAX := High order 8 bits of x or al, $7F // PF := Not Sign bit // alt.: and eax, $80000000 setnp al // AL := Not PF; // Not Parity Flag // alt.: lahf; rol/shl ax, 6 / rcl ax, 7; xor al,-1 / not al; and al, $1; // also: lahf; ror/shr/sar ax, 10 / rcr ax, 11; xor al,-1 / not al; and al, $1; end; In the next part we'll see functions to add, subtract, multiply and divide huge integers. ________________________________________________________________________ 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/ ________________________________________________________________________ 7. Forums / mailing lists To join any of our forums, the best way is to subscribe from the web, since that way you'll be able to access the features available at the web site (like changing your subscription options, viewing the past messages, accessing the files section, etc.). A Yahoo! ID is required for that, 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 can also subscribe by email (you'll only have email access). * Delphi: If you know a lot about 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 experts are also welcome :-) http://groups.yahoo.com/group/delphi-en/ Subscription: http://groups.yahoo.com/group/delphi-en/join delphi-en-subscribe@yahoogroups.com * Kylix: Kylix programming. http://groups.yahoo.com/group/KylixGroup/ Subscription: http://groups.yahoo.com/group/KylixGroup/join KylixGroup-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/ Subscription: http://groups.yahoo.com/group/components/join components-subscribe@yahoogroups.com * Software Developers: This is a forum for discussions about software development and to share experience in the work, professional or commercial environments. It is not a programming forum, matters treated here are supposed to be more general or language independent. http://groups.yahoo.com/group/software-developers/ Subscription: http://groups.yahoo.com/group/software-developers/join software-developers-subscribe@yahoogroups.com ________________________________________________________________________ Delphi BUGS? Chatch & Log every BUG showing Unit, Class, Method, Line #. http://www.eurekalog.com/bannerclick.php?id=15 ________________________________________________________________________ 8. Delphi on the Net By Dave Murray <irongut @ vodafone.net> Components, Libraries and Utilities =================================== Shareware/Commercial -------------------- * LMD StoragePack - by LMD Innovative - Shareware (EUR 59) Eight components for saving/restoring of configuration data (e.g. at design time, via extended Property Selection dialog) to/from the Windows Eegistry or Ini-, XML- and binary files, being easy to switch between these formats. Full source code and demo projects included. http://www.ceberus.com/lmd/products/index.php3#P9 Freeware -------- * Mozilla v1.3 - by mozilla.org Mozilla 1.3 is now available for download. First there was image blocking, then came pop-up blocking and now we have junk-mail filtering. Mozilla 1.3 also offers image auto-sizing, newsgroup filters, dynamic profile switching, nearly 2000 bug fixes, and more. http://www.mozilla.org/ * Compile Time Expert v1.12 - by Vit Kovalcik (with source) Compile Time is expert, which generates small file right before compilation. You can include this file in some of your units and easily use time of compilation stored in this file. http://www.fi.muni.cz/~xkovalc * Local Heap Memory Manager v1.0 - by Carsten Zeumer (with source) A Delphi memory manager replacement which allows you to limit the memory available to your application. Helps in finding memory holes in your components or to simmulate low memory conditions. http://www.torry.net/vcl/system/memory/localheapmm.zip * TOpacityForm v1.6.0 - by Vjacheslav Maslov (with source) Allows you to create transparent form. You can change transparency at runtime. Uses Layered technology so only Win2k and later supported. http://www.torry.net/vcl/forms/effects/opcform.zip * JG's TIMDBImport v1.02 - by JustGuy (with source) Native Delphi class for importing data from The Internet Movie Database and process it. Including search results and movie info. http://www.torry.net/vcl/internet/other/imdbimport.zip * TVortex OpenSource IRC v2.8.5 - by JoepezT (w. source) (DELPHI/KYLIX) OpenSource IRC components, includes: TVortexIRC for IRC connectivity; TClusterFile for handling incoming files; TClusterChat for handling incoming/outgoing DCC chats; Identd Server for auth services. http://www.berzerk.net * yEnc into a String - by Joao Barata (with source) (DELPHI/KYLIX) Converts a file into a string, which can be imported to TStringList. http://b-tools.hopto.org Delphi Updates -------------- * Update: Delphi 6 RTL Update Pack 3 A fix for frame streaming is available for download. This update pack is not cumulative, so you need to have installed the General Update and the Update Pack 2 before applying this update. http://community.borland.com/article/0,1410,29932,00.html * Update: StarTeam integration for Delphi 6, 7 and C++Builder 6 Get access to the functionality of StarTeam directly from within the IDE with these new plug-ins (for owners of purchased products). http://community.borland.com/article/0,1410,29831,00.html Articles, Tips and Tricks ========================= * Sip from the Firehose: CodeWright - by David I About the new Borland CodeWright Product Group. http://community.borland.com/article/0,1410,29854,00.html * Non-Rectangular Translucent Forms - by Philippe Randour How, on Windows 2000/XP, you can easily add a non-standard UI to your application by taking advantage of translucency and transparency. http://community.borland.com/article/0,1410,29579,00.html * Sip from the Firehose: Borland Wins Three Jolt Awards - by David I http://community.borland.com/article/0,1410,29882,00.html * Using Semaphores in Delphi: Part 1 - by Cary Jensen Semaphores are like mutexes on steroids. Not only can they coordinate multiple threads and process, but they can permit more than one simultaneous lock. This article shows how to use these useful objects in a multithreaded environment. http://community.borland.com/article/0,1410,29908,00.html * Registering DLL and ActiveX controls from code - by Zarko Gajic How to register and unregister OLE controls such as DLLs or ActiveX Controls from a Delphi application. http://delphi.about.com/library/weekly/aa040803a.htm * How to convert a WideString to a String? http://www.swissdelphicenter.ch/en/showcode.php?id=1692 * How to know if a form already exist before you dynamically create it? http://www.swissdelphicenter.ch/en/showcode.php?id=1693 * Pointer to variant - caution! http://www.swissdelphicenter.ch/en/showcode.php?id=1450 * How to create a database at run-time with ZEOS? http://www.swissdelphicenter.ch/en/showcode.php?id=1552 * How to enable/disable cut, copy, paste, clear of a TEdit? http://www.swissdelphicenter.ch/en/showcode.php?id=1700 * How to use a format parameter more than once? http://www.swissdelphicenter.ch/en/showcode.php?id=1690 * How to insert text at a Bookmark (MS Word)? http://www.swissdelphicenter.ch/en/showcode.php?id=1691 * How to create an Access Database? http://www.swissdelphicenter.ch/en/showcode.php?id=1695 * How to copy/paste TStringGrids cells to/from ClipBoard? http://www.swissdelphicenter.ch/en/showcode.php?id=1696 * How to Get the image size of a JPG, GIF and PNG image file? http://www.swissdelphicenter.ch/en/showcode.php?id=1698 * Determine whether the computer supports hibernation, the sleep states? http://www.swissdelphicenter.ch/en/showcode.php?id=1699 * How to get the language of MS Word? http://www.swissdelphicenter.ch/en/showcode.php?id=1688 * How to locate on a non-indexed field in a TTable? http://www.swissdelphicenter.ch/en/showcode.php?id=1348 * How to add records to TStrings (TTreeview / TListview)? http://www.swissdelphicenter.ch/en/showcode.php?id=1482 * How to convert a ADO Recordset to XML and the reverse way? http://www.swissdelphicenter.ch/en/showcode.php?id=1498 * How to create a TListView which automatically resorts by column click? http://www.swissdelphicenter.ch/en/showcode.php?id=1500 * How to stretch a bitmap? http://www.swissdelphicenter.ch/en/showcode.php?id=1566 * How to rotate the text in a StringGrid cell by 90°? http://www.swissdelphicenter.ch/en/showcode.php?id=1596 * How to change the OnClick behavior of a TRadioButton, TCombobox? http://www.swissdelphicenter.ch/en/showcode.php?id=1609 * How to combine two icons? http://www.swissdelphicenter.ch/en/showcode.php?id=1636 * How to save a TImagelist with all its images to a file? http://www.swissdelphicenter.ch/en/showcode.php?id=1626 * How to show a indeterminate ProgressBar in Win XP? http://www.swissdelphicenter.ch/en/showcode.php?id=1680 * How to search a directory tree for a specified file? http://www.swissdelphicenter.ch/en/showcode.php?id=1654 * How to align Text in a TRichEdit? http://www.swissdelphicenter.ch/en/showcode.php?id=1655 * How to detect whether a file's volume is NTFS? http://www.swissdelphicenter.ch/en/showcode.php?id=1657 * How to sort a Stringlist with the CustomSort Method? http://www.swissdelphicenter.ch/en/showcode.php?id=1664 * How to read/write REG_DWORD values from/to the Registry? http://www.swissdelphicenter.ch/en/showcode.php?id=1665 * How to get notified when the user changes the theme (XP)? http://www.swissdelphicenter.ch/en/showcode.php?id=1669 * How to store a TDateTime in the registry? http://www.swissdelphicenter.ch/en/showcode.php?id=1670 * How to Convert method pointers into function pointers? http://www.swissdelphicenter.ch/en/showcode.php?id=1671 * How to Get / Set the Clipboard text (without using VCL)? http://www.swissdelphicenter.ch/en/showcode.php?id=1677 * How to convert a WideString to a String? http://www.swissdelphicenter.ch/en/showcode.php?id=1692 * How to know if a form already exists before you dynamically create it? http://www.swissdelphicenter.ch/en/showcode.php?id=1693 * How to do a 2D Convolution on an Image? http://www.swissdelphicenter.ch/en/showcode.php?id=1704 * How to capture a Delphi CLX Form? http://www.swissdelphicenter.ch/en/showcode.php?id=1708 * Creating a System Restore Point - by Thomas Stutz How to create and cancel system restore points. http://www.delphi3000.com/articles/article_3575.asp * TEdit that damn background - by Matt Harrison Using WMEraseBkGnd to create a TEdit descendant that is transparent or has a background. http://www.delphi3000.com/articles/article_3576.asp * Introduction to SSL - by Eugene Mayevski Why SSL and how it works. http://www.delphi3000.com/articles/article_3577.asp * Certificate basics - by Eugene Mayevski Key management can be an issue in security-related tasks. Certificates define a standard way of managing keys and associated information. They are also used in SSL/TLS protocol and S/MIME. http://www.delphi3000.com/articles/article_3578.asp * How to store and retrieve GIF,BMP + JPG in a RDBMS - by Marcello Dias http://www.delphi3000.com/articles/article_3579.asp * Add task job - by Smile xiao Add a scheduled task job to your system. http://www.delphi3000.com/articles/article_3582.asp * Complete TFTP Server example, using Indy components - by Kim Sandell Example of multi-thredded TFTP Server, using Indy components. http://www.delphi3000.com/articles/article_3583.asp * Retrieve DSN names and ODBC Drivers list - by Oscar Noe Martin http://www.delphi3000.com/articles/article_3584.asp * No, You're not crazy Sql Server doesnt have generators - Marcello Dias How to make a 'Work around' on this limitation. http://www.delphi3000.com/articles/article_3586.asp * An Application Loader with a TCPServer - by Max Kleiner We had the requirement starting different Delphi apps from a linux or windows server, wherever you are. We call it Delphi Web Start (DWS). http://www.delphi3000.com/articles/article_3588.asp * Drawing a Shaded Rectangle - by Serhiy Perevoznyk Using GradientFill API function. http://www.delphi3000.com/articles/article_3591.asp * Bitmap Rotation - by Serhiy Perevoznyk Rotate a Bitmap Image in 90-Degree Increments. http://www.delphi3000.com/articles/article_3592.asp * Drawing Transparent Bitmaps - by Serhiy Perevoznyk http://www.delphi3000.com/articles/article_3593.asp * Alpha Blending a Bitmap - by Serhiy Perevoznyk http://www.delphi3000.com/articles/article_3594.asp * Simple example for the COMPOSITE Design Pattern - by Jochen Fromm What is the Composite Design Pattern? How do you copy a directory with all subdirectories in a simple way? http://www.delphi3000.com/articles/article_3595.asp * Get and use Sender properties, typecast it - by Steen Pedersen How to use the Senders Properties. http://www.delphi3000.com/articles/article_3596.asp * Get FullPath Application of Any Object - by Gilberto Saraiva http://www.delphi3000.com/articles/article_3597.asp * Add Line into the end of a file - by Gilberto Saraiva http://www.delphi3000.com/articles/article_3598.asp * Mouse Moviment Limiting - by Gilberto Saraiva If you want limit the mouse region, use this procedure. http://www.delphi3000.com/articles/article_3599.asp * How to disable the TreeView Hint - by Gilberto Saraiva http://www.delphi3000.com/articles/article_3600.asp * OpenGL II: moving and rotating 2D shapes - by Eber Irigoyen This article shows you some basic movement and rotating and also tries to explain how openGL works. http://www.delphi3000.com/articles/article_3603.asp * Improve Interbase Client Server Performance - by Peter Mc Leod How do you get the best out of your Interbase Client Server System? http://www.delphi3000.com/articles/article_3606.asp * language for MS Office - by Mike Shkolnik How to read the default language of installed MS Office application? http://www.delphi3000.com/articles/article_3607.asp * PHP Alike implode & explode functions for Delphi - by Ronald Buster Implode returns a string containing the elements of a string array in order with a glue string between each element. Explode is the reverse. http://www.delphi3000.com/articles/article_3609.asp * OutlookExpress Directorie - by Ronald Buster How to find the OutlookExpress mailbox dir. http://www.delphi3000.com/articles/article_3611.asp * Ms Access LastinsertID - by Ronald Buster Retrieve the last insert id of the autoincrement field in Access. http://www.delphi3000.com/articles/article_3612.asp * OpenGL III: Moving and rotating 3D shapes - by Eber Irigoyen How to rotate around a shape's axis or rotate around another object. http://www.delphi3000.com/articles/article_3617.asp * Retrieve Current User and Domain Names on Win NT - Serhiy Perevoznyk How to retrieve the Current User and Domain Names on Windows NT using security functions within the Win32 API. http://www.delphi3000.com/articles/article_3618.asp * How to use TClientDataset as memory dataset - by Mike Shkolnik http://www.delphi3000.com/articles/article_3619.asp * Extended Mapi - by Tommy Andersen Accessing the Extended Mapi interface is not allways trivial. This component helps a quite a bit with this problem. http://www.delphi3000.com/articles/article_3620.asp * Simple way to rotate region - by Nik Ozniev http://www.delphi3000.com/articles/article_3623.asp * Understanding Threads - by Subha Narayanan http://www.delphi3000.com/articles/article_3624.asp * Setting File Summary Information - by Serhiy Perevoznyk How to set File Summary Information for non Office files (NTFS). http://www.delphi3000.com/articles/article_3625.asp * Give Me the Details or File Summary Info - by Serhiy Perevoznyk How to retrieve File Summary Information for non Office files (NTFS). http://www.delphi3000.com/articles/article_3626.asp * D7 ActiveX Web deployment bug workaround - by Robert White A workaround for Delphi 7 bug that disables Web Deployment. http://www.delphi3000.com/articles/article_3628.asp * Removing the popup menu in Flash .OCX with Delphi 4 - by Miguel Lucero Removing the popup menu in Macromedia Flash .OCX with Delphi 4. http://www.delphi3000.com/articles/article_3630.asp * OpenGL IV: Texture mapping - by Eber Irigoyen Texture mapping: The process of applying an image to a primitive. Texture mapping is often used to add realism to a scene. For example, you can apply a picture of a building facade to a polygon representing a wall. This article shows how to do texture mapping so your 3D objects become more realistic. http://www.delphi3000.com/articles/article_3631.asp * Making a reliable drawing procedure (random numbers) - Martin Strand How to make sure the same field/name/whatever is not drawn twice? http://www.delphi3000.com/articles/article_3632.asp * DOC to PRN - by Eddie Shipman Creating PRN file from MS Word DOC File. This works with the Word97 components and to make it work with the Word2000 components, some function calls and parameters must be changed. http://www.delphi3000.com/articles/article_3633.asp * Display a Property dialog for file, folder or drive - by Mike Shkolnik http://www.delphi3000.com/articles/article_3634.asp * HTML Dialog Boxes - by Wes Mess Using the ShowHTMLDialog function. http://www.delphi3000.com/articles/article_3635.asp * A Pragmatic Book for Programmers of Any Level - by Brian Kotek If you ever thought it would be great to have a veteran developer answer all of your methodology questions, take a look at this book. Appropriate for all experience levels it explains the development process from a language-neutral perspective. It's one of my favourite books and it includes some examples in Pascal as well as C and Java. http://builder.com.com/article.jhtml?id=u00320030317BXK01.htm * Deciding Between mySQL and SQL Server - by Sanders Kaufman, Jr. MySQL may be free but what if money isn't the only determining factor? Find out how these two database heavyweights stack up against each other and how to decide which one to use as your database system. http://builder.com.com/article.jhtml?id=u00320030318SKJ01.htm * Relational Databases: Inspiration Behind The Theory - by Susan Harkins Discover the origin of the modern relational data model and what every developer should know about this theory. Also, find out what the most important step is toward creating an efficient and flexible database. http://builder.com.com/article.jhtml?id=u00320030402ssh01.htm * Four Things to Consider Before Upgrading to .NET v1.1 - Tim Landgrave Architects and developers will need to consider four key areas that have changed from v1.0 v1.1 of the .NET Framework. These areas are newly integrated features, new functionality, compatibility issues, and security changes. http://builder.com.com/article.jhtml?id=u00320030409lan02.htm * Fast and Furious Guide to MySQL Database Engines - Sanders Kaufman Jr What if you were a racecar driver and could swap engines with the flip of a switch instead of having to make a trip to the garage? The MySQL database does something like this for developers; it gives you a choice of database engines and an easy way to switch them. Let's look at how you choose the engine and how to change between engines that are available to you. http://builder.com.com/article.jhtml?id=u00320030407SKJ01.htm * Tweak Oracle Data Buffers to Cache Entire Databases - Donald Burleson This advanced Oracle article explores the internal mechanisms of the Oracle data buffers, the RAM that Oracle uses to prevent unnecessary rereads of data blocks from disk. Understanding how data buffers operate is an important key to successfully using them in performance tuning an Oracle database. http://builder.com.com/article.jhtml?id=u00320030408brl01.htm Tutorials ========= * Nesting DataSets in ClientDataSets - by Cary Jensen Like the name suggests, a nested dataset is a dataset within a dataset. By nesting one dataset inside another, you can reduce your overall storage needs, increase the efficiency of network communications, and simplify data operations. http://community.borland.com/article/0,1410,29825,00.html * Writing Robust Code - by Pedro Agulló Soliveres There are many subtle issues to be aware of when it comes to ensuring code correctness and robustness: this article examines some of these issues, with a special emphasis on contract-based programming. http://www.thedelphimagazine.com/samples/1599/1599.htm * Connection Closed Gracefully - by Chad Z. Hower http://www.swissdelphicenter.ch/en/showarticle.php?id=1 * Introduction to Web Development with Delphi - by Hadi Hariri http://www.swissdelphicenter.ch/en/showarticle.php?id=2 * Introduction to sockets - by Chad Z. Hower http://www.swissdelphicenter.ch/en/showarticle.php?id=3 * Introduction to Indy - by Chad Z. Hower http://www.swissdelphicenter.ch/en/showarticle.php?id=4 * Building Kylix Applications: Indy Chapters - by Chad Z. Hower http://www.swissdelphicenter.ch/en/showarticle.php?id=5 * IntraWeb: Implementing a "Hello World" application - Atozed Software http://www.swissdelphicenter.ch/en/showarticle.php?id=6 * IntraWeb Tutorial: User Input - by Atozed Software http://www.swissdelphicenter.ch/en/showarticle.php?id=7 * Creating Oracle User-Defined Aggregate Functions - by Beth Bowden By creating your own aggregate functions, you can extend Oracle's functionality and encourage code reuse in your applications. Find out how easy it is to add this skill to your repertoire. http://builder.com.com/article.jhtml?id=u00320030401adm01.htm * Download Builder.com's 'Remedial XML' series - by Lamont Adams Six-part series, which started with the basics of XML and moved on through data validation and parsers now available to download complete with all the code in either DOC or HTML format. http://builder.com.com/article.jhtml?id=u00320020717adm01.htm * Relational Databases: Inspiration Behind The Theory - by Susan Harkins Trying to use an RDBMS without applying relational database theory to your design is like trying to drive a standard transmission without using the clutch: you're not going to get very far. This series of articles shows how to apply relational rules and develop an efficient design that protects the validity of your data. The series starts with a look at the origins of the relational data model. http://builder.com.com/article.jhtml?id=u00320030402ssh01.htm * Relational Databases: Using Normal Forms to Create Databases - by Susan Harkins Developers have certain rules, known as normal forms, that they follow to create well-designed databases. This article examines normal forms through the creation of a simple database for storing information about a collection of books. http://builder.com.com/article.jhtml?id=u00320030409ssh01.htm * Relational Databases: Applying the First Normal Form - Susan Harkins The normal forms are so abstract that some developers have trouble figuring out how to apply them. Perhaps the best way to understand the normal forms is to start applying them to data, since rules tend to make more sense when you actually have data to divide. This article works through applying the 1NF rule, which is initially the most complicated to apply, to a sample book catalog database. http://builder.com.com/article.jhtml?id=u00320030416ssh01.htm * Relational Databases: Achieving Normalization - by Susan Harkins The last installment of this series began with a single table and worked through making it conform to 1NF. This table wound up becoming four tables. this article finishes the normalizing process by applying 2NF, 3NF and BCNF. http://builder.com.com/article.jhtml?id=u00320030423ssh01.htm Other Links =========== * Pascal Newsletter: Mozilla Sidebar - by Dave Murray Our latest feature for Mozilla and Netscape 6+ users is a sidebar that lets you keep up to date with the latest issue of the newsletter while you browse the web. Just visit our website and click the 'add sidebar' button on the right-hand side of most pages. http://www.latiumsoftware.com/en/index.php * Pascal Newsletter: Opera Hotlist Panel - by Dave Murray Our latest feature for Opera 7 users is a hotlist panel that lets you keep up to date with the latest issue of the newsletter while you browse the web. Just visit our website and click the 'add hotlist panel' button on the right-hand side of most pages. http://www.latiumsoftware.com/en/index.php * Get Set for .NET with Borland launch events - by Anders Ohlsson http://community.borland.com/article/0,1410,29953,00.html * Built With Delphi - by Baltic Solutions Provides a list of all quality commercial, shareware and freeware products that have been developed using Delphi. http://www.balticsolutions.com/bwd/ * Mastering Delphi 7 - by Marco Cantu At the end of February, Sybex released Marco Cantu's latest book, Mastering Delphi 7. To learn more about its contents, differences from the previous version and download the source code visit Marco's site. http://www.marcocantu.com/md7 * Project JEDI Alliance Program Recently a number of people have approached Project JEDI, interested in having their projects become part of JEDI. The Steering Group announces the JEDI Alliance Program and provides guidelines for projects interested in joining. http://www.delphi-jedi.org/Jedi%3AADMIN_JEDI_ALLIANCE%3A441740 * Complete ASCII Table http://www.asciitable.com * The Latest Builder.com Technology Use Survey - by Lamont Adams http://builder.com.com/article.jhtml?id=u00320030331adm02.htm News ==== * Open Letter to the Delphi Community - by Simon Thornhill Simon Thornhill writes about the next Delphi release. http://community.borland.com/article/0,1410,29951,00.html * Octane and Delphi Q&A - by Anders Ohlsson Q&A about the future of Delphi. http://community.borland.com/article/0,1410,29952,00.html * Blog with Delphi and Borland news http://svd.blogspot.com/ * Delphi / InterBase WebLog - by Craig Stuntz News of interest to Delphi and InterBase developers. http://delphi.weblogs.com/ * News Digest: Update for Borland Customers An analyst news digest for Borland Customers. http://community.borland.com/article/0,1410,29848,00.html * Your Future: Delphi 8 OCTANE - by Zarko Gajic Octane is the code name for the next release of your favorite RAD tool. For the 8th anniversary of Delphi, Borland is preparing the most significant Delphi release: Octane will continue to provide VCL and CLX development for Win32 and Linux as well as new features and continued framework, compiler, IDE, and design time enhancements. http://delphi.about.com/cs/delphifornet/a/aa041703a.htm * SwissDelphiCenter NewsFeed Get the 10 most recent programming tips and developer news from SwissDelphiCenter as an RDF NewsFeed file. With the RDF file you can integrate the tips into your website or use them with a newsticker. http://www.swissdelphicenter.ch/en/newsfeed.php ________________________________________________________________________ Vote for the Pascal Newsletter in The Programming Pages! http://www.programmingpages.com/?r=latiumsoftwarecomenpascal ________________________________________________________________________ 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. Don't forget we also need articles for this newsletter and there is a prize for some of the authors in each issue. All articles will be considered but we are particularly interested in articles about Kylix because there is so little available online to help Kylix developers. Send articles to <eds2004 @ latiumsoftware.com>. We are also looking for shareware authors who would like to offer their components or applications as prizes for articles in the newsletter. In return you will be promoted in this newsletter and the Latium Software web site. For more information contact Dave <irongut @ vodafone.net>. ________________________________________________________________________ If you haven't received the full source code examples for this issue, you can get them from http://www.latiumsoftware.com/download/p0046.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 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) 2003 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!






