Pascal Newsletter #27 - 10-OCT-2001
INDEX
1. A FEW WORDS FROM THE EDITOR
2. BAR CODES (I)
- Code 39
- What can be found in the Net about code 3 of 9
- Code 128
- The problem of even-length numbers
3. POCKETSTUDIO
- The POWER of PASCAL in the PALM of your hand!
- Benefits
- Features
- Bonus tools
- System requirements
- Download
- More information
4. YAPI - YET ANOTHER PRINTER INTERFACE
- Simplest Use
- Why Yapi is Easy to Understand
- Yapi's Extra Encapsulation – the concept of a "Report Line"
- Complicated Reports
- Some Comparisons
- Conclusion
5. NEWS
- Delphi 6 Update Pack
- Kylix.sk
6. TIPS & TRICKS
- Detecting if the screensaver is running
- Refreshing a DriveComboBox
- Capturing keyboard messages at application level
- Knowing when a form is minimized
- Opening comma-delimited data files
7. DELPHI ON THE NET
________________________________________________________________________
1. A FEW WORDS FROM THE EDITOR
In this issue I'm glad to present another article from Alirio Gavidia,
and I have the great pleasure to announce the release of PocketStudio,
a Delphi-like IDE for Palm OS application development. I'm also glad
to introduce Yapi, a set of freeware and shareware VCL components to
ease printing, and Kylix.sk, a new web site for Kylix users.
I'm happy to see that our Delphi-en forum at Yahoo! Groups keeps growing
and now has more than 250 members.
http://groups.yahoo.com/group/delphi-en
I'd like to invite you to join the group to increase the number of
members and help the group reach the "critical mass" to make the forum
alive.
Subscription:
http://groups.yahoo.com/group/delphi-en/join
delphi-en-subscribe@yahoogroups.com
You can configure your forum subscription to convert or not to convert
messages to HTML format, or to avoid getting the messages in your email
(you would be able to see them on the web).
Our forum for Kylix programmers doesn't have much movement yet, but also
keeps growing. To subscribe:
http://espanol.groups.yahoo.com/group/kylixgroup/join
kylixgroup-subscribe@gruposyahoo.com
And not only the forums grow, but also this newsletter, which has
recently surpassed the 4000 subscribers.
Well, I've had a busy month... If I have unintentionally forgotten to
mention anything, please forgive me and let me know.
Greetings,
Ernesto De Spirito
eds2008 @ latiumsoftware.com
__________________
Collaborated in this issue: Pedro Pablo Oviedo Vera, Luis Hurtado and
Álvaro Lapacó.
________________________________________________________________________
JfControls Library. Multi-language. Multi-appearance. Skins. Privileges.
More than 40 integrated and customizable components. Impressive GUI.
Centralized resources administration. Multiple programming problems
solved. For Delphi 3-2006 & C++ Builder 3-6. http://www.jfactivesoft.com
________________________________________________________________________
2. BAR CODES (I)
By Alirio A. Gavidia
Translated by Pedro Pablo Oviedo Vera
This article, in two parts, tries to address the basic theory about the
creation of bar codes and the creation from Delphi of these codes.
There is a whole set of symbologies for bar codes. We will focus on
"Code 39" and "Code 128". The reason is that most of the bar readers I
have found support the first, and the second has an interesting
optimization (it takes up less space).
The codes that we will analyze are based on two elements that we will
refer as bar and space, we also refer two continuous bars as a wide bar,
and the same with spaces. However, a wide bar does not have to be the
double of a normal bar. For code 39 this is true, but it is a minimum
measurement, not maximum. Combined under certain rules, we generate the
pattern that matters us.
Code 39
=======
It is not first (before are "Codabar" and "Interleaved 2 of 5"), but it
is first in something: alphanumeric support. Each "character" of Code 39
has four spaces and five bars combined in such a way that there are
three wide (3 of 9) and five thin, so each character measures the same.
There are 44 different symbols and a start/stop character normally
referred as "*". There is no predefined limit in the overall length of
the code and each character begins and finishes with a bar.
Problems: The start/stop character (asterisk) is equal to an inverted
"P". This can generate troubles for the readers. Originally the code was
not defined with a verification character and for this reason nowadays
many readers still read the code without a verification character.
However, I recently tripped over one of those applications that require
the "Checksum". It was a cash register machine. In order to calculate
the number in question, all character values of the data are added up
and the result is divided by 43. The rest or module is the value that
must be placed before the stop character.
There is an ASCII mode that allows to represent 128 characters of code
ASCII, but this turns several characters in a combination of two, thus
almost duplicating the width of the whole code. This is not only the bad
thing. It happens that if you code in ASCII the reader must be set that
way, or else the pairs will be read like separate elements. For example,
the word
"Code+"
in ASCII mode
"C+O+D+E$K"
I will not make use of the ASCII mode option.
What can be found in the Net about code 3 of 9
==============================================
In one occasion I had in my hands a type-39 character font for Windows.
It included only digits, start/stop chars and not much more. For most
applications that don't require alphanumeric codes, it was more than
enough. It surprised me to investigate the amazingly high prices for
bar codes libraries and utilities. I even found a company which sells
the font.
If you look in Altavista for 'Z:3of9 BarCode' you shall find the font
by Bob Zormeir (bobz@serv.net), which supports digits, capital letters
and the symbols: - . * $ / % +. It's of free distribution, although as
it is usual, it establishes conditions for distribution that are
contained in an attached file. This attached file contains some really
interesting tips that I invite you to read thoroughly.
We include the font in this delivery, but we won't make use of it in
any example since in the end you just have to include the font and use
it in labels. The examples will take another approach through a set of
functions that we will show here.
Code 128
========
It was introduced in 1981 and is considered of high density, in fact,
much better than "Code 39". It is alphanumeric. Each character has 11
elements combined to present three bars and three spaces. It always
begins with a bar and it finishes with a space.
It is interesting that there are 106 character combinations that can be
generated with this code, but each character can have three different
meanings. Best of all, there are characters that combine two digits,
but we will see this in detail later. There is a start character, a
stop character and a control character.
In fact there are three start characters that we will refer as "Start
Code A", "Start Code B" and "Start Code C". The patterns will have
different meanings according to the start character used. For example,
the combination of codes that represent CR ("carriage return"), the
letter "m" and the pair "77" are equal. This also has an interesting
consequence: there are two ways to write "77", as a single code or as
a a sequence of two "7".
It is possible to change the codification type inside a sequence. A
"Shift Code" is defined for this.
We could have a font for this code, but the use of checksums and
different start patterns make it something impractical.
Typographic limitations do not allow to generate a trustworthy
representation of a bar code, so I will resort to the imagination of
the reader. I will use an "x" to represent a bar and a "-" for the
spaces.
Thus, "7" in code 39 would be: x-x--x-xx-xx
Thus, "7" in code 128 would be: xxx-xx-xxx-
Thus, "77" in code 128 would be: xxx-xx-xxx-xxx-xx-xxx (Code A or B)
or xxxx-xxx-x- (Code C)
The problem of even-length numbers
==================================
Code 128 is thrifty when it codifies numbers in two by two. This is
because the characters defined under "Code C" represent pairs of numbers
from "00" to "99". The problem is that with an uneven length there is no
sequence in "Code C" that represents a single digit. The are two
solutions: either accepting a zero to the left as devoid of value or
shifting from "Code C" to some of the other models (B or A) and then
representing the digit that matters to us. In many cases, applications
take the codes from inventory products as alphanumeric, and not always
we can choose an even length.
In order to represent "123" we can:
1.- Use "Code C" and the pairs "01" and "23". The complete code would be
<Code C>-<01>-<23>-<Check>-<End>.
2.- Use "Code C" and soon shift to "Code B". The resulting code would be
<Code C>-<01>-<Shift to code B>-<2>-<Check>-<End>.
3.- Use "Code B" (or "Code A"). The resulting code would be
<Code B>-<1>-<2>-<3>-<Check>-<End>.
It is remarkable that the first solution is shortest. Unfortunately it
isn't applicable in situations where "0123" is not equivalent to "123".
Next delivery:
It will be about the creation of bar codes type 39 and 128 making use of
Delphi for this purpose.
________________________________________________________________________
3. POCKETSTUDIO
The POWER of PASCAL in the PALM of your hand!
=============================================
I can't recall the number of times I've been asked if there is a Delphi
for handheld devices... If you are among those who wanted to capitalize
your experience in Delphi to develop applications for Palm OS, now you
can! Pocket Technologies, Inc. has released PocketStudio Professional
Edition v1.0, a complete development solution for embedded and hand held
devices. PocketStudio Professional Edition is an innovative new
development tool that results from the powerful combination of a state-
of-the-art, 32-bit compiler and an easy-to-use integrated development
environment that allows you to quickly build sophisticated applications
for the Palm OS. PocketStudio provides the combined the power equal to
C/C++ with the ease-of-use of Delphi to make development for the PalmOS
simpler and more powerful than most developers ever thought possible.
The IDE runs in Windows 9x/NT 4.0/2000 and you can produce optimized
native runtime-free applications for the currently supported platforms
(see System requirements below) that you can try your in the Palm OS
Emulator (POSE) that is included with the product.
Benefits
========
* Easy to learn. Ramp-up and development time is cut significantly
* Creating complex and powerful applications is simple and intuitive
* Bring products to market quicker than competitive development tools
* Allows desktop developers to easily migrate to PalmOS development
Features
========
* General
- Creates optimized, native PalmOS applications (very small & fast)
- No runtime needed
- Inline Assembler
- Full online help and PalmOS API references
- Support for multi-segmented applications
- Project Wizards - create a Palm database application in minutes
- Samples, samples, and more samples
- WebUpdate - keep up to date with the integrated WebUpdate
(automatically notifies, downloads and installs the latest version
of PocketStudio)
- Conduit Wizard - a generic conduit wizard allows you to create simple
conduit to sync your Palm data to the desktop
- Support for HandEra, Kyocera, Handspring, Symbol, Sony, and most PalmOS
devices available today
* Integrated Development Environment
- Created just for handheld development
- Project Manager for easy access to all aspects of your project
- Integrated PalmForm and PalmCode editors
- Visual drag & drop PalmForm designer
- Clear visual navigation to every aspect of your project
- Project Templates - A pre-designed project that serves as a starting
point for your application design
- PSL Technology - (PocketStudio SnapIn Libraries) add the features
you want with the open IDE API. The entire IDE was built this way!
- Integrated debugging using POSE Emulator
- PXL (PocketStudio Extended Library) collection of compiled source
code components that plug directly into PocketStudio IDE for easy
integration, code reuse, and third-party deployment
* PalmCode Editor
- Syntax highlighting - specify how the different elements of your
code appear in the PalmCode editor.
- Code completion - displays methods and properties for a component or
resource
- Code parameters - view required arguments automatically
- Code templates - insert commonly used code into your source
- PalmCode Explorer - easy navigation of every aspect of your code
through a graphical hierarchy tree structure
* Supported Languages
- Pascal-based language
. Access to the entire Palm OS API
. Easy transition from desktop to handheld development
. Create and use shared libraries
* Resource Designer
- PalmForm Designer - drag & drop visual design
- Component Inspector - edit the component's properties and events
easily
- Resource Explorer - clear visual navigation and editing of all
project resources, both visual and non-visual
- Integrated PalmCode Editor - instant access to events and code for
all components
- Component Palette - the component palette's Help Hints feature
displays a small pop-up window containing the name or brief
description of the button when your cursor is over the button for
longer than one second.
- Create menus, dropdowns, or other resources in one convenient area.
* Debugger
- The integrated debugger can help you track down both runtime errors
and logic errors.
- By running to specific program locations and viewing the state of
your program at those places, you can monitor how your program
behaves and find the areas where it is not behaving as you intended.
- Fully integrated direct-to-POSE debugger enables you to execute and
test your application from the PocketStudio IDE
- Breakpoints, variable watching, and step through features
- View variables through the Watch Window
Bonus tools
===========
* Generic Conduit
Allows easy desktop synchronization. Complete Delphi source code
included (TurboSync required).
* TurboSync SDK
Trial version of a conduit development kit for Delphi.
* Extensive Examples
Large list of examples included in the package. Great starting point
for any Palm OS development.
* Palm OS Emulator from Palm, Inc. (POSE)
System requirements
===================
* Host Operating Systems
- Windows 9x/NT 4.0/2000
* Minimum Requirements
- Windows 9x/NT/2000
- 32 MB RAM
- 30 MB available hard disk space
- CD-ROM for installation
* Target Operating Systems
- All versions of the Palm OS supported by Palm OS SDK 3.5
- Creates optimized native Palm OS applications - no runtimes needed
* Target Processor Support
- Motorola 68328 Dragonball
- Motorola 68EX328
- Motorola 68V2328
(Handspring Visor Prism & Platinum)
Download
========
There's a free trial edition available for download:
http://pocket-technologies.com/trial.asp
More information
================
For more information, please go to Pocket Technologies's web site:
http://www.pocket-technologies.com
---------------------
Portions of this article were taken from the Pocket Technologies's web
site and are Copyright (c) 2001 Pocket Technologies, Inc. - All Rights
Reserved. They have been reproduced and modified here with the author's
permission.
________________________________________________________________________
IBAdmin 3.2 - Complete Interbase SQL tool - A powerful DBA/Development
tool for managing Interbase servers and databases. IBAdmin provides many
capabilities to help with your DB design and management. You can use the
Database Designer to visually design the database structure, the Grant
Manager to manage users, or the SQL Debugger which can be used to debug
stored procedures and triggers. Comfortable SQL code editing with Code-
Insight and Code Completion. >>>>>>>>> http://www.sqlly.com/
________________________________________________________________________
4. YAPI - YET ANOTHER PRINTER INTERFACE
By Owen Mooney
Yapi is the simplest way to print from Delphi. Yapi is both very simple
and sophisticated. It can be used with equal ease for both non-database
and database applications.
Simplest Use
============
Before writing about Yapi's details, let's consider the most basic
usability test. How quick is it to make the simplest possible printing
application? I timed it. To print 'hello world' (via a print preview)
took just 45 seconds. The process is as follows:
Start Delphi, from File menu choose "New Application"
- Choose Yapi component tab
- Drop two components on the form
- Choose the system component tab
- Drop a normal button on the form
- Double click the button to get to its event code
- Add two lines of code (see below)
- Use F9 to run the program.
- Click the button to see the print preview screen, then print.
Total time did not include Delphi start up time. The two lines of code
are in the button event as follows:
procedure TForm1.Button1Click(Sender: TObject);
begin
yapitext1.writeln('hello world');
yapipaper1.preview;
end;
What do we get in this 45 seconds? Firstly we get the text placed
correctly in the page margins with typical default font (Times new
Roman, 12 Point). Secondly we get a print preview screen. This has a
"print now" button, a printer dialogue button that will control number
of copies, which pages to print etc. We also get zooming control, next
page, previous page, and so on.
As well as the normal print preview, Yapi's print preview also gives a
totally unique method of controlling widows and orphans of the final
report.
Why Yapi is Easy to Understand
==============================
Software systems make extensive use of metaphors. A window on a computer
screen is a metaphor of a physical window on to a document below it. A
button is a metaphor of something to be pressed with a real finger. Word
processors are metaphors for typewriters, with "sheets" of white paper
to type on, and a tab control bar that almost looks like the tabs on a
mechanical typewriter.
Yapi makes excellent use of metaphors. The principle Yapi component is a
metaphor for a sheet of paper. The paper size, print margins, tabs etc.
are all set up in a WYSIWYG manner in the object inspector window.
The next metaphor is the text. There can be any number of these
components, each controlling different fonts, colors, word wrapping,
and positioning within the report.
The third metaphor is the tab. These are dropped on the paper and moved
into position just as easily as in any word processor.
While all the formatting options are set up as objects and their
properties, none of the contents is. This is where Yapi takes a radical
separation from report generators and other printing interfaces.
Report generators use a bunch of components to put information in
reports. Yapi just uses:
write( ... );
writeln( ... );
writeattab( ..., tabNumber);
All of the complexity of report placement is encapsulated into
variations of these three method calls.
To us, older programmers, this is very natural. We have been using write
and writeln for years. To users of report generators this may look like
a step backwards, but it's very easy. Programmers are no longer
constrained by what the report generator offers. They can put anything
in the report, in any mixture of fonts, including different fonts on the
same line. Even bitmaps and graphs can be put into the same line as
text. They can combine database information, with web data, with email
contents, with FTP data, with stringgrid contents etc. All this
information can be easily integrated into the same report. This is all
done with a few "writelns".
All good printer tools should provide a good print preview. This
requires the encapsulation of the display scaling and other actions
associated with both the printer canvas and the print preview canvas.
Yapi does this, but it also does another important additional
encapsulation as follows...
Yapi's Extra Encapsulation – the concept of a "Report Line"
===========================================================
Yapi doesn't work with "bands". It works with lines. It encapsulates the
concept of "Text on a line" (or pictures, or graphs). It handles all of
the positioning and pagination for these lines in almost exactly the
same way as word processors do. It extends the "line" concept for "text
in this page" and "text in all pages" to replace the band functionality.
Like word processors, the management of different fonts, and even
bitmaps on the same line is correctly handled. All of this gives Yapi a
very simple and natural "feel", with good flow of content from page to
page. In addition, Yapi has unique features where the final program
operator can view the print preview, and adjust the page to page flow to
control widows and orphans.
Complicated Reports
===================
A good test for reporting is displaying the table "biolife" in DB Demos.
This table not only contains string fields and numeric fields, but
also a memo field, and a bitmap. For a good report generator, this can
be set up using several components. Yapi, however, has no data-aware
components. Nevertheless, this complex report uses only 32 lines of
code. Source for this report is provided as an example.
Some Comparisons
================
Delphi is provided with QReports. The number of alternative reporting
and printing interfaces available indicates its limitations. Our team
was building a Credit Union banking system. We evaluated QReports and
rejected it. Yapi provided all of the banking reports.
Report Printer Pro was also evaluated for the same job and rejected also
as too complex and messy to use with some of the complicated reports we
were creating.
Conclusion
==========
Yapi provides a very simple printing interface. It only needs seven
components do almost any kind of report. The reference manual is a small
16 pages. Learning time is only 5 minutes. Despite this, a very wide
range of printing activities can be undertaken, and very attractive and
comprehensive reports can be produced.
The Free Standard Version of Yapi (FREEWARE) can be downloaded from
Yapi's web site:
http://www.geocities.com/yapisoftware
(this is a change from the earlier web site)
A professional version is also available for evaluation and purchase,
and is currently being upgraded to include "ExpertImage" technology for
improved bitmap printing.
------------------
The author can be contacted at <yapi@scottech.net>.
________________________________________________________________________
5. NEWS
Delphi 6 Update Pack
====================
Last month Borland released the first update for Delphi 6, but later
recalled it after some bug reports. Three weeks later Borland made the
fixed update patch available for download:
http://www.borland.com/delphi/webreg/registeredusers.html
* Download the fixed Delphi 6 Updates - by John Kaster
http://community.borland.com/article/0,1410,27800,00.html
Kylix.sk
========
By Michal Laclavik
Kylix.sk site was created to share code and experience between Kylix
developers, a great and only visual development tool for Linux.
Please contribute to help us make this site useful. The site currently
contains only simple features, and the Kylix.sk team will start adding
new features as soon as the Kylix community starts to use the site.
The site currently has the following sections:
- ARTICLES. Experience that you would like to share with other
developers.
- CODE. For sharing code or components with others.
- NEWS. Links to other sites with little information.
- JOBS. Companies or individuals are able to post jobs offers.
- LINKS. List of all interesting links about Kylix or related sites.
- MY PROFILE. Currently used for editing users' profiles.
Register. If you want to add articles, code or jobs you have to register
first. How this site will look depends mainly on us, Kylix Developers!
If you have any comments or questions, feel free to email us to
<info@kylix.sk>.
________________________________________________________________________
6. TIPS & TRICKS
Detecting if the screen saver is running
========================================
Since Windows 98 and Windows NT 5.0, the API SystemParametersInfo can
be used to determine whether the screen saver is running. In previous
versions of Windows NT we can determine if the screen saver is running
by determining whether a desktop named "screen-saver" exists. This
desktop is where the screen saver runs and exists while the screen saver
is running. If we can open the desktop or if we can't because we are
being denied access, then the desktop exists and thus the screensaver is
running:
function ScreenSaverRunning: boolean;
const
SPI_GETSCREENSAVERRUNNING = 114;
var
VI: TOSVersionInfo;
Running: integer;
hDesktop: HDESK;
begin
Result := False;
FillChar(VI, SizeOf(VI), 0);
VI.dwOSVersionInfoSize := SizeOf(VI);
if GetVersionEx(VI) then exit;
if (VI.dwPlatformid = 1) and (VI.dwMinorVersion > 0) or
(VI.dwPlatformid = 2) and (VI.dwMajorVersion >= 5) or
(VI.dwPlatformid > 2) then begin
// Windows 98 or greater, or Windows NT 5 or greater
SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, @Running, 0);
Result := Running <> 0;
end else if (VI.dwPlatformid = 2) and (VI.dwMajorVersion < 5) then
begin // Windows NT 3 or Windows NT 4
// We try to open the desktop "screen-saver"
hDesktop := OpenDesktop('screen-saver', 0, False,
MAXIMUM_ALLOWED);
if hDesktop = 0 then
// Couldn't open the desktop. Let's see the cause...
if GetLastError() = ERROR_ACCESS_DENIED then
// If access was denied, this means the screensaver has the
// desktop and therefore it is running.
Result := True
else
// If it's for any other reason, the screensaver isn't running
Result := False
else begin
// We could open the desktop ==> screensaver running
CloseDesktop(hDesktop); // We should close the desktop
Result := True;
end;
end;
end;
Refreshing a DriveComboBox
==========================
The TDriveComboBox component doesn't have a Refresh method to rebuild
the drives list, but we can force the list to be rebuilt by assigning
the value of the TextCase property:
with DriveComboBox1 do TextCase := TextCase;
This would be equivalent to "DriveComboBox1.Refresh;", had it existed.
Capturing keyboard messages at application level
================================================
We capture the keyboard messages with the OnMessage event of the
Application object. You can find similar articles, but the source code
presented here (attached) is more complete and takes into account
certain special cases. I can't discuss the source code in full detail,
but here go some general explanations...
For the ENTER key (VK_RETURN) we want to move to the next control in
the case of edit boxes and other controls, so we ask if the active
control descends from TCustomEdit, which includes TEdit, TDBEdit,
TMaskEdit, TDBMaskEdit, TMemo, TDBMemo and other components provided by
third parties. Since we want to exclude TMemo, TDBMemo and, in general,
all descendants of TCustomMemo, we make a special proviso in this case
(leaving the message unchanged with no action), leaving us with the
single-line edit controls, to which we add listboxes, comboboxes, etc.
For these elements we replace the ENTER key (VK_RETURN) by a TAB key
(VK_TAB), both for the WM_KEYDOWN and WM_KEYUP messages.
However in the case of a combobox (any TCustomCombobox descendant), when
the list is dropped down we wish to maintain the traditional behavior
of the ENTER key (i.e. closing the list).
It would be nice to have a keyboard shortcut for the default button of a
form (the button with its Default property set to True), for example
CTRL+ENTER. This feature is included in the code. The way it is
accomplished is a little bit complex to explain... Perhaps it would have
been easier to iterate thru the components on a form to find a
focuseable button with Default = True, and then call its Click method,
but we used a code similar to the one used in VCL forms, which takes
into account the fact that the ENTER key might be wanted to get trapped
by many controls, not only a button.
We also want the DOWN arrow key (VK_DOWN) to be mapped as a TAB key
(VK_TAB). For this case we used a simpler code. Of course, we also want
the UP arrow key (VK_UP) to be mapped to a SHIFT+TAB key combination.
Well, it isn't possible to map to a key with a modifier. We can discard
the key and simulate the events of pressing SHIFT and then TAB, or we
can change the state of the SHIFT key in the keyboard state array (like
we did with the CTRL key in the CTRL+ENTER combination), but we took a
different approach (simply focusing the previous control of the active
control in the tab order).
Finally, for Spanish applications, it is usually desirable to replace
the decimal point of the numeric keypad with a coma (decimal separator
in Spanish).
Knowing when a form is minimized
================================
Forms don't have an OnMinimize event, but we can catch the WM_SYSCOMMAND
message to learn if the form is being minimized:
type
TForm1 = class(TForm)
private
{ Private declarations }
procedure WMSysCommand(var Message: TWMSysCommand);
message WM_SYSCOMMAND;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{ TForm1 }
procedure TForm1.WMSysCommand(var Message: TWMSysCommand);
begin
if Message.CmdType = SC_MINIMIZE then
// Form is about to be minimized
;
inherited; // Let the form process the message
if Message.CmdType = SC_MINIMIZE then
// Form has been minimized
;
end;
If we don't want the form to be minimized, we have to exit the procedure
before calling inherited.
Opening comma-delimited data files
==================================
The BDE has an ASCII driver that allows us to open text files that hold
data in comma-delimited format. Each line in the text file is a record,
and the values of fields are separated by commas (or any other
character). For example, let's consider the following data:
+-----+-----------+---+------+------+
| 123 | Product A | 1 | 2.10 | 2.90 |
+-----+-----------+---+------+------+
| 456 | Product B | 1 | 1.70 | 2.50 |
+-----+-----------+---+------+------+
This data would be stored in a text file (for instance Table1.txt) as:
123,Product A,1,2.10,2.90
456,Product B,1,1.70,2.50
To be able to open such a file as a table, we have to create another
text file describing the structure of the table. It should have the same
name, but it should have the SCH extension (for instance Table1.sch). It
is very much like an INI file, for example:
[Table1]
FILETYPE=VARYING
CHARSET=ascii
DELIMITER=
SEPARATOR=,
Field1=Code,Long Integer,11,00,00
Field2=Name,Char,17,00,11
Field3=Value1,Float,20,02,28
Field4=Value2,Float,20,02,48
Field5=Value3,Float,20,02,68
Now, to open the data file don't forget to set the TableType property of
the TTable component to ttASCII.
________________________________________________________________________
7. DELPHI ON THE NET
Articles, tips and tricks
=========================
* Delphi Database Programming Course - By Zarko Gajic
Free online database programming course for beginner Delphi developers
focused on ADO techniques. Three new chapters have been added in the
last month (Chapter 15 "Lookup!", Chapter 16 "Compacting an Access
database with ADO and Delphi" and Chapter 17 "Database reports with
Delphi and ADO").
http://delphi.about.com/library/weekly/aa010101a.htm
* Component writing, part 3 - By Peter Morris
This article is the final part of a three part article on components.
This final part will cover property / component editors, how to write
dedicated editors for your component / property, and how to write
"hidden" components.
http://www.howtodothings.com/showarticle.asp?article=327
* Web Site inside a Delphi EXE - By Zarko Gajic
How to store Web-style content inside a Delphi application
http://delphi.about.com/library/weekly/aa061901a.htm
* "The Big Brother" Delphi code toolkit - By Zarko Gajic
Going undercover: hiding from the task list, disabling task-switch,
removing from the TaskBar, disabling shut down, ...
http://delphi.about.com/library/weekly/aa022701a.htm
* Twain and Delphi - By Zarko Gajic
Acquire images from scanners, cameras and image capture devices using
Delphi. See how to import (and wrap in a component) an image scan
control within Delphi.
http://delphi.about.com/library/weekly/aa030299.htm
* Developing Cross Platform Portable Applications (for beginners)
By Ismo Horppu
http://users.jyu.fi/~ishorppu/projects/cpd_english.htm
* Data-Aware Tree Views - by Roland Rundzjo
Graphically Presenting Hierarchical Information
http://www.ocdelphi.org/bfeature.htm
* Creating a custom database login form - by Tom Wolken
http://www.elementkjournals.com/ddj/9809/ddj9891.htm
* Multiple Selections in a String Grid - By Christian Ebenegger and
Thierry Revillard
http://www.undu.com/Articles/011005c.html
* Help for component creators - by Pintér Gábor.
Create a help file for your new component that is exactly like
Delphi's internal help pages. With source code, examples, and
installation instructions.
http://community.borland.com/article/0,1410,26679,00.html
* How to adjust TDBGrid column widths automatically - by Philippe
Randour
This handy procedure automatically adjusts the size of static DBGrid
columns to fit the DBGrid client width when the user resizes the form
containing the grid. Say goodbye to the horizontal scrollbar!
http://community.borland.com/article/0,1410,27548,00.html
* Using COM+ object pooling with Delphi 6 - by Vincent Parrett
Delphi 6 introduces support for COM+ object pooling, which can provide
significant performance improvements under some circumstances. We take
a look at Delphi 6's object pooling support.
http://community.borland.com/article/0,1410,27568,00.html
* Changes to TThread in Delphi 6 and Kylix - by Craig Stuntz
Delphi's TThread class and its various support methods have been
significantly revised in Delphi 6. This article will discuss what
these changes mean to developers of multithreaded applications.
http://community.borland.com/article/0,1410,27655,00.html
* Installing InterBase to start automatically and run as a service under
Linux - by Richard Combs
http://community.borland.com/article/0,1410,27761,00.html
* Resource Meter for Windows 95/98/ME - by Wen Kiat Chua
How to the System, User, GDI resources for Windows 95/98/ME
http://www.delphi3000.com/articles/article_2732.asp
* Add-in for MS Office Applications - by Daniel Wischnewski
How to write an addin (plugin) for MS Office applications.
http://www.delphi3000.com/articles/article_2719.asp
* C++-like templates in Delphi Object Pascal - by Rossen Assenov
How to make C++-like templates in Object Pascal.
http://www.delphi3000.com/articles/article_2695.asp
* Rolling up a form - by Si Carter
A new effect for forms
http://www.delphi3000.com/articles/article_2696.asp
* Making your own anti-virus - by Rafael Ribas Aguiló
Prevent Love-Letter and other VBS viruses by yourself.
http://www.delphi3000.com/articles/article_2685.asp
VCL Components
==============
* Moveable/Sizable TPanel with standard or color SizeGrip - by Kevin
Gallagher
http://www.delphi3000.com/articles/article_2745.asp
* Fill In Combo Box - by Daniel Wischnewski
Simple, enhanced combo box, that fills in the text area with possible
options from the items list
http://www.delphi3000.com/articles/article_2743.asp
Tutorials
=========
* Pascal for Delphi Programmers- by Bryan Valencia
http://www.209software.com/books/p4dp/p4dp.html
* Web programming in Delphi
http://www.209software.com/books/wpid/
* Foundations in Database Development with Delphi and C++Builder - by
Cary Jensen
Introduction to the basic techniques for building BDE database
applications using Delphi or C++Builder
http://community.borland.com/article/0,1410,20564,00.html
Links
=====
* KYLIX.SK
http://kylix.sk
________________________________________________________________________
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.
________________________________________________________________________
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=p27
________________________________________________________________________
This newsletter is provided "AS IS" without warranty of any kind. Its
use implies the acceptance of our licensing terms and disclaimer of
warranty you can read at http://www.latiumsoftware.com/en/legal.php
where you will also find a note about legal trademarks. Articles are
copyright of their respective authors and they are reproduced here with
their permission. You can redistribute this newsletter as long as you do
it in full (including copyright notices), without changes, and gratis.
________________________________________________________________________
Main page: http://www.latiumsoftware.com/en/pascal/delphi-newsletter.php
Group home page: http://groups.yahoo.com/group/pascal-newsletter/
Subscribe/join: pascal-newsletter-subscribe@yahoogroups.com
Unsubscribe/leave: pascal-newsletter-unsubscribe@yahoogroups.com
Problems with your subscription? eds2008 @ latiumsoftware.com
________________________________________________________________________
Latium Software http://www.latiumsoftware.com/en/index.php
Copyright (c) 2001 by Ernesto De Spirito. All rights reserved.
________________________________________________________________________
|