Pascal Newsletter #43
The full source code examples of this issue are available for download.
![]() |
![]() |
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.sedlan.com/dbgrid_footer.php * 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 eds2004 @ 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. ________________________________________________________________________ When was the last time you voted for the Pascal Newsletter? Please support this initiative voting for us in The Programming Top 100! http://www.sandbrooksoftware.com/cgi-bin/TopSite2/rankem.cgi?id=latium ________________________________________________________________________ 3. 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-7 and 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://groups.yahoo.com/group/components/ Subscription: http://groups.yahoo.com/group/components/join components-subscribe@yahoogroups.com * Software Developers: This is a forum for discussions about software development and to share experience in the work, professional or commercial environments. It is not a programming forum, matters treated here are supposed to be more general or language independent. http://groups.yahoo.com/group/software-developers/ Subscription: http://groups.yahoo.com/group/software-developers/join software-developers-subscribe@yahoogroups.com ________________________________________________________________________ 7. Delphi on the Net By Dave Murray <irongut @ vodafone.net> Components, libraries and utilities =================================== Shareware/Commercial -------------------- * LMD-Tools 6.1 - 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.ceberus.com/lmd/products/lmdtool6/index.php3 * 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/dragdrop.exe * 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/cs/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.sandbrooksoftware.com/cgi-bin/TopSite2/rankem.cgi?id=latium http://news.optimax.com/delphi/links/links.exe/click?id=70C517ECAE6E http://www.programmingpages.com/?r=latiumsoftwarecomenpascal http://www.top219.org/cgi-bin/vote.cgi?delphi&83 http://top100borland.com/in.php?who=20 http://top200.jazarsoft.com/delphi/rank.php3?id=latium http://213.65.224.200/cgi-bin/toplist.cgi/hits?Id=80 It's just a few seconds for you that REALLY mean a lot to us. Don't forget we also need articles for this newsletter and there 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 <eds2004 @ 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/download/p0043.zip ________________________________________________________________________ This newsletter is provided "AS IS" without warranty of any kind. Its use implies the acceptance of our licensing terms and disclaimer of warranty you can read at http://www.latiumsoftware.com/en/legal.php where you will also find a note about legal trademarks. Articles are copyright of their respective authors and they are reproduced here with their permission. You can redistribute this newsletter as long as you do it in full (including copyright notices), without changes, and gratis. ________________________________________________________________________ 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? eds2004 @ latiumsoftware.com ________________________________________________________________________ Latium Software http://www.latiumsoftware.com/en/index.php Copyright (c) 2003 by Ernesto De Spirito. All rights reserved. ________________________________________________________________________ |
The full source code examples of this issue are available for download.
![]() |
Errors? Omissions? Comments? Please contact us!






