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.lmdinnovative.com/products/vcl/lmdstoragepack/
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
eds2008 @ 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?
________________________________________________________________________
Support us! Vote for the Pascal Newsletter in The Programming Top 100!
http://top100borland.com/in.php?who=20
________________________________________________________________________
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-2006 & 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://tech.groups.yahoo.com/group/components/
Subscription:
http://tech.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://tech.groups.yahoo.com/group/software-developers/
Subscription:
http://tech.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.lmdinnovative.com/products/vcl/lmdstoragepack/
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://cc.codegear.com/Item/19663
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://articles.techrepublic.com.com/5100-10878_11-1044778.html
* 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://articles.techrepublic.com.com/5100-10878_11-5034716.html
* 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.programmingpages.com/?r=latiumsoftwarecomenpascal
http://top100borland.com/in.php?who=20
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 <eds2008 @ 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/en/file.php?id=p46
________________________________________________________________________
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? eds2008 @ latiumsoftware.com
________________________________________________________________________
Latium Software http://www.latiumsoftware.com/en/index.php
Copyright (c) 2003 by Ernesto De Spirito. All rights reserved.
________________________________________________________________________
|