Pascal Newsletter #37 - 15-JULY-2002
INDEX
1. A FEW WORDS FROM THE EDITOR
2. THE FUTURE OF THE BDE
3. UNDOCUMENTED: DETECT IF AN APPLICATION HAS STOPPED
4. INLINE ASSEMBLER IN DELPHI (II) - ANSI STRINGS
5. DATABASE FIND DIALOG
6. FORUMS
7. DELPHI ON THE NET
- Components, Libraries and Utilities
. Shareware/Commercial
. Freeware
- Articles, Tips and Tricks
- Tutorials
- Other Links
________________________________________________________________________
1. A FEW WORDS FROM THE EDITOR
First of all, we'd like to thank Thomas Stutz for contributing a very
interesting article to the newsletter, and we are please to award him a
license of SMImport, a component suite to convert data from all popular
formats, provided by Scalabium: http://www.scalabium.com/smi/index.htm
We have two prizes for the next issue:
* AnyShape Transpack v2.0 - by MindBlast Software (DELPHI + KYLIX)
Tired of boring, rectangular windows? Welcome to the exciting world of
transparent, weirdly shaped windows! An instant facelift for your GUI.
What took hours before can now be done in seconds without writing a
single line of code. Features: WYSIWYG editing, design-time preview,
automatic dragging, REAL stay-on-top forms, combine regions and
load/save regions from file. Cross-platform. Shareware, $30.00.
http://www.mindblastsoftware.com/?page=transpack&ref=PascalNL
* Developer Information Library (DIL) CD - by UK Borland User Group
Over 17,000 Tips, Tricks, FAQs and Technical Articles · Patches and
Updates for Borland Tools · Over 4000 Components & Tools · Over 4000
Bitmaps ready to use with another 20000 zipped · Over 350 ready to use
JavaScripts · Complete Set of Linux How-tos · and much much more...
http://www.richplum.co.uk/dil/index.asp
We'd like to remind our Portuguese- and Russian-speaking subscribers
that we have a version of this newsletter in your language:
* Boletim Pascal - Portuguese
http://br.groups.yahoo.com/group/boletim-pascal/
Subscription:
http://groups.yahoo.com/group/boletim-pascal/join
boletim-pascal-subscribe@yahoogrupos.com.br
* Pascal Newsletter - Russian Edition
http://groups.yahoo.com/group/pascal-newsletter-ru/
Subscription:
http://groups.yahoo.com/group/pascal-newsletter-ru/join
pascal-newsletter-ru-subscribe@yahoogroups.com
All right, now let's get on with the newsletter.
Regards,
Charl Linssen and Ernesto De Spirito
eds2008 @ latiumsoftware.com
__________________
Collaborated in the edition of this issue: Dave Murray.
________________________________________________________________________
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
________________________________________________________________________
2. THE FUTURE OF THE BDE
By Ernesto De Spirito <eds2008 @ latiumsoftware.com>
The BDE was not "depredacted", but "deprecated". Sorry for the typo in
the editor's note of the last issue. I guess I'll be more careful from
now on to avoid being "predated" by the subscribers. ;-)
Now let's get to business. After Borland's official announcement
regarding the future of the BDE, I contacted (and was contacted by) many
Delphi developers who are currently using the BDE, to learn about their
future plans regarding data access.
For local databases, the BDE will keep being used, although a discrete
minority are seriously considering switching to a BDE alternative in the
short term (mainly third-party data access components, and also
Interbase accessed thru IBX or dbExpress).
For server databases, the scenario changes radically. Among those who
are still using previous Delphi versions, many are not likely to
upgrade, so they'll keep using the BDE + SQL Links all they can, while
almost all the rest are considering mainly dbExpress, and also ADO and
ADO.Net, but developers showed their concerns about these alternatives:
- dbExpress is not as "universal" as SQL Links, meaning there are
missing drivers for some important database servers (like Microsoft
SQL Server).
About dbExpress being faster than the BDE, this is not true for small
queries beacuse there's no caching mechanism (since there is no front
layer like the BDE), so the metadata gets downloaded in every query.
I'd like to credit Vasilis Devletoglou for sharing his findings about
the inner workings of dbExpress with us.
Finally, when one used a technology for many years, sometimes it's a
bit difficult not be a bit conservative and consider new technologies
as "beta". We all know dbExpress arrived here to stay, but many
developers perceive it's still "green" and needs further development.
- ADO and ADO.Net don't conform the expectations of Delphi programmers
in performance and/or features, and it can't be ignored the fact that
most programmers would rather prefer to use a Borland solution.
In conclusion, the only ones that are happy here seem to be those who
switched to a BDE alternative some time ago... :-)
I'd love to receive your feedback about this article, because the more
opinions I get, the better.
________________________________________________________________________
Support us! Vote for the Pascal Newsletter in The Programming Top 100!
http://top100borland.com/in.php?who=20
________________________________________________________________________
3. UNDOCUMENTED: DETECT IF AN APPLICATION HAS STOPPED
Copyright (c) 2002 by Thomas Stutz
Email: tom@swissdelphicenter.ch
URL: http://www.swissdelphicenter.com/en/showcode.php?id=910
In many situations you might like to detect if an application is
blocked. For example while automating Word, you'd like to know if Word
has stopped responding. This article describes how to detect if an
application has stopped responding using some undocumented functions.
{
// Translated from C to Delphi by Thomas Stutz
// First published at www.SwissDelphiCenter.com
// Original Code:
// (c)1999 Ashot Oganesyan K, SmartLine, Inc
// mailto:ashot@aha.ru, http://www.protect-me.com
// http://www.codepile.com
The code doesn't use the Win32 API SendMessageTimout function to
determine if the target application is responding but calls undocumented
functions from the User32.dll.
--> For Windows 95/98/ME we call the IsHungThread() API
The function IsHungThread retrieves the status (running or not
responding) of the specified thread
IsHungThread(DWORD dwThreadId): // The thread's identifier of the
BOOL; // main app's window
--> For NT/2000/XP the IsHungAppWindow() API:
The function IsHungAppWindow retrieves the status (running or not
responding) of the specified application
IsHungAppWindow(Wnd: HWND): // handle to main app's window
BOOL;
Unfortunately, Microsoft doesn't provide us with the exports symbols
in the User32.lib for these functions, so we should load them
dynamically using the GetModuleHandle and GetProcAddress functions:
}
// For Win9x/ME
function IsAppResponding9x(dwThreadId: DWORD): Boolean;
type
TIsHungThread = function(dwThreadId: DWORD): BOOL; stdcall;
var
hUser32: THandle;
IsHungThread: TIsHungThread;
begin
Result := True;
hUser32 := GetModuleHandle('user32.dll');
if (hUser32 > 0) then
begin
@IsHungThread := GetProcAddress(hUser32, 'IsHungThread');
if Assigned(IsHungThread) then
begin
Result := not IsHungThread(dwThreadId);
end;
end;
end;
// For Win NT/2000/XP
function IsAppRespondingNT(wnd: HWND): Boolean;
type
TIsHungAppWindow = function(wnd:hWnd): BOOL; stdcall;
var
hUser32: THandle;
IsHungAppWindow: TIsHungAppWindow;
begin
Result := True;
hUser32 := GetModuleHandle('user32.dll');
if (hUser32 > 0) then
begin
@IsHungAppWindow := GetProcAddress(hUser32, 'IsHungAppWindow');
if Assigned(IsHungAppWindow) then
begin
Result := not IsHungAppWindow(wnd);
end;
end;
end;
function IsAppResponding(Wnd: HWND): Boolean;
begin
if not IsWindow(Wnd) then
begin
ShowMessage('Incorrect window handle');
Exit;
end;
if Win32Platform = VER_PLATFORM_WIN32_NT then
Result := IsAppRespondingNT(wnd)
else
Result := IsAppResponding9X(GetWindowThreadProcessId(wnd,nil));
end;
// Example: Check if Word is hung/responding
procedure TForm1.Button3Click(Sender: TObject);
var
Res: DWORD;
h: HWND;
begin
// Find Word by classname
h := FindWindow(PChar('OpusApp'), nil);
if h <> 0 then
begin
if IsAppResponding(h) then
ShowMessage('Word is responding')
else
ShowMessage('Word is not responding');
end
else
ShowMessage('Word is not open');
end;
________________________________________________________________________
Software Developers Forum. A place to discuss about software development
and to share experience in the work, professional or commercial
environments. http://tech.groups.yahoo.com/group/software-developers/
Subscription: software-developers-subscribe@yahoogroups.com
________________________________________________________________________
4. INLINE ASSEMBLER IN DELPHI (II) - ANSI STRINGS
By Ernesto De Spirito
In this chapter we will learn a few more assembler instructions, and the
basics of working with ANSI strings, also called long strings.
New opcodes
===========
These are the opcodes introduced in this article:
* JL (Jump if Lower): The correct description would take long to be
explained, so let's just say that JL jumps (goes) to the specified
label if in the previous CMP (or SUB) operation, the first operand is
less than the second operand in a signed comparison:
// if signed(op1) < signed(op2) then goto @@label;
cmp op1, op2
jl @@label
JG (Jump if Greater), JLE (Jump if Lower or Equal), and JGE (Jump if
Greater or Equal) complete the family of conditional jumps for
signed comparisons.
* JA (Jump if Above): jumps (goes) to the specified label if in the
previous CMP (or SUB) operation, the first operand was greater than
the second one, being both operands considered as unsigned values:
// if unsigned(op1) > unsigned(op2) then goto @@label;
cmp op1, op2
ja @@label
JB (Jump if Below), JBE (Jump if Below or Equal), and JAE (Jump if
Above or Equal) complete the family of conditional jumps for unsigned
comparisons.
* LOOP: Decrements ECX, and if not zero, it jumps to the specified
label. LOOP @@label is a shorter and faster equivalent to:
dec ecx // ECX := ECX - 1;
jnz @@label // if ECX <> 0 then goto @@label
Example:
xor eax, eax // EAX := EAX xor EAX; // EAX := 0;
mov ecx, 5 // ECX := 5;
@@label:
add eax, ecx // EAX := EAX + ECX; // Executed 5 times
loop @@label // Dec(ECX); if ECX <> 0 then goto @@label;
// EAX would value 15 (5+4+3+2+1)
Working with ANSI strings
=========================
A string variable is represented by a 32 bit pointer. If the string is
the empty string (''), then the pointer is Nil (zero), otherwise it
points to the first character of the string. The length of the string,
and the reference count are two integers at negative offsets from the
position of the first byte:
+-----------+
| s: string |-------------------+
+-----------+ |
V
--+-----------+-----------+-----------+---+---+---+---+---+---+---+--
| allocSiz | refCnt | length | H | e | l | l | o | ! | #0|
--+-----------+-----------+-----------+---+---+---+---+---+---+---+--
(longint) (longint) (longint)
\-----------------v-----------------/
StrRec record
const skew = sizeof(StrRec); // 12
When we pass a string as a parameter to a function, what is passed is
just the 32-bit pointer. Strings as return values are more difficult to
explain. The caller of a function returning a string must pass --as an
invisible last parameter of PString type-- the address of the string
variable that will hold the result of the function.
d := Uppercase(s); // Internally converted to: Uppercase(s, @d);
If the result of the function will be used in an expression rather than
assigned directly to a variable, the caller must use a temporary
variable initialized to Nil (the empty string). The compiler does that
for us in the Object Pascal code, but we have to do it by ourselves if
we call string returning functions from assembler code.
For some tasks, we can't call the classic string functions directly. For
example, the function Length isn't the name of a real function. It's a
construct built-in into the compiler, and the compiler generates code to
call the appropriate function, depending on whether the parameter is a
string or a dynamic array. In assembler, instead of Length, we have to
call the function _LStrLen (declared in the System unit) to get the
string length.
There are more things we should know about strings, but we have enough
for a first example.
Assembler version of Uppercase
==============================
This is the declaration of the function:
function AsmUpperCase(const s: string): string;
The parameter "s" will be passed in EAX, and the address of the "Result"
will be passed as a second parameter, i.e., in EDX.
Basically, this function should:
1) Get the length of the string to convert
2) Allocate memory for the result string
3) Copy the characters, converting them to uppercase
1) Get the length of the string to convert
------------------------------------------
We'll do this by calling System.@LStrLen. The function expects the
string in EAX (we already have it there), and the result will be placed
in EAX, so we have to save the value of EAX (the parameter "s")
somewhere before calling the function to avoid losing it. We can save
it in a local variable "src". Since functions are free to use EAX, ECX
and EDX, we should assume the value of EDX ("@Result") could also be
destroyed after calling System.@LStrLen, so we should first save it, for
example in a local variable "psrc". The result of System.@LStrLen,
left in EAX, will be used as a parameter for System.@LStrSetLength (to
allocate memory for the content of the result string), and then we need
it to count the bytes to be copied, so we also have to save it, for
example in a variable "n":
var
pdst: Pointer; // Address of the result string
src: PChar; // Source string
n: Integer; // String length
asm
// The address of the result string is passed in EDX.
// We save it in a local variable (pdst):
mov pdst, edx // pdst := EDX;
// Save EAX (s) in a local variable (src)
mov src, eax // src := EAX;
// n := Length(s);
call System.@LStrLen // EAX := _LStrLen(EAX);
mov n, eax // n := EAX;
2) Allocate memory for the result string
----------------------------------------
This is accomplished by calling System.@LStrSetLength. The procedure
expects two parameters: the address of the string (we saved it in
"pdst"), and the length of the string (we have it in EAX).
// SetLength(pdst^, n); // Allocates result string
mov edx, eax // EDX := n; // Second parameter for LStrSetLength
mov eax, pdst // EAX := pdst; // First parameter for LStrSetLength
call System.@LStrSetLength // _LStrSetLength(EAX, EDX);
3) Copy the characters, converting them to uppercase
----------------------------------------------------
If the length of the string was zero, we are done:
// if n = 0 then exit;
mov ecx, n // ECX := n;
test ecx, ecx // And ECX with ECX to set flags (ECX unchanged)
jz @@end // Go to @@end if the zero flag is set (ECX=0)
Otherwise, we should copy the characters from one string to the other,
converting them to uppercase as needed. We are going to use ESI and EDX
for pointing the characters of the source string and the result string
respectively, AL to load a character from the source string and perform
the change before storing it in the destination string, and ECX with the
LOOP instruction to count the characters. Since ESI is a register we
must preserve, we have to save its value to restore them later. I
decided to save ESI pushing it on the stack.
push esi // Save ESI on the stack
// Initialize ESI and EDX
mov eax, pdst // EAX := pdst; // Address of the result string
mov esi, src // ESI := src; // Source string
mov edx, [eax] // EDX := pdst^; // Result string
@@cycle:
mov al, [esi] // AL := ESI^;
// if Shortint(AL) < Shortint(Ord('a')) then goto @@nochange
cmp al, 'a'
jl @@nochange
// AL in ['a'..#127]
// if Byte(AL) > Byte(Ord('a')) then goto @@nochange
cmp al, 'z'
ja @@nochange
// AL in ['a'..'z']
sub al, 'a'-'A' // Dec(AL, Ord('a')-Ord('A'));
@@nochange:
mov [edx], al // EDX^ := AL;
inc esi // Inc(ESI);
inc edx // Inc(EDX);
loop @@cycle // Dec(ECX); if ECX <> 0 then goto cycle
pop esi // Restore ESI from the stack
@@end:
end;
________________________________________________________________________
5. DATABASE FIND DIALOG
I was recently requested to add a search dialog to all the data browsing
forms of a project, so I developed this simple unit for Delphi 5, which
shows a non-modal dialog, displayed always on top, allowing the users to
specify the search text, the field to be searched, and whether the
search text can be anywhere in the field, in the beginning, in the end
of field, or if the field value should be equal to the search text to
have a match for the search. The dialog has buttons to search for the
first, prior, next and last matches.
To use it, simply add a search button to your data browsing form,
include DbFindDlg in the Uses clause, and write a code like the
following in the button's OnClick event handler:
procedure TMain.btnSearchClick(Sender: TObject);
begin
ShowFindDialog(Self, Table1); // Any TDataset descendant supported
end;
If you have a DbGrid, you can call an overloaded version that in the
Fields combobox displays only those that are shown in the DbGrid:
procedure TMain.btnSearchClick(Sender: TObject);
begin
ShowFindDialog(Self, DbGrid1); // Any TDbGrid descendant supported
end;
The Find dialog frees itself when closed or when the owner (passed as
first parameter) is destroyed.
The project is not complete, and still needs some improvements (for
example, in the case of the DbGrid version, it is assumed that all
the grid columns are linked to fields), but it is still quite usable
under many circumstances as it is, so I wanted to share it with you.
Full source code and a simple demo is attached.
________________________________________________________________________
6. FORUMS
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
________________________________________________________________________
7. DELPHI ON THE NET
By Dave Murray <irongut @ vodafone.net>
Last issue's entry for Project JEDI's DARTH C-to-Pascal header
converter had no URL, this has been corrected below. Sorry! - DM
Components, Libraries and Utilities
===================================
Shareware/Commercial
--------------------
* TSDBGridFooter v2.0 by Jovan Sedlan, Shareware ($74.50)
This component is a powerful tool that provides automatic calculations
for your DBGrid and displays that information in a customizable footer
under the grid. It is designed to work with TSDBGrid (also included)
although you can use it with any TCustomDBGrid descendant.
http://www.softpile.com/Development/Libraries/Review_24756_index.html
* The Logo Creator v2.5 - By Laughingbird Software
Do-it-yourself logo creation software. The Logo Creator is a fun and
easy to use software program made up of logo templates that you can
modify and customize. For Macintosh and Windows.
http://www.thelogocreator.com/
Freeware
--------
* DARTH: C-to-Pascal header converter - by JEDI, FREEWARE with source
Source compiles into a tool that parses C headers and generates Delphi
source for Windows API calls.
http://www.delphi-jedi.org/toolslibrary.html
* TColorButton v1.0 - by 940801, FREEWARE with source
This button drops down a colour select window, can be like Word 2000.
http://940801.cndev.net/
* TGHIPEdit - by gh boy, FREEWARE with source
An IP Address Editor Component.
http://www.delphipages.com/uploads/Edits_Combos/IPEdit.zip
* THTMLLiteCLX - By Dave Baldwin, FREEWARE (DELPHI/KYLIX)
An HTML viewer component designed for hobbyists, students, or casual
users. Does not support Frames or the printing HTML documents. Image
capabilities include GIF, animated GIF, JPEG and bitmap.
http://www.pbear.com
* CPU package - release 2 revision 22 - By Thomas Schatzl
It is a small x86 CPU detection library. It should compile on Delphi
2-6 (tested 5 / 6 Personal) Win32 target, Freepascal 0.99.15+ (tested
1.0.6 / 1.1 Win32) for Win32 / OS/2 / GO32V2 / Linux targets (possibly
others) and VP 2.1b (Win32 target, possibly DOS/Linux). Possibly will
work with Kylix.
http://members.yline.com/~tom_at_work/index.html
Articles, tips and tricks
=========================
* Optimize DBImage fields and free disk space - by Zeriouh Abdelhafid
How to reduce the size of and optimize dbimage or graphic fields.
http://www.delphi3000.com/articles/article_3312.asp
* BorCon 2002 Nugget: Jake's Tuesday report - by John Jacobson
As posted on delphi.non-technical.
http://community.borland.com/article/0,1410,28837,00.html
* BorCon 2002 Nugget: Jake's Wednesday report - by John Jacobson
As posted on delphi.non-technical.
http://community.borland.com/article/0,1410,28839,00.html
* How to use TWebBrowser printing functions - by Merlin
http://www.delphifaq.net/modules.php?op=modload&name=FAQ&file=index
&myfaq=yes&id_cat=12&categories=Internet/LAN
* How to get a list of network drives - by Merlin
http://www.delphifaq.net/modules.php?op=modload&name=FAQ&file=index
&myfaq=yes&id_cat=12&categories=Internet/LAN
* How to duplicate a TTable? - by Merlin
http://www.delphifaq.net/modules.php?op=modload&name=FAQ&file=index
&myfaq=yes&id_cat=13&categories=Databases
* How to convert TDateTime to a UNIX timestamp and vice versa - Merlin
http://www.delphifaq.net/modules.php?op=modload&name=FAQ&file=index
&myfaq=yes&id_cat=13&categories=Databases
* How to access password protected Paradox databases without a password
http://www.delphifaq.net/modules.php?op=modload&name=FAQ&file=index
&myfaq=yes&id_cat=13&categories=Databases
* How to get the empty memory? - by sümer cip
http://www.delphi3000.com/articles/article_3298.asp
* TCollection Performance Issues and Solutions - by Clever Components
http://www.delphi3000.com/articles/article_3301.asp
* Make TextOut with 3d-Effect or hollow Text - by Holger Voigt
http://www.delphi3000.com/articles/article_3303.asp
* How to save file in BLOB and read from BLOB - by Mike Shkolnik
http://www.delphi3000.com/articles/article_3304.asp
* Loading an exe in a memo field - by Teun Spaans
http://www.delphi3000.com/articles/article_3305.asp
* Simple 3D Labels (Lowered and Raised) - by Abdulaziz Jasser
http://www.delphi3000.com/articles/article_3307.asp
* Custom Exception Dialogs + writing to the NT Event Log - D Wischnewski
Knowing what goes wrong; when, where and why?.
http://www.delphi3000.com/articles/article_3308.asp
* SOAP raises the bar for CORBA
The dawn of the Web Services era promises to link disparate businesses
in a manner and on a scale reminiscent of Internet linked machines.
http://community.borland.com/article/0,1410,28737,00.html
* How to view a TDataSet in MS Excel?
http://www.swissdelphicenter.ch/en/showcode.php?id=998
* How to change the default project directory in Delphi?
http://www.swissdelphicenter.ch/en/showcode.php?id=1130
* How to use the AdjustTokenPrivileges function to enable a privilege?
http://www.swissdelphicenter.ch/en/showcode.php?id=1177
* How to insert a Smiley image into a TRxRichEdit?
http://www.swissdelphicenter.ch/en/showcode.php?id=1147
* How to to fade in/out a TImage?
http://www.swissdelphicenter.ch/en/showcode.php?id=1165
* How to format a MessageDlg?
http://www.swissdelphicenter.ch/en/showcode.php?id=1168
* How to create a registry entry in the autorun key?
http://www.swissdelphicenter.ch/en/showcode.php?id=1157
* How to start a program and wait for its termination?
http://www.swissdelphicenter.ch/en/showcode.php?id=93
* How to print a page in a TWebbrowser?
http://www.swissdelphicenter.ch/en/showcode.php?id=478
* How to create a GUID at runtime?
http://www.swissdelphicenter.ch/en/showcode.php?id=1172
* How to Copy, Delete, Cut in the TWebbrowser?
http://www.swissdelphicenter.ch/en/showcode.php?id=1174
* How to Show the Properties Dialog in the TWebbrowser?
http://www.swissdelphicenter.ch/en/showcode.php?id=1175
* How to Show Balloon Tips for the Tray Icon?
http://www.swissdelphicenter.ch/en/showcode.php?id=1164
* How to change the Borderstyle/ BorderColor of a TWebbrowser?
http://www.swissdelphicenter.ch/en/showcode.php?id=1171
* How to extract a frame from a AVI file?
http://www.swissdelphicenter.ch/en/showcode.php?id=1180
* How to show the 'run' Dialog?
http://www.swissdelphicenter.ch/en/showcode.php?id=1181
* How to show shaded hints (XP)?
http://www.swissdelphicenter.ch/en/showcode.php?id=1182
* How to check, if a file is on a local drive?
http://www.swissdelphicenter.ch/en/showcode.php?id=1183
* How to regenerate all out-of-date indexes on a given table?
http://www.swissdelphicenter.ch/en/showcode.php?id=1184
* How to hide the scrollbars of TWebBrowser?
http://www.swissdelphicenter.ch/en/showcode.php?id=1185
* How to scroll TWebBrowser with own buttons?
http://www.swissdelphicenter.ch/en/showcode.php?id=1186
* How to check if the copy command is active in a TWebBrowser?
http://www.swissdelphicenter.ch/en/showcode.php?id=1187
* How to Replace images in a TWebBrowser?
http://www.swissdelphicenter.ch/en/showcode.php?id=1188
* How to find and highlight text in TWebBrowser?
http://www.swissdelphicenter.ch/en/showcode.php?id=1189
* How to get the lighter or darker color of a TColor variable?
http://www.swissdelphicenter.ch/en/showcode.php?id=1194
* How to automatically dial/hangup the default Internet connection?
http://www.swissdelphicenter.ch/en/showcode.php?id=1198
* How to rotate a DIB image?
http://www.swissdelphicenter.ch/en/showcode.php?id=1199
* How to show the 'Choose Domain' dialog?
http://www.swissdelphicenter.ch/en/showcode.php?id=1200
* How to list the user privileges (NT)?
http://www.swissdelphicenter.ch/en/showcode.php?id=1201
* How to remove a Dll from memory?
http://www.swissdelphicenter.ch/en/showcode.php?id=1202
* How to detect whether the CPU supports MMX?
http://www.swissdelphicenter.ch/en/showcode.php?id=1203
* How to set the volume for the microphone/ mute it?
http://www.swissdelphicenter.ch/en/showcode.php?id=1204
* How to switch a console application to full screen?
http://www.swissdelphicenter.ch/en/showcode.php?id=1205
* How to hide the Minimize/Maximize buttons of a form?
http://www.swissdelphicenter.ch/en/showcode.php?id=1207
* How to show password characters in a InputBox?
http://www.swissdelphicenter.ch/en/showcode.php?id=1208
* How to save a Excel file as Text file?
http://www.swissdelphicenter.ch/en/showcode.php?id=1209
* How to determine if a number is prime, quickly (2)?
http://www.swissdelphicenter.ch/en/showcode.php?id=1210
* How to deactivate the (Windows) keys with a systemwide Hook?
http://www.swissdelphicenter.ch/en/showcode.php?id=1212
* How to get the first/last visible line of a TRichEdit?
http://www.swissdelphicenter.ch/en/showcode.php?id=1213
* How to return information about the current system?
http://www.swissdelphicenter.ch/en/showcode.php?id=1215
* How to determine if the window is a Unicode window?
http://www.swissdelphicenter.ch/en/showcode.php?id=1216
* Rotate an ellipse - by Holger Voigt
Ellipse with Beziercurves.
http://www.delphi3000.com/articles/article_3257.asp
* Auto Hide for Form - by Zswang Wangjihu
http://www.delphi3000.com/articles/article_3258.asp
* Retrieving folder size - by Christian Cristofori
This function tells you how many bytes a folder, with all subfolders
and files occupies on a HD, CD, floppy or whatever.
http://www.delphi3000.com/articles/article_3259.asp
* Use own buttons to scroll TWebBrowser - by Smokey Mc. Pot
http://www.delphi3000.com/articles/article_3262.asp
* Change the looks of a MessageDlg... - by Smokey Mc. Pot
http://www.delphi3000.com/articles/article_3263.asp
* WebBrowser load from stream - by Zswang Wangjihu
function ShowHtml(mWebBrowser:TWebBrowser;mStrings:TStrings):Boolean;
http://www.delphi3000.com/articles/article_3267.asp
* DataSet -> Strings -> DataSet - by Zswang Wangjihu
Functions: TexttToDataSet, DataSetToText.
http://www.delphi3000.com/articles/article_3269.asp
* Creating Matlab files - by Flurin Honegger
A library unit with basic building procedures.
http://www.delphi3000.com/articles/article_3271.asp
* An Iterative ASCII-Export - by Max Kleiner
Exports records to a delimited file.
http://www.delphi3000.com/articles/article_3272.asp
* The Fast and Best way to get a local IP Address - by Gerson Tomas
http://www.delphi3000.com/articles/article_3273.asp
* Print data from table in QReport - by Alper Sirvan
http://www.delphi3000.com/articles/article_3275.asp
* Design-Time Component About Box Dialog (Delpih 6) - by Mike Heydon
http://www.delphi3000.com/articles/article_3277.asp
* Pump data from any dB into Interbase/Firebird - by Clever Components
How to pump data from any ADO/BDE/ODBC and native Interbase/Firebird
databases into Interbase/Firebird databases.
http://www.delphi3000.com/articles/article_3278.asp
* When do we use Application (Owner), Self or NIL? - by Max Kleiner
Passing the right Owner to a component-constructor.
http://www.delphi3000.com/articles/article_3281.asp
* Make Application.ExeName work in DLLs - by Christian Cristofori
http://www.delphi3000.com/articles/article_3283.asp
* Create a DBExpress-Connection at Runtime - by Max Kleiner
http://www.delphi3000.com/articles/article_3286.asp
* High speed parser - by Yuriy Pisarev
This component is intended for mathematics and logical calculations.
http://www.delphi3000.com/articles/article_3287.asp
* How to find the senders email address (MS Outlook) - by Marc Georges
http://www.delphi3000.com/articles/article_3288.asp
* Determine the date of Easter for a given year - by Oliver Moenche
http://www.delphi3000.com/articles/article_3289.asp
* Using AdjustTokenPrivileges to enable a privilege (NT) - Thomas Stutz
http://www.delphi3000.com/articles/article_3291.asp
* Getting the associated Icon of any file - by Daniel Wischnewski
This article shows you how to extract the associated icon of any file.
Including files that use shell icon handlers such as Corel Draw files.
http://www.delphi3000.com/articles/article_3293.asp
* Child windows of a window (forms within a form) - by Tommy Andersen
http://www.delphi3000.com/articles/article_3294.asp
* First/Last changed File in Folder - by Holger Voigt
http://www.delphi3000.com/articles/article_3296.asp
Tutorials
=========
* A Beginner's Guide to Delphi Programming - by Zarko Gajic
FREE online Delphi programing course for beginners, now up to Part 5:
Understanding the Delphi unit source.
http://delphi.about.com/library/weekly/aa061802a.htm
* Demystifying the syntax of regular expressions - by Shelley Doll
Regular expressions are often wrongly perceived as mystical unknowns
that only a true guru can understand. They're ugly to look at and if
you don't know the syntax they can seem like cryptic strings of
garbage you might get from a core dump. This article will help by
walking you though the most commonly used regular expressions.
http://articles.techrepublic.com.com/5100-10878_11-1050915.html
* SQL Basics I: Data Queries - by Shelley Doll
Need a quick overview of SQL? This article will get you started from
creating basic manipulation queries to altering the database to more
advanced query concepts.
http://builder.com.com/article.jhtml?id=u00320020531dol01.htm
* SQL Basics II: SELECT statement options - by Shelley Doll
Need a quick overview of SQL? This article picks up where the previous
one left off with some additional functions and clauses for use with
the basic SELECT data query.
http://articles.techrepublic.com.com/5100-10878_11-1044962.html
Other Links
===========
* C++Builder Developer Survey 2002 - by C++Builder Product Team
Survey to get feedback on current and desired features for future
releases of C++ products from Borland. Your answers will have a direct
impact on future product releases. Five prize winners will receive a
free Borland Professional software product of their choice.
http://infopoll.net/Live/surveys/s17964.htm
* Builder 7 Personal Download Now Available - by Tim Del Chiaro
Now you can download a free copy of new JBuilder 7 Personal including
a free development license for non-commercial use. JBuilder 7 Personal
is currently available in English for the Windows, Linux, Solaris and
Mac OSX platforms. Other language editions are coming soon.
http://community.borland.com/article/0,1410,28844,00.html
* Delphi 6 Updates for the RTL and Informix 9.2.1 - by John Kaster
Registered users can download two new updates for Delphi 6. Included
in the RTL pack is a SysUtils update that remedies a deadlock issue
that could appear when many Web modules were being used under heavy
load causing the Web application to stop responding.
http://community.borland.com/article/0,1410,28783,00.html
* Borland demonstrates .NET technology - by Anders Ohlsson
DevRel shows Delphi for .NET preview at VS Live in New York.
http://community.borland.com/article/0,1410,28788,00.html
* Merlin's Delphi Forge
Delphi news, faq, tips, downloads, classifieds and more.
http://www.delphifaq.net/
* Builder.com Readers' Choice Awards
The time has come! Make your voice heard, and vote for your favorite
development tool in the 2002 Builder.com Readers' Choice Awards. You
can vote for Borland in these categories: Best Java IDE, Best Java
Application Server, Best Windows Development Tool and Best Linux IDE.
http://clickthru.online.com/Click?q=06-fP6uI482uKMaF6Gma-TvR7xyY8ZR
________________________________________________________________________
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 one 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=p37
________________________________________________________________________
This newsletter is provided "AS IS" without warranty of any kind. Its
use implies the acceptance of our licensing terms and disclaimer of
warranty you can read at http://www.latiumsoftware.com/en/legal.php
where you will also find a note about legal trademarks. Articles are
copyright of their respective authors and they are reproduced here with
their permission. You can redistribute this newsletter as long as you do
it in full (including copyright notices), without changes, and gratis.
________________________________________________________________________
Main page: http://www.latiumsoftware.com/en/pascal/delphi-newsletter.php
Group home page: http://groups.yahoo.com/group/pascal-newsletter/
Subscribe/join: pascal-newsletter-subscribe@yahoogroups.com
Unsubscribe/leave: pascal-newsletter-unsubscribe@yahoogroups.com
Problems with your subscription? eds2008 @ latiumsoftware.com
________________________________________________________________________
Latium Software http://www.latiumsoftware.com/en/index.php
Copyright (c) 2002 by Ernesto De Spirito. All rights reserved.
________________________________________________________________________
|