Pascal Newsletter #44
The full source code examples of this issue are available for download.
![]() |
![]() |
Pascal Newsletter #44 - 27-FEB-2003 Contents 1. A few words from the editor 2. Disk operations - How to check if a diskette is in the drive unit or if it is protected, and more... 3. Using MS Word as report generator 4. IDE harddisk serial number - Using S.M.A.R.T. IOCTL API 5. In the news - Borland releases Optimizeit Profiler for .NET - SideWinder: Borland is developing a C# IDE for .NET - BorCon Lite 2003 - Other news and articles 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 Rafael Ribas Aguiló, Igor Siticov and Alex Konshin for contributing articles for this issue, and I'm glad to give the prizes for this issue to the latter two: * Igor Siticov (Using MS Word as report generator) · llPDFLib v1.1 - by llionsoft, Shareware ($70, $280 with source) llPDFLib is pure Object Pascal library for creating PDF documents. Does not use any DLL and external third-party software to generate PDF files. Library consists of TPDFDocument component with properties and methods like Delphi's TPrinter but designed to generate a PDF file. http://www.llion.net/ * Alex Konshin (IDE harddisk serial number - Using S.M.A.R.T. IOCTL API) · 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 For the next issue, we have available the following prizes for two of our contributors: * LMD DesignPack - by LMD Innovative - Shareware (EUR 59) Five components for adding design features to your applications (an Object Inspector clone, a form designer and diagram based controls), with full source code and extensive demo projects demonstrating advanced features - even a report designer is basically included! http://www.ceberus.com/lmd/products/index.php3#P4 * 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 a very limited time, Greatis Software is offering Greatis Object Inspector Pro with a significant discount, exclusive for subscribers to this newsletter and vistitors of our web site. Check the ad below the editor's note. What happened to the Inline Assembler in Delphi series? Is it over? Definitely not. In future issues we'll be seeing some sample uses of inline assembler, starting in the next issue with 128-bit arithmetic. Meanwhile, I hope you enjoy this issue. Regards, Ernesto De Spirito eds2004 @ latiumsoftware.com __________________ Collaborated in this issue: Dave Murray ________________________________________________________________________ Object Inspector Pro SPECIAL: $29.95 (save $20 from the regular price!). Greatis Object Inspector Pro is a suite of components that includes a component for accessing all published properties and events of any component, a common inspector that can be used for inspecting everything in your application, and a component inspector that mimics the IDE Object Inspector. http://www.latiumsoftware.com/en/objinspspecial.php ________________________________________________________________________ 2. Disk operations - How to check if a diskette is in the drive unit or if it is protected, and more... By Rafael Ribas Aguiló <rribas @ facilities.com.br> http://www.facilities.com.br/ If you want to be sure a diskette is in the drive, without showing those strange message errors, you should use these functions: function ComposeFileName(Dir, Name: string): string; function HasDiskSpace({$IFDEF WIN32}Drive: string{$ELSE}Drive: char{$ENDIF}; MinRequired: longint): boolean; function GetDirectorySize(const Path: string): longint; function GetFileSizeByName(const Filename: string): longint; function IsDiskRemovable(Drive: char): boolean; function IsDiskInDrive(Drive: char): boolean; function IsDiskWriteProtected(Drive: char): boolean; function AskForDisk(Drive: char; Msg: string; CheckWriteProtected: boolean): boolean; procedure GetAvailableDrives(DriveType: TDriveType; Items: TStrings); These functions are implemented in the lDrives unit (attached). ________________________________________________________________________ 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. Using MS Word as report generator By Igor Siticov SiComponents: http://www.sicomponents.com Why not use MS Word as a report generator in your projects? We can easily build a report and then allow the user to modify it in any way he/she wants using this well-known editor. The example below shows how to build the report based on the contents of a StringGrid. procedure TsiGridReporter.ShowReport; var Range: Variant; i, j: integer; begin if FGrid = nil then raise Exception.Create('No grid selected!'); try FWordApp := CreateOleObject('Word.Application'); except raise Exception.Create('Cannot start MS Word!'); end; FWordApp.Visible := True; FWordApp.Documents.Add; if FShowDate then begin Range := FWordApp.Documents.Item(1); Range := Range.Sections.Item(1); Range := Range.Headers.Item(1).Range; Range.Text := 'Date: ' + DateToStr(Date) + ' Time: ' + TimeToStr(Time); end; Range := FWordApp.Documents.Item(1); Range := Range.Sections.Item(1); Range := Range.Footers.Item(1); Range.Range.Text := 'Page:'; Range.Range.ParagraphFormat.Alignment := ord(waAlignParagraphRight); Range.PageNumbers.Add; FWordApp.Documents.Item(1).Paragraphs.Add; Range := FWordApp.Documents.Item(1).Range( FWordApp.Documents.Item(1).Paragraphs.Item( FWordApp.Documents.Item(1).Paragraphs.Count - 1).Range.End, FWordApp.Documents.Item(1).Paragraphs.Item( FWordApp.Documents.Item(1).Paragraphs.Count - 1).Range.End); Range.Text := FTitle; Range.Bold := fsBold in FTitleFont.Style; Range.Italic := fsItalic in FTitleFont.Style; Range.Underline := fsUnderline in FTitleFont.Style; Range.Font.StrikeThrough := fsStrikeOut in FTitleFont.Style; Range.Font.Name := FTitleFont.Name; Range.Font.Size := FTitleFont.Size; Range.Font.ColorIndex := ord(FTitleColor); Range.ParagraphFormat.Alignment := ord(FTitleAlignment); FWordApp.Documents.Item(1).Paragraphs.Add; FWordApp.Documents.Item(1).Paragraphs.Add; Range := FWordApp.Documents.Item(1).Range( FWordApp.Documents.Item(1).Paragraphs.Item( FWordApp.Documents.Item(1).Paragraphs.Count - 1).Range.End, FWordApp.Documents.Item(1).Paragraphs.Item( FWordApp.Documents.Item(1).Paragraphs.Count - 1).Range.End); FWordApp.Documents.Item(1).Tables.Add(Range, FGrid.RowCount, FGrid.ColCount); Range := FWordApp.Documents.Item(1).Tables.Item( FWordApp.Documents.Item(1).Tables.Count); for i := 1 to FGrid.RowCount do for j := 1 to FGrid.ColCount do begin Range.Cell(i, j).Range.InsertAfter(FGrid.Cells[j-1, i-1]); if (i <= FGrid.FixedRows) or (j <= FGrid.FixedCols) then begin Range.Cell(i, j).Range.Bold := True; Range.Cell(i, j).Range.Shading.BackgroundPatternColorIndex := ord(wcGray25); end else begin Range.Cell(i, j).Range.Bold := fsBold in FCellFont.Style; Range.Cell(i, j).Range.Italic := fsItalic in FCellFont.Style; Range.Cell(i, j).Range.Underline := fsUnderline in FCellFont.Style; Range.Cell(i, j).Range.Font.StrikeThrough := fsStrikeOut in FCellFont.Style; Range.Cell(i, j).Range.Font.Name := FCellFont.Name; Range.Cell(i, j).Range.Font.Size := FCellFont.Size; // Range.Cell(i, j).Range.Font.ColorIndex := ord(FCellColor); Range.Cell(i, j).Range.Shading.BackgroundPatternColorIndex := FCellColor; end; end; end; This example is just one method of the component attached to this article. This component also has the PrintReport and PrintPreview methods. See the attached source code for details. This component could give you just the first step for creating your own full featured report generator based on using MS Word. PS: The component and the source code are FREEWARE, so you can use them as you want. __________________ 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 ________________________________________________________________________ Vote for the Pascal Newsletter in The Programming Pages! http://www.programmingpages.com/?r=latiumsoftwarecomenpascal ________________________________________________________________________ 4. IDE harddisk serial number - Using S.M.A.R.T. IOCTL API By Alex Konshin http://home.earthlink.net/~akonshin/ Most FAQs recommend the use of GetVolumeInformation for getting the "hard disk serial number", but what this function actually gets is the volume serial number, not the manufacturer's hard disk serial number. The volume serial no. is assigned and changed during the formatting of the partition. Some companies use cloning tools for installing software on all new computers, copying from one hard disk to all the others. Of course, the volume serial numbers for these disks are identical. You can get the real serial number of IDE hard disk, model name, firmware revision, and other IDE hard disk information using the S.M.A.R.T. IOCTL API. // Copyright (c) 2000 Alex Konshin program IdeSN; // PURPOSE: Simple console application that extracts // the first IDE disk serial number. {$APPTYPE CONSOLE} uses Windows, SysUtils; // only for Win32Platform and SysErrorMessage // ------------------------------------------------------------- function GetIdeDiskSerialNumber : String; type TSrbIoControl = packed record HeaderLength : ULONG; Signature : Array[0..7] of Char; Timeout : ULONG; ControlCode : ULONG; ReturnCode : ULONG; Length : ULONG; end; SRB_IO_CONTROL = TSrbIoControl; PSrbIoControl = ^TSrbIoControl; TIDERegs = packed record bFeaturesReg : Byte; // Used for specifying SMART "commands". bSectorCountReg : Byte; // IDE sector count register bSectorNumberReg : Byte; // IDE sector number register bCylLowReg : Byte; // IDE low order cylinder value bCylHighReg : Byte; // IDE high order cylinder value bDriveHeadReg : Byte; // IDE drive/head register bCommandReg : Byte; // Actual IDE command. bReserved : Byte; // reserved. Must be zero. end; IDEREGS = TIDERegs; PIDERegs = ^TIDERegs; TSendCmdInParams = packed record cBufferSize : DWORD; irDriveRegs : TIDERegs; bDriveNumber : Byte; bReserved : Array[0..2] of Byte; dwReserved : Array[0..3] of DWORD; bBuffer : Array[0..0] of Byte; end; SENDCMDINPARAMS = TSendCmdInParams; PSendCmdInParams = ^TSendCmdInParams; TIdSector = packed record wGenConfig : Word; wNumCyls : Word; wReserved : Word; wNumHeads : Word; wBytesPerTrack : Word; wBytesPerSector : Word; wSectorsPerTrack : Word; wVendorUnique : Array[0..2] of Word; sSerialNumber : Array[0..19] of Char; wBufferType : Word; wBufferSize : Word; wECCSize : Word; sFirmwareRev : Array[0..7] of Char; sModelNumber : Array[0..39] of Char; wMoreVendorUnique : Word; wDoubleWordIO : Word; wCapabilities : Word; wReserved1 : Word; wPIOTiming : Word; wDMATiming : Word; wBS : Word; wNumCurrentCyls : Word; wNumCurrentHeads : Word; wNumCurrentSectorsPerTrack : Word; ulCurrentSectorCapacity : ULONG; wMultSectorStuff : Word; ulTotalAddressableSectors : ULONG; wSingleWordDMA : Word; wMultiWordDMA : Word; bReserved : Array[0..127] of Byte; end; PIdSector = ^TIdSector; const IDE_ID_FUNCTION = $EC; IDENTIFY_BUFFER_SIZE = 512; DFP_RECEIVE_DRIVE_DATA = $0007c088; IOCTL_SCSI_MINIPORT = $0004d008; IOCTL_SCSI_MINIPORT_IDENTIFY = $001b0501; DataSize = sizeof(TSendCmdInParams)-1+IDENTIFY_BUFFER_SIZE; BufferSize = SizeOf(SRB_IO_CONTROL)+DataSize; W9xBufferSize = IDENTIFY_BUFFER_SIZE+16; var hDevice : THandle; cbBytesReturned : DWORD; pInData : PSendCmdInParams; pOutData : Pointer; // PSendCmdOutParams Buffer : Array[0..BufferSize-1] of Byte; srbControl : TSrbIoControl absolute Buffer; procedure ChangeByteOrder( var Data; Size : Integer ); var ptr : PChar; i : Integer; c : Char; begin ptr := @Data; for i := 0 to (Size shr 1)-1 do begin c := ptr^; ptr^ := (ptr+1)^; (ptr+1)^ := c; Inc(ptr,2); end; end; begin Result := ''; FillChar(Buffer,BufferSize,#0); if Win32Platform=VER_PLATFORM_WIN32_NT then begin // Windows NT, Windows 2000, Windows XP // Get SCSI port handle hDevice := CreateFile('\\.\Scsi0:', // Note: '\\.\C:' required administrative privileges. GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); if hDevice=INVALID_HANDLE_VALUE then Exit; try srbControl.HeaderLength := SizeOf(SRB_IO_CONTROL); System.Move('SCSIDISK',srbControl.Signature,8); srbControl.Timeout := 2; srbControl.Length := DataSize; srbControl.ControlCode := IOCTL_SCSI_MINIPORT_IDENTIFY; pInData := PSendCmdInParams(PChar(@Buffer) +SizeOf(SRB_IO_CONTROL)); pOutData := pInData; with pInData^ do begin cBufferSize := IDENTIFY_BUFFER_SIZE; bDriveNumber := 0; with irDriveRegs do begin bFeaturesReg := 0; bSectorCountReg := 1; bSectorNumberReg := 1; bCylLowReg := 0; bCylHighReg := 0; bDriveHeadReg := $A0; bCommandReg := IDE_ID_FUNCTION; end; end; if not DeviceIoControl( hDevice, IOCTL_SCSI_MINIPORT, @Buffer, BufferSize, @Buffer, BufferSize, cbBytesReturned, nil ) then Exit; finally CloseHandle(hDevice); end; end else begin // Windows 95 OSR2, Windows 98, Windows ME hDevice := CreateFile( '\\.\SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0 ); if hDevice=INVALID_HANDLE_VALUE then Exit; try pInData := PSendCmdInParams(@Buffer); pOutData := @pInData^.bBuffer; with pInData^ do begin cBufferSize := IDENTIFY_BUFFER_SIZE; bDriveNumber := 0; with irDriveRegs do begin bFeaturesReg := 0; bSectorCountReg := 1; bSectorNumberReg := 1; bCylLowReg := 0; bCylHighReg := 0; bDriveHeadReg := $A0; bCommandReg := IDE_ID_FUNCTION; end; end; if not DeviceIoControl( hDevice, DFP_RECEIVE_DRIVE_DATA, pInData, SizeOf(TSendCmdInParams)-1, pOutData, W9xBufferSize, cbBytesReturned, nil ) then Exit; finally CloseHandle(hDevice); end; end; with PIdSector(PChar(pOutData)+16)^ do begin ChangeByteOrder(sSerialNumber,SizeOf(sSerialNumber)); SetString(Result,sSerialNumber,SizeOf(sSerialNumber)); end; end; // ============================================================= var s : String; rc : DWORD; begin s := GetIdeDiskSerialNumber; if s='' then begin rc := GetLastError; if rc=0 then WriteLn('IDE drive does not support SMART feature') else WriteLn(SysErrorMessage(rc)); end else WriteLn('Disk serial number: ''', s,''''); ReadLn; end. Notes: - The code is meant only for IDE drives supporting S.M.A.R.T. (Self Monitoring, Analysis and Reporting Technology). For SCSI-2 drives see: http://www.delphi3000.com/articles/article_1174.asp - IDE hardware should support S.M.A.R.T. and it has to be enabled. - Windows 95 does not support this feature until Windows 95 OSR2. The code works with Windows 95 OSR2/98/98SE/Me/NT4/2000/XP. - Windows 9x: SMARTVSD.VXD must be installed: just copy it from the System folder (typically C:\WINDOWS\SYSTEM) to the System\IoSubsys folder (typically C:\WINDOWS\SYSTEM\IOSUBSYS) and reboot. - Windows NT/2000/XP: The code doesn't require administrative priveleges and works under the 'everyone' account. - For more information about the SMART IOCTL API see the sample SmartApp at the MSDN Knowledge Base: http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B208048 - If you need to get information about a slave disk or a disk that attached to your secondary IDE controller then see example IdeInfo2 on my homepage: http://home.earhlink.net/~akonshin/ - For more information about S.M.A.R.T. and the other standards related to ATA storage devices see Technical Committee T13 homepage: http://www.t13.org/ You can find information related to the topic of this article on pages 87-105 of the document http://www.t13.org/project/d1321r3.pdf ______________ Alex Konshin is a Sr. Software Engineer and a former Delphi programmer who now programs in Delphi as a hobby, but yet has been mentioned as a contributor in Delphi 7. You can find some useful freeware components with source code at his web site: http://home.earthlink.net/~akonshin/ ________________________________________________________________________ How would you rate the newsletter? Rate the newsletter in the Top 200 Delphi ranking! http://top200.jazarsoft.com/delphi/rank.php3?id=latium ________________________________________________________________________ 5. In the news Borland releases Optimizeit Profiler for .NET ============================================= Optimizeit Profiler is a new performance assurance solution for the .NET Framework. Optimizeit Profiler supports all .NET managed code and makes performance tuning easier by providing real-time performance profiling that quickly identifies and prioritizes performance issues, highlighting the relevant line of source code for immediate resolution, enabling programmers to deliver high-performance Microsoft .NET Framework based applications faster. For more information: - Optimizeit Profiler http://www.borland.com/opt_profiler/index.html - Borland Launches Performance Assurance Solution for Microsoft .NET Framework http://www.planetanalog.com/pressreleases/bizwire/57199 - Microsoft Partners Rally Around Visual Studio .NET http://www.internetnews.com/dev-news/print.php/1582361 SideWinder: Borland is developing a C# IDE for .NET =================================================== Borland is working on the development of an IDE for C#, which is currently known as SideWinder, but so far this is just the public codename of this product, and it doesn't necessarily mean that it will be the product's name when it gets released (although it is pretty likely). Here are some news and articles about SideWinder: - 28-JAN-2003: Borland Becomes First to License the Microsoft .NET Framework Software Development Kit http://www.certificationsuccess.com/index.cfm?pageid=401 - 31-JAN-2003: Borland prepares new IDE for .Net http://www.vnunet.com/News/1138406 - 04-FEB-2003: Borland moves ahead with .NET tools; inks pact with Microsoft http://www.adtmag.com/article.asp?id=7224 - 04-FEB-2003: Borland to offer IDE for Microsoft's .Net http://www.infoworld.com/article/03/02/04/HNsidewinder_1.html - 04-FEB-2003: Borland targets .Net developers http://news.com.com/2100-1001-983321.html http://msnbc-cnet.com.com/2100-1001-983321.html http://www.businessweek.com/technology/cnet/stories/983321.htm - 07-FEB-2003: First SideWinder screenshots http://www.drbob42.com/SideWinder/home.htm - 14-FEB-2003: Interview with Jason Vokes (Borland EMEA) about .NET development at Borland, including SideWinder and Delphi for .NET http://www.drbob42.com/SideWinder/interview.htm SideWinder will be the first product of project Galileo, a much larger Borland project announced at BorCon 2002: * Borland to wield tools against Microsoft - By Wylie Wong http://news.com.com/2100-1001-954958.html Galileo's objective is to bring a 100% .NET multiple language IDE targeted at multiple platforms (a sort of cross-platform Visual Studio .NET, if you want to see it that way, but it will be more than that, since for example it would integrate modeling and design). BorCon Lite 2003 ================ If you love Delphi, you should join David I, John Kaster, Ray Konopka, Michael Li, Cary Jensen, and other Delphi developers in Houston this March at BorCon Lite 2003. http://community.borland.com/article/0,1410,29781,00.html Other news and articles ======================= * Flurry Of New Tools Target Microsoft Visual Studio .Net Developers - by Gregg Keizer http://www.techweb.com/wire/story/TWB20030211S0004 * Microsoft rebuilds .Net tools - by Martin LaMonica Borland tools will be integrated into Visual Studio.Net. http://news.com.com/2100-1001-984129.html * .NET: Great Hope or Great Hype - by Alan C. Moore, Ph.D www.delphizine.com/opinion/2003/03/di200303fn_o/di200303fn_o.asp * Short interview with David Intersimone (Borland's VP of Developer Relations) about Kylix. http://www.programmersparadise.com/promo/QA_062402_2.pasp * Borland Defies the Skeptics - by Elise Ackerman Days after President and CEO Dale Fuller joined Borland Software in April 1999, an industry pundit singled out the Scotts Valley company as one of five tech firms unlikely to make it to the new millennium. Fuller has been gleefully quoting the prediction ever since... http://www.belleville.com/mld/belleville/business/4865330.htm * Sip From The Firehose: A message from Borland to developers - David I We've begun an advertising campaign targeted at executives in charge of development. The topic? Borland's new application lifecycle studio of products. http://community.borland.com/article/0,1410,29597,00.html * Blog with Delphi and Borland news http://svd.blogspot.com/ ________________________________________________________________________ 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 ________________________________________________________________________ 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 ________________________________________________________________________ JfControls Library. Multi-language. Multi-appearance. Skins. Privileges. More than 40 integrated and customizable components. Impressive GUI. Centralized resources administration. Multiple programming problems solved. For Delphi 3-7 and C++ Builder 3-6. http://www.jfactivesoft.com/ ________________________________________________________________________ 7. Delphi on the Net By Dave Murray <irongut @ vodafone.net> Components, libraries and utilities =================================== Shareware/Commercial -------------------- * LMD DesignPack - by LMD Innovative - Shareware (EUR 59) Five components for adding design features to your applications (an Object Inspector clone, a form designer and diagram based controls), with full source code and extensive demo projects demonstrating advanced features - even a report designer is basically included! http://www.ceberus.com/lmd/products/index.php3#P4 * NTTools 7 For Delphi - by i-tivity (US$39.95) Stop battling the Windows NT Security API! Get your copy of NTTools 7 for Delphi 4/5/6/7 now and save countless hours with this collection of 40 VCL components written specifically to deal with the Windows NT Security functions. Full source code is included. http://www.i-tivity.biz/nttools.htm Freeware -------- * ODBCTools For Delphi - by i-tivity (with source) ODBCTools is a complete replacement package for the BDE and consists of the following components: ODBC_Database, ODBC_Table, ODBC_Exec, ODBC_Conformance, ODBC_TableList, ODBC_FieldList, ODBC_Info, ODBC_PrimaryKeys, ODBC_Procedures, ODBC_DSNList and ODBC_Admin. http://www.i-tivity.biz/odbctools.htm * TurboPower SysTools v4.03 - by TurboPower (with source) A library of utility routines & algorithms for Delphi, C++Builder and environments that support COM. Among other things, it supports 1-D and 2-D bar codes, sorting, money routines, logging classes, high- precision math and a run-time math expression analyzer. https://sourceforge.net/projects/tpsystools/ * Interbase 6.0 Open Edition Can't find the link to download the free version of Interbase at Borland's web site? Well, here it is: http://info.borland.com/devsupport/interbase/opensource/ Articles, tips and tricks ========================= * New Delphi feature: Multiple inheritance for interfaces in Delphi for .NET - by John Kaster Update 3 of the Delphi for .NET preview includes compiler enhancements for multiple inheritance for interfaces. http://community.borland.com/article/0,1410,29779,00.html * Delphi for .NET preview Update 3 available for download - John Kaster An update containing improvements to the compiler, RTL and VCL of the Delphi for .NET preview is now available for download. http://community.borland.com/article/0,1410,29780,00.html * Implementing Callbacks to a Datasnap Server Interface - Xavier Pacheco Add the ability for a Datasnap Server to call your client application through a callback. http://community.borland.com/article/0,1410,29539,00.html * Metadata.NET - by Noel Rice This article shows the capability of requesting information from .NET providers at runtime and deals with Databases, Table, Fields, constraints, Index and data Types. http://community.borland.com/article/0,1410,29708,00.html * Exchanging Raw Data over the Network 2 - by Zarko Gajic An introduction to sending data over the network using Delphi + Indy. Focuses on sending / receiving record data and raw (binary) data using TCP/IP connections. http://delphi.about.com/library/weekly/aa020403a.htm * How to display fonts in a list box - by m3Rlin www.delphifaq.net/modules.php?op=modload&name=FAQ&op=view&id=216 * How to delete a file the next time the PC is rebooted - by m3Rlin www.delphifaq.net/modules.php?op=modload&name=FAQ&op=view&id=217 * How to convert a long filename to a short filename - by m3Rlin www.delphifaq.net/modules.php?op=modload&name=FAQ&op=view&id=218 * How to create a Access-Database (mdb) without Access - by Alex Schlecht Using MS-Jet-Engine to create a *.mdb File. http://www.delphi3000.com/articles/article_3536.asp * Advanced Indy 1: Server Side Techniques - by Romeo Lefter http://www.delphi3000.com/articles/article_3538.asp * Creating "Hidden" Registry Values - by Daniel Wischnewski Using the undocumented MS Native API. http://www.delphi3000.com/articles/article_3539.asp * Delphi and Automation with Word - by Herbert Poltnik Automation allows one application to control another application. The application being controlled is called an automation server (in our case Word). The application controlling the server is called an automation controller. http://www.delphi3000.com/articles/article_3541.asp * Event Chain Mechanism - by Alex Wijoyo How can we attach more than one event handler to a component event? http://www.delphi3000.com/articles/article_3543.asp * BPL Analyze - by quark quark What in BPL? How many Units in BPL? http://www.delphi3000.com/articles/article_3548.asp * How to load big bitmaps with few memory requirement? - by Alex Sanchez http://www.swissdelphicenter.ch/en/showcode.php?id=1526 * How to disable CTRL+ALT+DELETE under XP? - by Andreas Kirchmeyer http://www.swissdelphicenter.ch/en/showcode.php?id=1528 * How to set the background color of a MDI Form? - by Alex Pierson http://www.swissdelphicenter.ch/en/showcode.php?id=1554 * How to resize an image (undistorsioned result image)? - Josep Ma Feliu http://www.swissdelphicenter.ch/en/showcode.php?id=1463 * How to show a preview for a TRichEdit/ TRxRichEdit? - by Robert Dunn http://www.swissdelphicenter.ch/en/showcode.php?id=1467 * How to use the Microsoft Speech API? - by Marco Parreira http://www.swissdelphicenter.ch/en/showcode.php?id=1572 * How to print a TStringgrid? - by Reinhard Schatzl http://www.swissdelphicenter.ch/en/showcode.php?id=1577 * How to enumerate the logged in users on a Remote or Local NT Workstation? - by Manfred Ruzicka http://www.swissdelphicenter.ch/en/showcode.php?id=1578 * How to install an INF file with Delphi? - by patrick http://www.swissdelphicenter.ch/en/showcode.php?id=1585 * Creating an Internet Explorer-style User Interface, Part 1 By Fabio Lucarelli <http://www.pinnaclepublishing.com/dd/DDmag.nsf/0/ 95505F4719043C1185256CC300743624> Tutorials ========= * The Dynamics of Agile Software Processes, Part I - by Randy Miller Part one describes the characteristics of good agile software development process design. http://bdn.borland.com/article/0,1410,29726,00.html * Adding Auto-Persistence Capabilities To Options Dialogs - by D. Jewell How to avoid the pain of re-coding the saving and restoring of your user-configurable settings for each and every new application, with a little bit of lateral thinking. http://www.thedelphimagazine.com/samples/1560/1560.htm * Using Customisable Keyboard Shortcuts - by Stephen Posey Demonstrates how keyboard shortcuts can be very easy using Actions. http://www.thedelphimagazine.com/samples/1521/1521.htm * Extracting XML Data From SQL Server 2000 - by Jani Järvinen Describes how to use the XML features built into SQL Server 2000 from your Delphi applications, through ADO, HTTP and SOAP. http://www.thedelphimagazine.com/samples/1507/1507.htm * Enhance Reuse by Embracing Service-Oriented Architecture - T Landgrave Thinking of your apps strictly in terms of components can limit your reuse options. Find out how to increase your options by defining applications as services. http://builder.com.com/article.jhtml?id=u00320030129lan01.htm * Adventures in Kylix - by James R. Knowles A blog style tutorial for Kylix. http://www.ifm-services.com/people/jamesk/kylix/ ________________________________________________________________________ YOU CAN HELP US We need your help to keep this newsletter going and growing. You can help by referring the newsletter to your colleagues: http://www.latiumsoftware.com/en/pascal/delphi-newsletter.php Or you can help by voting for us in some or all of these rankings to give more visibility to our web site and thus increase the number of subscriptions to this newsletter: http://www.sandbrooksoftware.com/cgi-bin/TopSite2/rankem.cgi?id=latium http://news.optimax.com/delphi/links/links.exe/click?id=70C517ECAE6E http://www.programmingpages.com/?r=latiumsoftwarecomenpascal http://www.top219.org/cgi-bin/vote.cgi?delphi&83 http://top100borland.com/in.php?who=20 http://top200.jazarsoft.com/delphi/rank.php3?id=latium http://213.65.224.200/cgi-bin/toplist.cgi/hits?Id=80 It's just a few seconds for you that REALLY mean a lot to us. Don't forget we also need articles for this newsletter and there is a prize for 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 <eds2004 @ latiumsoftware.com>. We are also looking for shareware authors who would like to offer their components or applications as prizes for articles in the newsletter. In return you will be promoted in this newsletter and the Latium Software web site. For more information contact Dave <irongut @ vodafone.net>. ________________________________________________________________________ If you haven't received the full source code examples for this issue, you can get them from http://www.latiumsoftware.com/download/p0044.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!






