Pascal Newsletter #43 - 03-FEB-2003
Contents
1. A few words from the editor
2. MS Exchange API via CDO (Collaboration Data Objects)
CDO (Collaboration Data Objects) Base Library
(Talking to MS-Exchange server)
3. Distributed applications, the easy way (II)
MsgConnect basics. Simple chat system.
4. Changing standard Windows dialogs
Changing controls from standard Windows (Open/Save) dialogs
5. Delphi Easter egg
Get to know your Delphi better
6. Forums / mailing lists
7. Delphi on the Net
- Components, libraries and utilities
. Freeware
- Articles, tips and tricks
- Tutorials
- Other links
________________________________________________________________________
1. A few words from the editor
I'd like to thank Mike Heydon, Eugene Mayevski, Igor Siticov and Bogdan
Grigorescu for contributing articles for this issue, and I'm glad to
give Igor and Mike the prizes for this issue:
* Igor Siticov ("Changing standard Windows dialogs")
· 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
* Mike Heydon ("MS Exchange API via CDO (Collaboration Data Objects)")
· 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
For the next issue, we have available the following prizes for our
contributors:
* 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/
* Greatis Form Designer v3.4 - by Greatis Software, Shareware ($49.95)
It's a runtime form designer that allows you to move and resize any
control on your form. You don't need to prepare your form to use
Form Designer. Just drop TFormDesigner component onto any form, set
Active property to True and enjoy! For Delphi 4-7 and BCB 3-6.
http://www.greatis.com/formdes.htm
I hope you enjoy this issue.
Regards,
Ernesto De Spirito
eds2008 @ latiumsoftware.com
__________________
Collaborated in this issue: Dave Murray
________________________________________________________________________
Greatis Runtime Fusion includes Form Designer Pro ($ 49.95) and Object
Inspector Pro ($ 49.95), two flagship Delphi-related products of Greatis
Software, and costs $89.90 - Save $10 and get additional demos. Let the
user design forms at runtime. >>>>>>> http://www.greatis.com/runtime.htm
________________________________________________________________________
2. MS Exchange API via CDO (Collaboration Data Objects)
CDO (Collaboration Data Objects) Base Library
(Talking to MS-Exchange server)
Copyright (c) 2002 Mike Heydon
This is a vast subject and is beyond the scope of this article to treat
it in full detail. This library provides the basic building blocks for
someone who wants to develop using CDO. There are many references on the
Net, but your best source is the CDO.HLP file that ships on the Exchange
CD or site (http://www.cdolive.com/start.htm). The cdolive.com site is
an excellent reference site which discusses all aspects including
installation, versions and also downloads (CDO.HLP is downloadable from
here).
My basic class provides the following functionality:
* Utility functions and methods
function CdoNothing(Obj : OleVariant) : boolean;
function CdoDefaultProfile : string;
function VarNothing : IDispatch;
procedure CdoDisposeList(WorkList : TList);
procedure CdoDisposeObjects(WorkStrings : TStrings);
procedure CdoDisposeNodes(WorkData : TTreeNodes);
* Create constructors that allow Default profile logon, Specific profile
logon and an Impersonated user logon with profile (this is required
for successful logon in Windows Service Applications).
constructor Create; overload;
constructor Create(const Profile : string); overload;
constructor Create(const Profile : string;
const UserName : string;
const Domain : string;
const Password : string); overload;
* Methods for loading stringlists, treeviews, etc. and Object iteration.
function LoadAddressList(StringList : TStrings) : boolean;
function LoadObjectList(const FolderOle : OleVariant;
List : TList) : boolean;
function LoadEMailTree(TV : TTreeView;
Expand1stLevel : boolean = false;
SubjectMask : string = '') : boolean;
function LoadContactList(const FolderOle : OleVariant;
Items : TStrings) : boolean; overload;
function LoadContactList(const FolderName : string;
Items : TStrings) : boolean; overload;
procedure ShowContactDetails(Contact : OleVariant);
* The above load various lists into stringlists, and lists or treeviews.
Freeing of lists, object constructs within these data structures are
freed at each successive call to the load. However, the final
Deallocation is the responsibility of the developer. You can do this
yourself or use the utility functions CdoDisposeXXX(). See the code's
documentation for further information.
function First(const FolderOle : OleVariant;
out ItemOle : OleVariant) : boolean;
function Last(const FolderOle : OleVariant;
out ItemOle : OleVariant) : boolean;
function Next(const FolderOle : OleVariant;
out ItemOle : OleVariant) : boolean;
function Prior(const FolderOle : OleVariant;
out ItemOle : OleVariant) : boolean;
function AsString(const ItemOle : Olevariant;
const FieldIdConstant : DWORD) : string;
The above provide iterations thru object such as Inbox, Contacts, etc.
The AsString function returns a field's value from the object such as
Email Address, Name, Company Name, etc. (there are myriads of these
defined in the CONST section, under "Field Tags").
* Properties
property CurrentUser : OleVariant read FCurrentUser;
property Connected : boolean read FConnected;
property LastErrorMess : string read FlastError;
property LastErrorCode : DWORD read FlastErrorCode;
property InBox : OleVariant read FOleInBox;
property OutBox : OleVariant read FOleOutBox;
property DeletedItems : Olevariant read FOleDeletedItems;
property SentItems : Olevariant read FOleSentItems;
property GlobalAddressList : Olevariant read FOleGlobalAddressList;
property Contacts : Olevariant read FOleContacts;
property Session : OleVariant read FOleSession;
property Version : string read GetFVersion;
property MyName : string read FMyName;
property MyEMailAddress : string read FMyEMailAddress;
The Create constructor sets up the predefined objects InBox, OutBox,
DeletedItems, SentItems, GlobalAddressList, Session and Contacts. The
other properties are self-explanatory.
As I mentioned earlier, the functionality of CDO is vast, as objects
such as InBox have many methods and properties that include Updating,
Inserting, Deleting, etc. The CDO.HLP file will help to expose these
class members for you. My class is the base of CDO to help simplify
building applications and is probably best demonstrated by code
snippet examples. Believe me, a whole book could be written on this
subject, but it is well worth studying a faster alternative to using
the MS Outlook API.
uses Cdo_Lib;
var
Cdo: TcdoSession;
MailItem: OleVariant;
// Iterate thru Emails in InBox
begin
Cdo := TCdoSession.Create;
if Cdo.Active then
begin
Cdo.First(Cdo.InBox, MailItem);
while true do
begin
if not Cdo.Nothing(MailItem) then
begin
// Do something with data and delete the EMail
Subject := MailItem.Subject;
EMailAddress := Cdo.AsString(MailItem.Sender,
CdoPR_EMAIL_AT_ADDRESS);
EMailName := MailItem.Sender.Name;
BodyText := MailItem.Text;
MailItem.Delete;
// Get the next Email
end;
MailItem := Cdo.Next(Cdo.Inbox.MailItem);
end;
end;
Cdo.Free;
end;
// Example of loading emails into a treeview and displaying on
// treeview click
unit UBrowse;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ToolWin, Menus, ExtCtrls, StdCtrls, Buttons,
ImgList, CDO_Lib;
type
TFBrowse = class(TForm)
Panel1: TPanel;
Panel3: TPanel;
Label1: TLabel;
Label2: TLabel;
lbFrom: TLabel;
lbDate: TLabel;
Memo1: TMemo;
Panel2: TPanel;
OKBtn: TBitBtn;
tvCalls: TTreeView;
ImageList1: TImageList;
StatusBar1: TStatusBar;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure tvCallsClick(Sender: TObject);
procedure btnPrintClick(Sender: TObject);
private
{ Private declarations }
Doc: OleVariant;
Cdo: TCdoMapiSession;
public
{ Public declarations }
end;
var
FBrowse: TFBrowse;
implementation
{$R *.DFM}
procedure TFBrowse.FormShow(Sender: TObject);
var
TN: TTreeNode;
begin
Screen.Cursor := crHourGlass;
Application.ProcessMessages;
Cdo := TCdoMapiSession.Create;
Cdo.LoadEMailTree(tvCalls, true, '*Support ---*');
tvCalls.SortType := stText;
TN := tvCalls.Items[0];
TN.Expand(false);
tvCalls.SetFocus;
Screen.Cursor := crDefault;
end;
procedure TFBrowse.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
CdoDisposeNodes(TvCalls.Items);
Cdo.Free;
end;
procedure TFBrowse.tvCallsClick(Sender: TObject);
var
TN: TTreeNode;
begin
TN := tvCalls.Selected;
Memo1.Clear;
lbFrom.Caption := '';
lbDate.Caption := '';
if TN.Data <> nil then
begin
Doc := TOleVarPtr(TN.Data)^;
Memo1.Text := Doc.Text;
lbFrom.Caption := Doc.Sender.Name;
lbDate.Caption := FormatDateTime('dd/mm/yyyy hh:nn',
Doc.TimeSent);
end;
end;
end.
________________________________________________________________________
Support us! Vote for the Pascal Newsletter in The Programming Top 100!
http://top100borland.com/in.php?who=20
________________________________________________________________________
3. Distributed applications, the easy way (II)
MsgConnect basics. Simple chat system.
By Eugene Mayevski <Mayevski @ eldos.org>
In the first part of the article (Issue #42) we took a brief
look at the methods used to exchange information between
different parts of the application. This part will deal with
the development of a simple chat system for Intranets.
You will find an example (very primitive but complete) enclosed with the
MsgConnect application: http://www.msgconnect.com/download.html
It's called SendNote. As the name says, this application lets you send
text notes to the recipient. You can use this example as a reference
material for this text.
Let's start from the beginning. We decided to use MsgConnect as it
boasts to be cross-platform and message-oriented. To deliver the message
we need 3 things:
1. a component to send the message
2. a component to deliver the message
3. a component to receive the message
Unlike most methods of data exchange, where sender and receiver parts
are different components, MsgConnect uses the same component set for
sending and receiving messages.
As described in the "Getting Started" section of the MsgConnect
documentation, you need just 3 components - Messenger, Transport and
Queue.
Messenger is the core of MsgConnect -it does all message processing.
Like Windows® messaging subsystem, which is thread-based, Messenger
class was designed to be the only Messenger component in the thread. In
other words, only one instance of Messenger class must be created for
each thread. You can create more, but this (a) doesn't make much sense
and (b) complicates the logic of your application.
Transport is used to deliver the message to the recipient. There are
currently 2 transports, based on Memory-Mapped Files and on Sockets.
HTTP-based transport is being created and there are plans for other
transports later. The transport takes the message from the Messenger,
packs it (also optionally applies encryption, compression and integrity
checking) and transfers it to the recipient. The recipient application
must also have an active instance of the transport of the same class.
This means that if you send a message using Socket transport, it is
necessary to have Socket transport active on the other (recipient) side.
Queue is used to dispatch incoming messages in a handy way. It can be
treated as a mailbox in the post office. As you send the letter to the
P.O. Box, you send the binary message to the queue. Probably "mailbox"
would be a better name for the queue object, but we won't change the
name now. Each messenger can have as many queues as you like. The queues
are identified by a symbolic name. There are certain limitations on the
queue names, and they are described in the documentation.
How does the messenger know where to send a message? When you ask
Messenger to send something, you give it the address of the recipient.
The address contains 3 parts:
* Transport identifier. This can be the name of the transport
component or transport class name as described in the documentation.
* Destination address. This address is specific to each transport.
* Destination queue name.
And the last important question: does MsgConnect guarantee delivery and
the order of the messages? Well, distributed systems are different from
single-process in the way of when and how these systems are started and
stopped and what external links they maintain. In other words, it is not
possible to guarantee that the remote system will receive and process
the message. This is beyond MsgConnect control. But still delivery is
guaranteed in the following way: if you use one of the SendMessage*()
methods (and not PostMessage()) to send a message, you will get some
notification about the success or failure of the delivery.
As for the order of delivery - due to bi-directional nature of
MsgConnect (if the connection exists, it can be used to send messages in
each direction completely independently of each other) - there exists a
possibility that two messages scheduled for delivery to one recipient at
the same time will be delivered not in the order in which they were put
to the queue. Such situation can happen only when the same transport is
used as both client and server (i.e. initiates and accepts connections
at the same time). This is called p2p transport mode for SocketTransport
class. Solution is easy, but we will deal with this question in the next
part of the article - right now we don't need this.
Now, when we know the basics, let's start building our first MsgConnect-
powered application: a simple chat.
First we create the Messenger object, the Queue object and the
SocketTransport object. In different development environments this can
be done either in code or by placing a component in Designer.
Then we need to link the Queue and SocketTransport objects to Messenger
by setting their Messenger property to the added instance of the
Messenger class. In languages which don't support properties, this is
done by calling the SetMessenger() method.
Then we set Transport properties (as shown in the sample projects):
MessengerPort (14583 in our sample), TransportMode (p2p in our case
because our chat sends and receives messages via the same transport)
and of course the Active property. MessengerPort is where the
SocketTransport waits for incoming connections and TransportMode
defines how the transport behaves when it is activated.
Messages are received by the application either (a) using the
OnUnhandledMessage event of the Queue class or (b) using MessageHandler
objects. Use of MessageHandler objects is a handy way to put a handler
for different messages in different methods. For our simple chat with
one message we use an OnUnhandledMessage event, so we need to create a
handler method for the OnUnhandledMessage event. This method will be
called when the message arrives.
As said before, MsgConnect emulates Windows messaging subsystem and the
Messenger object is used within a thread. We send a message using one
of the PostMessage() or SendMessage*() methods. Remember to call these
methods within the same thread in which the Messenger object was created
(Java code base of MsgConnect doesn't have this restriction).
To send a message to the recipient in our chat application, the user
must enter the text, sender name (it is not used to dispatch messages
and is just informational) and recipient address. Here comes the tricky
part: in our chat application we let the user enter computer name or IP
address. They are later used without translation as a message recipient
address. In more complex applications one will lookup the user names in
the list or do some other name->address translation (we will use this
when developing an Instant Messenger application).
The next thing to do is to develop a protocol. A protocol is a sequence
of calls or messages, used to exchange information between the two
parties of the connection. In our simple chat we use a very primitive
protocol that consists of just one message - all the data being sent is
included in this message.
So we have something to send. How do we actually send the message?
Remember that unlike Windows messaging, MsgConnect can transfer binary
data sized up to 2Gb.
To send a message we use an instance of the Message class (a record in
C++ and in Delphi). We fill integer properties - Param1, Param2 and
MsgCode. MsgCode has the same meaning as in Windows messaging; it is
used to find the right handler in the array of MessageHandlers within
a destination Queue.
Then we need to attach our application data. We are sending the name of
the sender and the body of the message. We pack them to one string and
attach it to Message class.
A bit more description now. MsgConnect can send binary data within a
message sent using SendMessage*() methods in one or both directions. In
other words, you can attach some data; the recipient will process it and
attach the resulting binary data to the reply. Remember that in most
cases you send the data only in one direction so, by default, the
BinDataType property of the Message class/record is bdtConst. If the
recipient of the message should replace the associated data with it's
own data and send it back, you need to set BinDataType property to
bdtVar. bdtVar tells the Messenger to put the data together with the
reply when it is packed.
OK, we have created the message and we are ready to send it. Which of
PostMessage()/SendMessage*() methods should we use? This depends on the
way we build our application.
The simplest way is -of course- PostMessage(). It puts a message to the
message queue and returns immediately. In this case, the message is sent
in one direction only and the message result is not returned. However,
there's one drawback in this approach - your application never knows
whether the message was actually sent. This is like a pager - you can
send a message but unless you ask your partner to call immediately you
won't know whether the message was delivered. And even worse - if the
partner doesn't call you, this doesn't mean he didn't receive a message.
So SendMessage*() looks like a better option. There are 3 similar
SendMessage*() functions - SendMesage(), SendMessageCallback(), and
SendMessageTimeout(). They all send a message and try to wait for a
result, but the details of their behavior differ.
SendMessage() doesn't return until the message result is returned or an
error occurs. During the call to this method Windows messages (where
applicable) are not processed and your user interface is not updated
(unless you send messages from another thread, but this is beyond the
current topic).
SendMessageTimeout() is similar to SendMessage(), with the difference
that SendMessageTimeout() returns unconditionally either when reply is
received or when the time expires. Actually, SendMessage is implemented
via SendMessageTimeout().
While SendMessageTimeout() is useful in certain cases, we need some
other solution. This is SendMessageCallback() method. It sends a message
and returns immediately. The application must call Messenger's
DispatchMessages() method then.
Like in Windows, the application must call the DispatchMessages()
method to dispatch the received messages and call the proper handlers.
DispatchMessages() is used to receive both original messages and
replies. When a reply is received by the application, the next call to
DispatchMessages will call the callback function.
Such scheme requires that the application (a) calls DispatchMessages()
from time to time and (b) continues it's operations after some timeout
expires. This requirement causes the use of a timer. The timer calls a
function that is used to call DispatchMessages() and also counts the
time elapsed since the message was sent.
In our simple chat we use a timer as mentioned above. The callback
function receives the notification about the delivery and puts a record
to the history memo box.
Now we have all parts of the application described. Nothing will help
better than sample code, so you can see what we have ended up with in
SendNote sample.
In the next part of the article we will create a design of a full
featured Instant Messenger built with MsgConnect.
________________________________________________________________________
Greatis Form Designer v3.4 - Shareware ($49.95) - For D4-7 and BCB 3-6
It's a runtime form designer that allows you to move and resize any
control on your form. You don't need to prepare your form to use Form
Designer. Just drop TFormDesigner component onto any form, set Active
property to True and enjoy! >>>>>> http://www.greatis.com/formdes.htm
________________________________________________________________________
4. Changing standard Windows dialogs
Changing controls from standard Windows (Open/Save) dialogs
By Igor Siticov
SiComponents: http://www.sicomponents.com
Question: How to change text like "File name:", "File Type"
and buttons' text in the standard Windows dialogs?
Sometimes we need to replace some text or something else in the standard
Windows Open/Save dialogs. Unfortunately, Delphi's dialogs components
don't provide access to all controls placed on Windows common dialogs,
but we can perform this using the Windows API.
The example below shows how to change the embedded text controls in the
Open dialog.
First, we need to determine the identifiers of the dialog's controls.
They are the following:
const
LB_FILETYPES_ID = 1089; // "File types:" label
LB_FILENAME_ID = 1090; // "File name:" label
LB_DRIVES_ID = 1091; // "Look in:" label
Second, we need to send a message to the dialog window to change the
desired controls, something like following:
// uses ..., Windows, CommDlg;
procedure TForm1.OpenDialog1Show(Sender: TObject);
const
LB_FILETYPES_ID = 1089;
LB_FILENAME_ID = 1090;
LB_DRIVES_ID = 1091;
Str1 = 'Four';
Str2 = 'Five';
Str3 = 'One';
Str4 = 'Two';
Str5 = 'Three';
begin
SendMessage(GetParent(OpenDialog1.Handle), CDM_SETCONTROLTEXT,
IDOK, LongInt(Pchar(Str1)));
SendMessage(GetParent(OpenDialog1.Handle), CDM_SETCONTROLTEXT,
IDCANCEL, LongInt(Pchar(Str2)));
SendMessage(GetParent(OpenDialog1.Handle), CDM_SETCONTROLTEXT,
LB_FILETYPES_ID, LongInt(Pchar(Str3)));
SendMessage(GetParent(OpenDialog1.Handle), CDM_SETCONTROLTEXT,
LB_FILENAME_ID, LongInt(Pchar(Str4)));
SendMessage(GetParent(OpenDialog1.Handle), CDM_SETCONTROLTEXT,
LB_DRIVES_ID, LongInt(Pchar(Str5)));
end;
Note: The identifiers of the different dialog boxes and their values
can be obtained by importing the dialog resources from comctrl32.dll
in any resource editor and seeing these identifiers in RC format.
__________________
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
________________________________________________________________________
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
________________________________________________________________________
5. Delphi Easter egg
Get to know your Delphi better
By Bogdan Grigorescu [bogdang@gmx.net]
deGrigg Solutions - www.aiua.ro coming soon
Question: Are there any Easter eggs in Delphi?
I know that this isn't the kind of technical article you would expect to
see in this newsletter, but many people have asked if there are any
"Easter Eggs" in Delphi. Here goes:
1) In Delphi 5 (I've seen it work in unpatched-Enterprise version, but I
think it's the same for all) open the About box.
2) Hold Alt and type in JEDI or DEVELOPERS or TEAM or QUALITY.
3) After the large DELPHI word scrolls off the screen you will see:
- a praise to the Joint Endeavour of Delphi Innovators (and a link to
their site in the About box) or
- the names of the developers / team / QA that made Delphi such a
great product
4) While the "Star Wars" type scrolling is still on, you can use the
down (or the up) key to turn the scrolling text until it is upside
down, and now you should now see the message:
"Use the Source, Luke"
__________________
Editor's Note: The Easter egg seems to be present in other Delphi
versions and editions, but beware that there were reports of fatal
exceptions while trying to check for this. Use at your own risk.
________________________________________________________________________
6. 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
________________________________________________________________________
7. Delphi on the Net
By Dave Murray <irongut @ vodafone.net>
Components, libraries and utilities
===================================
Shareware/Commercial
--------------------
* LMD-Tools 7 - by LMD Innovative
LMD-Tools is a set of more than 300 components including controls for
superior interface design, system programming, file controls, database
applications, internet-/web-components, multimedia, text/data input
(RichEdit), display of formatted text and many more. Advanced features
include transparencies, font and background effects, and HTML support.
http://www.lmdinnovative.com/products/lmdtool7/
* Object Inspector 1.2 - by Greatis Software
Object Inspector is a suite of components that includes a special
component for easy and convenient access to all published properties
and events of any component, a common inspector that can be used for
inspecting everything in your application, and a ready-to-use
component inspector that mimics the IDE Object Inspector. It has
different paint styles, as well as font and color customization
features. For Delphi 3-7 and Borland C++ Builder 5-6.
http://www.greatis.com/objinsp.htm
Freeware
--------
* MsgConnect - By EldoS Group and TamoSoft - License: GPL/Commercial
MsgConnect is a cross-platform protocol-independent communication
framework designed to simplify the task of building peer-to-peer and
client-server applications and middleware components. MsgConnect takes
care of a wide range of low-level technical tasks, letting developers
concentrate on the business logic of the application.
http://www.msgconnect.com
* PGP Components for Delphi v3.3.2 - by Michael in der Wiesche (source)
Provides a direct interface from Delphi 2-7 to PGP 6.5.x, 7.x or 8.x.
Capabilities: Encode and decode (encrypt/decrypt/sign/verify); Create
and verify file detached signatures; Import, export, revoke and delete
keys; Several key management functions; Key generation (DH/DSS, RSA);
Keyserver functions; Utilities.
http://home.t-online.de/home/idw.doc/PGPcomp.htm
* TurboPower Async Professional v4.06 - by TurboPower (with source)
A comprehensive communications toolkit, it provides direct access to
serial ports, TAPI, and the MS Speech API. It supports fax, terminal
emulation, VOIP, & more.
https://sourceforge.net/projects/tpapro/
* TurboPower FlashFiler v2.13 - by TurboPower (with source)
A client-server database for Delphi and C++Builder. It features a
component-based architecture and the server engine can be embedded in
your applications. FlashFiler is easy to configure, performs well and
includes SQL support.
https://sourceforge.net/projects/tpflashfiler/
* TurboPower Orpheus v4.06 - by TurboPower (with source)
An award-winning UI toolkit for Delphi and C++Builder. It contains
over 120 components covering everything from data entry to calendars
and clocks. Other components include an Object Inspector, LookOut bar,
and report views.
https://sourceforge.net/projects/tporpheus/
* TurboPower Internet Professional v1.15 - by TurboPower (with source)
A set of VCL components providing Internet connectivity for Delphi and
C++Builder. Includes POP3, SMTP, NNTP, FTP, HTTP, Instant Messaging
and HTML viewer as well as components for low-level socket access.
https://sourceforge.net/projects/tpipro/
* TurboPower Essentials v1.11 - by TurboPower (with source)
Contains 13 native VCL controls for Delphi and C++Builder. They
include drop-down calendars and calculators, roll-up dialogs, 3D
labels, tiled backgrounds, scrolling messages, menu buttons and more.
https://sourceforge.net/projects/tpessence/
* TurboPower ShellShock v1.02 - by TurboPower (with source)
Provides a set of components that let you customize applications with
the functionality available in the Windows Shell and Windows Explorer,
all without writing code. The components are written in native VCL for
Delphi and C++Builder.
https://sourceforge.net/projects/tpshellshock/
* TurboPower LockBox v2.07 - by TurboPower (with source) (DELPHI/KYLIX)
A cross-platform toolkit for data encryption. It contains routines and
components for use with Delphi, C++Builder and Kylix. It provides
support for Blowfish, RSA, MD5, SHA-1, DES, triple- DES, Rijndael and
digital signing of messages.
https://sourceforge.net/projects/tplockbox/
* TurboPower B-Tree Filer v5.55 - by TurboPower (with source)
A fast library of file-based database routines for Turbo Pascal and
Delphi. Supports stand-alone programs or those running on Microsoft-
compatible networks including Novell Netware.
https://sourceforge.net/projects/tpbtreefiler/
* TurboPower OnGuard v1.13 - by TurboPower (with source)
A library to create demo versions of your Delphi and C++Builder
applications. Create demo versions that are time-limited, feature-
limited, limited to a certain number of uses, or limited to a certain
number of concurrent network users.
https://sourceforge.net/projects/tponguard/
* TurboPower String Resource Manager v1.0.4 - by TurboPower (w/source)
A tool for building string resource libraries in Delphi. It prevents
string resource clashes + simplifies translation of string resources.
https://sourceforge.net/projects/tpsrmgr/
* TurboPower Async Professional CLX v1.01 - TurboPower (source) (KYLIX)
A comprehensive communications toolkit for Borland Kylix. It provides
direct access to serial ports, and supports terminal emulation, file
transfer protocols and much more.
https://sourceforge.net/projects/tpaproclx/
* Drag and Drop Component Suite 3.7 - by Angus Johnson and Anders
Melander (with source)
Enables COM drag-and-drop of files, folders, text, bitmaps and URLs
between applications. Copy, move and link operations. Clipboard
support. Drag image support. Automatic scrolling of the target window
during the drag operation. Relatively simple to derive custom drag-
and-drop components to support other data formats.
http://www.torry.net/vcl/system/draganddrop/DragDrop0402.zip
* TMPAnimatedCursors - by Markus Stephany (with source)
A component to manage + use animated cursors within your applications.
http://www.mirkes.de/en/delphi/vcls.php
* TukangOmong 0.0.1 (with source)
Indonesia Text-to-Speech Engine.
http://www.kioss.com/kioss/proyek.php?nama=aTukangOmong
Articles, tips and tricks
=========================
* IntraWeb: A New Way to the Web - by Cary Jensen
IntraWeb is a framework and component set that permits you to quickly
and easily build interactive Web sites using Delphi, Kylix or
C++Builder and it may very well change the way you develop Web
applications from now on.
http://community.borland.com/article/0,1410,29650,00.html
* WebSnap Tips and Tricks - by Nick Hodges
Nick shares some of his tips and tricks to make WebSnap do the things
you need it to do.
http://community.borland.com/article/0,1410,29537,00.html
* Web Services Training: Free Trial! - by Anders Ohlsson
You may not know this, but Borland has an *awesome* Web Services
training CD for sale. And a free teaser for it.
http://community.borland.com/article/0,1410,28381,00.html
* Protect your Delphi Software - by Zarko Gajic
Want to know more about the issues surrounding the protection of your
Delphi applications from any unauthorized usage?
http://delphi.about.com/library/weekly/aa012803a.htm
* "The Big Brother" Delphi Code Toolkit 2 - by Zarko Gajic
Taking control over the system - the Delphi way. Disabling Windows
system keys, Windows shell elements - this time using dWinLock Delphi
component.
http://delphi.about.com/library/weekly/aa012103a.htm
* Top 6 Testing and Debugging Tools - by Zarko Gajic
If you're looking for the best Delphi testing and debugging tools,
look no further. The list contains tools to help you speed up your
development by finding possible bugs, memory leaks, etc.
http://delphi.about.com/od/toppicks/tp/aatpdebug.htm
* Learn the Security Ropes for .NET with this Book - by Lamont Adams
Review of ".NET Security" by Jason Bock, Pete Stromquist, Tom Fischer,
and Nathan Smith.
http://builder.com.com/article.jhtml?id=u00320030109adm01.htm
* How to detect if an application is being debugged - by m3Rlin
www.delphifaq.net/modules.php?op=modload&name=FAQ&op=view&id=214
* How to get the date a file was last accessed - by m3Rlin
www.delphifaq.net/modules.php?op=modload&name=FAQ&op=view&id=215
* Link Label Component - by Daniel Wischnewski
A simple label component for links to web pages, Email, etc.
http://www.delphi3000.com/articles/article_3511.asp
* Extract field from DataSet into TStringList - by Stewart Moss
Component to extract a specific field from a dataset in a TStringList.
Useful for populating TlistBoxes that you dont want to be data aware.
http://www.delphi3000.com/articles/article_3512.asp
* D6 + ADO + SQLServer Convert to Oracle Backend ???? - by Hans Pieters
http://www.delphi3000.com/articles/article_3513.asp
* Save DataSet as CSV Textfile - by Kjetil Rodal-Jalasto
Procedure that saves the content of a DataSet as a CSV textfile, works
fine with both BDE and DBExpress datasets.
http://www.delphi3000.com/articles/article_3514.asp
* Distributed Applications, the easy way II - by Eugene Mayevski
Is there a way to have a flexible data exchange system and don't go to
deep into technical details? This second part of the article describes
basics of MsgConnect usage.
http://www.delphi3000.com/articles/article_3515.asp
* OLE Drag and Drop Delphi Overview - by Herbert Poltnik
http://www.delphi3000.com/articles/article_3520.asp
* Multi Socket Port Scanner - by guy gafni
http://www.delphi3000.com/articles/article_3521.asp
* Adjust a TWinControl's size at RunTime - by quark quark
http://www.delphi3000.com/articles/article_3523.asp
* Delphi ActiveX/Midas Development Hints - by Herbert Poltnik
This document provides a basis for developing multi-tier database
applications that have zero client configuration administration.
http://www.delphi3000.com/articles/article_3524.asp
* Duplicating a Database Record - by Andrew Baylis
http://www.delphi3000.com/articles/article_3525.asp
* Pass a recordset from COM object to ASP VBScript - by Bernhard Angerer
How to return a resultset (dataset) from COM to ASP.
http://www.delphi3000.com/articles/article_3527.asp
* Messing with other applications memory - by Colin Myerscough
http://www.delphi3000.com/articles/article_3528.asp
* Creating a system wide shortcut or hotkey - by Jim McKeeth
http://www.delphi3000.com/articles/article_3529.asp
* How to create a thumbnail from a JPEG image - by Rafael Cotta
http://www.delphi3000.com/articles/article_3530.asp
* OLE Drag and Drop - by Herbert Poltnik
How to drop an email from Outlook into a Delphi form.
http://www.delphi3000.com/articles/article_3533.asp
* Automation Interface Confusions Straightened Out - by Graham Wideman
Interfaces, dispinterfaces, variants, IDispatch, etc.
http://www.wideman-one.com/gw/tech/Delphi/autointf/index.htm
* Understanding Delphi COM (OLE) Interface References, AddRef and All
That - by Graham Wideman
COM References Reference Counting, AddRef and Release, and a test
application to demonstrate how it really works.
http://www.wideman-one.com/gw/tech/Delphi/dragdrop/comrefs/index.htm
* Notes on Delphi Constructors and Destructors - by Graham Wideman
Constructors and Destructors: Virtual or not?
http://www.wideman-one.com/gw/tech/Delphi/ConstDest.htm
* Delphi ActiveX Controls: Unusable in MS Office Document Pages - by
Graham Wideman
Click and paint Problems when single-component ActiveX control
inserted is in Office document pages.
http://www.wideman-one.com/gw/tech/Delphi/dax/index.htm
* Delphi ActiveForm Controls: Clipping bug on scrolled pages ...with
plausible solution... - by Graham Wideman
ActiveForm clipping problem in Office document pages.
http://www.wideman-one.com/gw/tech/Delphi/dax/afxclipbug.htm
* Hardware I/O Port Programming with Delphi and NT - by Graham Wideman
Delphi I/O Port Programming under Windows NT and an I/O Port Map
Manipulator driver (gwiopm.sys).
http://www.wideman-one.com/gw/tech/Delphi/iopm/index.htm
* Precision Timing Under Windows Operating Systems - by Graham Wideman
Measuring Time, and Scheduling Routines under Windows. Checking the
Scheduler granularity. Numerous references.
http://www.wideman-one.com/gw/tech/dataacq/wintiming.htm
* Multitasking discussion - by Graham Wideman
Basics of Processes, Threads, Time Slices and Priority
http://www.wideman-one.com/gw/tech/dataacq/multitasking.htm
* Observing the Timing Behavior of Applications in Windows 95/98/NT
Using LabVIEW - by Graham Wideman
How well can applications that you write in LabVIEW or other languages
perform under Windows OSes? Does LV use Special Magic or simply make
most judicious used of the OS timing services?
http://www.wideman-one.com/gw/tech/dataacq/labview/index.htm
Tutorials
=========
* .NET Remoting - by Alain "Lino" Tadros
This article explains and demonstrates the .NET Remoting framework and
builds Remotable Objects, Hosting servers and Clients to exercise the
different activation models.
http://community.borland.com/article/0,1410,29563,00.html
* Maximize DataSnap efficiency in Delphi - by Bob Swart
This tutorial is mainly concerned about the data throughput bottleneck
between the DataSnap Server and Client, including ways to prevent it
by limiting the amount of data being sent. But, before you can limit
throughput you have to measure it.
http://builder.com.com/article.jhtml?id=u00220030117swa01.htm
* Tweak App Performance with Index Tuning Wizard - by Eric Roland
Debugging is a critical aspect of any development project. SQL Server
provides the Profiler tool and the Index Tuning Wizard to aid you in
the search for rogue code in your applications.
http://builder.com.com/article.jhtml?id=u00320021220ero01.htm
* .NET Demystifies Encryption - by William Dawson
.NET makes cryptography a little simpler by putting everything into
one SDK. Find out how to encrypt and decrypt a text file with the
System.Security.Cryptography namespace. Code in C# but good tutorial.
http://builder.com.com/article.jhtml?id=u00220030120wdx01.htm
* OLE Drag and Drop In Delphi - by Graham Wideman
Comprehensive tutorial with source code examples.
http://www.wideman-one.com/gw/tech/Delphi/dragdrop/index.htm
Other Links
===========
* Borland Rolls Out Branding Effort - by Scott Van Camp
Borland Software Corp., a company considered dead in the water in the
mid-1990s but now in the midst of a comeback, has launched a $12
million ad campaign to reintroduce the Borland brand.
http://www.technologymarketing.com/mc/news/
article_display.jsp?vnu_content_id=1807206
________________________________________________________________________
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 are
prizes for 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 and commercial 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 on the
web site. For details contact Dave at <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=p43
________________________________________________________________________
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.
________________________________________________________________________
Group home page: http://groups.yahoo.com/group/pascal-newsletter/
Subscribe/join: pascal-newsletter-subscribe@yahoogroups.com
Unsubscribe/leave: pascal-newsletter-unsubscribe@yahoogroups.com
Report spam/abuse: abuse@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.
________________________________________________________________________
|