Blaise Pascal Magazine 8
Blaise Pascal Magazine 8
October 2009
Publisher: Foundation for Supporting the Pascal Programming Language
in collaboration with the Dutch Pascal User Group (Pascal Gebruikers Groep)
© Stichting Ondersteuning Programeertaal Pascal
Cover price Europe: € 10.00 / UK £ 10.00 / US $ 10.00
BLAISE PASCAL MAGAZINE 8
ALL ABOUT DELPHI AND DELPHI PRISM(.Net) ,LAZARUS & PASCAL AND RELATED LANGUAGES
To illustrate my point: in order to better understand object We need the starters and beginners.
oriented aspects of programming I took a course on Java
at the University of Amsterdam. Besides learning a lot and Two years ago, when Embarcadero took over Codegear,
obtaining insight into many issues, I soon realized how it was promised to me personally.
much we are pampered with our Delphi IDE. I was very enthusiastic.
But now, going into the third year, there is still nothing
Java still does not have anything comparable to RAD. Java available. I regard this as unacceptable.
is a beautiful language, but it cannot compete with
Delphi (Pascal) : it's not fast, , coding is labour-intensive, I sincerely hope that this problem can be resolved quickly.
its graphic support is not very sophisticated and what
sometimes is forgotten, at low level the Java compiler is Detlef Overbeek,
almost never competitive in terms of speed and there for it
is almost impossible to run technical applications at low e-mail: [email protected]
(engine) level. Skype Detlef.Overbeek
+ 31 (0)30 6876981
But it runs on a lot of Platforms. mobiel + 31 (0)6 21.23.62.68
- which is nice until you discover that under Linux the
Eclipse environment moves at a snail's pace.
Action!
The only thing left to do is compile the project and run it. If you
have a touch screen (like the LG L1510SF 1024x768 Flatron that I
purchased for a good price) then you can move your finger over
the screen to make the gesture movements required. If you do not
have a touch screen, then you can still emulate this behaviour by
using the mouse: click with the left mouse button and “drag” the
gesture movement around the screen. It's not the same, but at least
you can test your gesture movements without the need to purchase
a touchscreen yourself. Either way, you can use the Left, Right,
ChevronLeft and ChevronRight gestures now to navigate through
the records of the biolife table without the need for a keyboard or
TDBNavigator control.
Custom Gestures
Apart from the built-in standard gestures, we can also create our Figuur 4: zorro is in the air?
own custom gestures with Delphi 2010. This can be done with the (a famous tv-character in The Netherlands about an outlaw hero
TGestureManager control: right-click on it, and select Custom who uses his sword to draw a “Z” on the chest of his
Gestures. Inside the dialog that follows, you can click on the government victims) When making custom gestures, it's
Create button to create a new gesture, where you need to move important to realise that the gesture must be one fluent
your finger over the touch screen (or drag with the mouse) to draw movement. As a result, you cannot make an X gesture, since that
the initial path of the gesture. Once the initial path is drawn, we requires two separate gestures. For the X-gesture that I created,
can still make some modifications to it, to ensure it will be I had to change the sensitivity, which is set to 80% by default, to
recognised correctly. As an example, let's draw the “Z” character ensure that it's easily possible to have the “Z”-gesture be
(see next screenshot), and give it the name “Zorro” recognised when drawn on screen by an end user.
Deployment
A final word: in order to turn the current demo application into a
Figure 7: now you can try really standalone executable, we should add the MidasLib unit to
Sweeping your finger over the screen from left to right (for the the uses clause of the project, so we do not need to deploy the
next record) or from right to left (for the previous one) may be a MIDAS.DLL. This results in a truly standalone executable that
bit strange at first, but you'll quickly get the hang of it. The effect we can place on a USB-stick for example in order to show an
is of course much nicer if the form would contain a city map or application that doesn't need mouse or keyboard in order to run.
street plan, where you can “move” the map around with your
fingers. This can also be done with gestures, and even better with Bob Swart
the so-called Multi-Touch support which can be found in
Windows 7 (but which also requires special, more expensive,
hardware). Using Multi-Touch and interactive gestures, the To get more information about Delphi 2010
EventInfo structure of the Ongesture event will hold field values licenses, please see my website at
for the inertia (speed of the gesture), as well as the start and stop http://www.bobswart.nl/CodeGear
coordinates of the gesture. Since this is only supported by or send me an e-mail at
Windows 7, in combination with special hardware compatible [email protected]
with the multi-touch and interactive gestures, I'll leave an
example behind for now (until I can get my hands on the special (also to ask about subscription or renewals).
multi-touch hardware that is).
Bob Swart - is Reseller for BeNeLux
Touch Keyboard
One more thing I can show you is the final step to make the
(Belgium Netherlands Luxemburg)
application completely independent from mouse and keyboard:
for deployment in a kiosk or bus station for example. Since these
applications sometimes still need some textual input, Delphi
2010 contains a special TTouchKeyboard component. One
which shows the keyboard layout for the current locale (which
means that users from France will get the accents available on
the keyboard when they need them).
Sudoku
How do we encode order .......whole wheat(1), large(2),
A Sudoku puzzle typically has a board with columns 1..9, rows apple(1), sugar(0) ?
1..9 and groups 1..9. So counter state = 0 1 2 1, asked is N.
Refer to the picture below. T2 is increased once, this requires 2 * 4 increments of T0 since
T0T1 together constitute a modulo 2 * 4 = 8 counter.
So, N = 8 for the moment.
T1 is increased 2 times, this requires 2 * 2 increments of T0.
So now N = 8 + 4 = 12. T0 is increased once which makes
N = 12 + 1 = 13, which is the -pancake-code of this order.
Note: to obtain state T of an individual counter stage requires
N = T * (modulus of preceding counters) increments into T0.
Number systems
Figure 5:
Notice, that we count from 1..9, which is unsuitable for mod and
div operations. Therefore , conversion is needed from 1..9 to 0..8 Above is pictured an 8 stage counter we recognize as a byte.
before mod and div operators may be applied. Given column i, An individual counter , counting 0,1,01... is called a bit. 11100110
row j , we want to calculate the field that contains this element. is a shorthand notation we are used to in number sytems. The
This can be done using following function: modulus of the byte is 2^8 = 256. If we replace the counters by
function IJtoGroupNr(i,j : byte) : byte; modulo 10 types, counting 0...9, N would appear as a decimal
//return group Nr of field [i,j] number. Conversion from the binary (2) to the decimal (10) number
var x,y : byte;
begin system is accomplished by connecting N also to modulo 10
x := (i-1) div 3; counters. N mod 10 than is the state of T0 after N increments. N div
y := (j-1) div 3; 10 is the number of carries out of T0 into T1 etc. Program below
result := x + 3*y + 1;
end;
converts a positive integer (in binary in the computer memory) to a
string of decimal digits. (displayed in component edit2)
procedure setN(nn : cardinal; t : byte);
Serially connected counters //displays number with base t
const digitconvert = '0123456789abcdef';
var s : string; m : byte;
begin
if nn = 0 then begin form1.edit2.text := '0';
exit; end;
s := '';
repeat
m := nn mod t;
Figure 5: schematic view nn := nn div t;
In the picture above, 4 counters are serially connected. The carry of insert(digitconvert[m+1],s,1);
until nn = 0;
a stage is the increment of the next. Counter T0 is modulo 2, T1 is form1.edit2.text := s;
modulo 4, T2 is modulo 5 and counter T3 is of the type modulo 3. end;
Marco Roessen
Graduated HTS-Electronics,
specialisation Technical
ComputerScience, in 1993.
Since then he has been
working as an informatics
engineer at the Centre for
sleep and wake research
firstly at Leiden University
since 1995 at Medisch
Centrum Haaglanden, Den
Haag.
There he develops tailored
sleep research software;
started with assembler
and MS Pascal, later using
Turbo, Borland and Delphi
Pascal. Currently also C#.
He is co-developer of
algorithms for automatic
biomedical signal analysis.
Figure 3: Changing a relationship
Persistant fields
For a change, here we use SqlServerExpress (Microsoft's free
database application) for our example. For those of you who are
used to working with Paradox or Access, it's easy to do the same
Figure 4. Specifying the DisplayFormat property
thing with these applications.
of the persistant field 'Paid'
The example table in Figure 1 has four fields: ID
(autoincrement), Name (string 15), Amount (float or real; may be A FloatField has the propertyDisplayFormat, but some other field
empty), and Date (date and time; may be empty). types (such as StringField) do not. The specific properties depend
on the field type. For example, a Boolean field has the
DisplayValues property (Yes; No or T; F), an Integer field has the
MaxValue and MinValue properties, and so on.
procedure TForm1.FormShow(Sender: TObject); One final remark: the example shows how this works with a
begin
ADOTable1.Open;
DBGrid, but it also works with a DBEdit or the like, since the
end; code is linked to a TField rather than the component that
displays the data.
Having come from using Delphi and Visual Studio development run. Follow the installation instructions found on the website to
environments and constantly hearing how an OSX based system install each package. After you have installed both Free Pascal and
does everything better than a Windows based system I was Lazarus, run Lazarus. By default Lazarus installs into the
bitterly disappointment when I started exploring the XCode and /Developer/lazarus folder.
Interface Builder developer tools by Apple.
If you want to use a Pascal language on OSX your options are
pretty limited. One option is Free Pascal. Free Pascal has been
around for a number of years now and is updated regularly. It
supports many operating systems include Win32, Linux, WinCE
and OSX. To support Free Pascal there is an open source
integrated development environment called Lazarus. Let's be
honest here, Lazarus is pretty much a knock off of the old
Borland IDE circa Delphi 7, which can be both a positive and
negative, with a few nice additions thrown in. Lazarus has its own
version of the VCL called LCL. It is basically compatible with
Delphi's VCL. I say basically because it isn't 100% and in some
areas it is far from it. You need to download the appropriate
packages from the Free Pascal and Lazarus websites for your
version for your MAC. Make sure you download the correct
packages. Figure 1: the IDE of Lazarus
Free Pascal - (http://www.freepascal.org/) Launch Lazarus and go into the Environment | Options dialog.
Lazarus - (http://www.lazarus.freepascal.org/) Make sure that the Compiler Path and FPC Source Directory
Before installing either package be sure to install the Apple options are set to the install location of Free Pascal. If you install
developer tools. You can download these tools from the Apple to the default locations these will be /usr/local/bin/fpc and
Developer website (http://developer.apple.com). You will /usr/local/share/fpcsrc/ respectively.
have to create a developer account which is free - unless you
select one of the paid account types. I signed up using the iPhone Features not in Delphi
developer program which gives you access to the iPhone specific As mentioned earlier, Lazarus has some features that are not
tools (SDK versions, simulator etc.) but also to the desktop available in the Delphi. It also has some of Delphi features that are
specific tools. Be warned, the downloads are not small (nor fast - not so good and then it just has some features of its own that are
at least from my side of the world). not so good.
After installing the Apple developer tools, install Free Pascal NOTE: These lists are nowhere near exhaustive.
before Lazarus. This should make things a lot easier in the long
The two Set methods follow the standard form: If the new value
Here is the declaration of this simple component class. As you
is really different from the current one, change the value and
can see, there are only two custom properties, Color and Status:
update the user interface. Otherwise, do nothing:
procedure TCntLed.SetStatus (Value: TCntLedStatus);
type beg
TCntLedStatus = (lsOn, lsOff); if Value <> fStatus then begin
fStatus := Value; Invalidate;
TCntLed = class (TGraphicControl) end;
private end;
fStatus: TCntLedStatus;
fColor: TColor; procedure TCntLed.SetColor (Value: TColor);
protected begin
procedure SetStatus (Value: TCntLedStatus); if Value <> fColor then begin
procedure SetColor (Value: TColor); fColor := Value; Invalidate;
public end;
constructor Create (Owner: TComponent); override; end;
procedure Paint; override;
published The Paint method is a little more complex than the property
property Status: TCntLedStatus methods. First it draws a background circle, which I use as a
read fStatus write SetStatus default lsOn;
property Color: TColor border, and then an inner circle if the LED is on. To make sure
read fColor write SetColor default clRed; the LED has the correct appearance (they’re almost always
property Width default 20; round), I check the width and height properties to determine the
property Height default 20; actual diameter of the LED (I use the smaller of the two values).
property OnClick;
property OnDblClick; In a future example, I’ll show you how to use code to impose a
end; relationship between the width and the height of a component.
Here’s the Paint method:
For the Status property, I’ve defined an enumerated data type
(TCntLedStatus), which is more understandable and flexible than a
procedure TCntLed.Paint;
Boolean data type. By convention, you should use the initial letter var Radius, XCenter, YCenter: Integer;
of the component and property name (ls for LED Status) to build begin
the names of the enumerated values (for example, lsOn). // get the minimum between width and height
If you examine the property declarations, you notice that I’ve if Height > Width then Radius := Width div 2 - 2
applied the read and write directives to specify how to set or else Radius := Height div 2 - 2;
retrieve the property’s current value. For these directives, you can XCenter := Width div 2; // get the center
specify either a local field of the class, a function (to retrieve the YCenter := Height div 2;
property), or a procedure that accepts a single parameter of the Canvas.Brush.Color := clDkGray; // LED border color (fixed)
same type (to set the property). Canvas.Ellipse (
In the declaration above, I’ve supplied private variables for the XCenter - Radius, YCenter - Radius,
XCenter + Radius, YCenter + Radius);
Status and Color property read directives, and I’ve specified if fStatus = lsOn then begin // led surface
procedures for the corresponding write directives. I used Canvas.Brush.Color := fColor;
procedures to set the property values so that I can update the user Radius := Radius - 3;
interface when the property value changes. Canvas.Ellipse (XCenter - Radius, YCenter - Radius,
XCenter + Radius, YCenter + Radius);
end;
At the end of each property declaration, I’ve provided a default end;
value. As you might have guessed, this implies that I’m going to set
those values in the component’s constructor, which means I’ll need Instead, I’ve decided to show a similar but different
to override it. I’ve declared an overridden version of the Create case—combining several TDdhLed components into a
constructor for just this reason. TDdhSemaphore component.
Finally, you’ll notice that I’m overriding the Paint method, A Custom Windows Control: The Fonts Combo
specifying default values for some inherited properties, and that Box Many applications have a toolbar with a combo box you
I’m publishing several inherited event properties. The new Paint can use to select a font. If you often use such a customized
method will allow us to take control of the appearance of the combo box, why not turn it into a component? Doing so will
component, the new default property values represent additional probably take less than a minute.
work that I’ll need to perform in the constructor, and publishing the
inherited events gives us the opportunity to customize the
component’s behavior.
Author
And here is the source code of its two methods executed at
Marco Cantù is the author of several best-selling
startup:
Delphi books, including the Mastering Delphi series
and the recent Delphi 2009 Handbook. He's also an
constructor TCntFontCombo.Create (AOwner: TComponent);
begin active user and developer in the Web 2.0 world and
inherited Create (AOwner); social web, like Twitter. You can reach him on
Style := csDropDownList; FChangeFormFont := True; www.marcocantu.com, blog.marcocantu.com, and
end;
twitter.com/marcocantu or by email at
procedure TCntFontCombo.CreateWnd; [email protected].
begin
inherited CreateWnd; Items.Assign (Screen.Fonts);
// grab the default font of the owner form
if FChangeFormFont and Assigned (Owner)
and (Owner is TForm)then
ItemIndex := Items.IndexOf ((Owner as TForm).Font.Name);
end;
5. IDE Usability
It is all about the productivity of a
Delphi programmer. If you are like me,
you spend a big part of your day inside
the IDE – Integrated Development
Environment. I still wonder if there are
any limits for creative ideas related to
developer tools productivity. Delphi
has an excellent tradition here. Turbo
Pascal invented the IDE by putting
together three formerly separate
entities – code editor, compiler and
debugger. Delphi 1 pioneered Rapid
Application Development, introducing
the concept of a component - an object
instance that can be manipulated
visually at design-time. Some of the
capabilities introduced in Delphi 1, like
live data at design time, are still
unavailable in other IDEs.
Summary
Recently released Embarcadero RAD Studio 2010 contains many
new features including IDE usability improvements, support for
touch, new Delphi language features and DataSnap 2010
architecture for component-based development of multitier
systems. In this article, I have selected my personal top five, but
there is much more in Delphi 2010, C++Builder 2010 and Delphi
Prism 2010 then described here.
[email protected]
Figure 13: New DataSnap Server Wizard or visit his blog on
The second wizard let you create DataSnap Server WebBroker http://blogs.embarcadero.com/pawelglowacki
application as shown in Figure 13. How cool is that?
type
TPixCol = record //sequence is Blue, Green, Red in scanlines Figure 2 Linear Distortion Process
B : byte; G : byte; R : byte;
end; Each area (OBM[0] through OBM[8]) is in this process
TPixArray = array[0..5000] of TPixCol; //5000 lines is enough deformed in the X and the Y direction. This is done in the
for our use procedure LinearDistort, which puts the result in VirtBM. After
pPixArray = ^TPixArray; copying VirtBM back to the original bitmap (this happens nine
times), the process is completed. Now we see the need to store a
Suppose we select an area of our image in Image1 (we'll call this
copy of the original in OBM first: because the new (deformed)
“main image”) by drawing a rectangle around the part we want to
areas can overlap the original areas. The procedure LinearDistort
manipulate. We copy this area into a new bitmap, OBM[0],
needs the number of selected scanlines, the length of the selected
which then contains a copy of the original pixels of the selected
scanlines, the number of new scanlines in VirtBM and the length
part of our image. By doing the same for the adjacent areas we
of the new scanlines as parameters.
obtain 9 bitmaps, see figure 1:
The procedure is as follows:
procedure TForm1.LinearDistort(NmbSelSLs, LenSelSLs,
NmbVirtSLs, LenVirtSLs: Integer);
var Ysel, Yvirt, J, CyW: Integer; CyF, Fry, Xfact,
Yfact: Single;{sub-procedure FillXVirt is incorporated here:}
procedure FillXvirt; //stretch-shrink horizontal lines, see later
begin
||
end
begin
VirtBM.Width := LenVirtSLs; VirtBM.Height := NmbVirtSLs;
SetLength(ScanlinVirt, NmbVirtSLs);
for J := 0 to NmbVirtSLs-1 do ScanlinVirt[J] :=
VirtBM.ScanLine[J];
Yfact := NmbVirtSLs/NmbSelSLs; //factor to stretch-shrink vertically
Xfact := LenVirtSLs/LenSelSLs; //factor to stretch-shrink horizontally
Yvirt := 0; CyF := 0.5;
Figure 1: Selected area and adjacent areas in main image CyW := Trunc(Yfact); Fry := Frac(Yfact);
copied to OBM bitmaps for Ysel := 0 to NmbSelSLs-1 do begin
if CyW>0 then for J := 1 to CyW do begin
The bitmap copies are stored using the CopyRect FillXvirt; inc(Yvirt);
procedure: end;
CyF := CyF + Fry;
for I := 0 to 8 do begin
if CyF >= 1 then begin
SrcRect[I] := Rect{corner coordinates of area}; FillXvirt; inc(Yvirt);
DestRect := Rect(0,0,Ls[I],Ns[I]); CyF := CyF - 1;
OBM[I].Height := Ns[I]; end;
OBM[I].Width := Ls[I]; end;
OBM[I].Canvas.CopyRect(DestRect,Image1.Canvas,SrcRect[I]); end;
end;
SAVE AS ICON
calling LinearDistort followed by DynamicDistort four times,
see figure 6:
CLOSE PROGRAM The first image (at left) is the original image, in the next
image the mouse cursor is used to draw a rectangle: the
selected area. In the third image the rectangle is deformed by
grabbing the centre point with the mouse cursor (plus left
button) and moving it to another position. This process is
called “Warp” in other programs. The last image at right
shows us the result after clicking “Go”. The part of the image
outside the selected area is not affected, so in this mode not
Figure 5 “Deform!” can
the whole picture is deformed.
change your images
Messaging topologies
kbmMW bundles support for UDP broadcast based messaging,
TCPIP hub/spoke and UDP/TCPIP peer to peer messaging.
Other types of messaging topologies can be supported by
kbmMW as well. One could for example create a messaging Figure 3: HUB with gateway capablilities
email transport utilizing standard emails for moving messages.
Figure 4: Sendmessage
Targeting a message allows the message to cross Ethernet
segments without having a messaging gateway, provided the
switch, router or hub allow UDP packages to cross.
Using the peer to peer setup, it's a true peer to peer setup Interested in working with
where any node can communicate with any other node using the
UDP messaging transport. The node targeted should of course Delphi and Flash
still be subscribing for the subjects that the sender, choose to
send. and or Adobe Flex?
As usual any messages send to the node, for which the node does
not have a matching subscription for, will be ignored.
take a look at
http://www.components4developers.com
The WIB node
Chose: Products Video
To create a publishing or subscribing node, all what's needed is
kbmMW integration with Adobe Flex, Flash and AIR.
to add a TkbmMWxxxyyyMessagingTransport where xxx identifies
the type of transport and the yyy if its a client or server transport.
Why the distinction of a client or server transport?
There are two reasons:
- One reason is that the messaging transports also support the
traditional request/response setups using kbmMW clients and
servers. Hence the messaging server transport can be directly
connected to a TkbmMWServer and operate simultaneously
as a true asynchronous messaging transport and as a
synchronized request/response transport.
- Another reason is in case of the hub/spoke messaging
transport setup. The hub will always be a server transport, and
the spoke always a client transport.
Thus if your publishing node also contains a kbmMW
application server, you would usually put a server messaging
transport on that node.
And if you have nodes which act as clients to an application
server, and thus operate according to the request/response
principle, you would put a client messaging transport on the
node.
Its perfectly legal to create a setup of nodes who all operate
100% on the publish/subscribe bases without any requirements
for an application server. In that case you don't have to add any
TkbmMWServer components in any node, and can choose to use
just client transports on all nodes, except for those who act as
hub nodes.
Figure1: The draw program in action Figure3: The extra 4th bit provides an extra possibility
The drawing is generated by mouse-movements over a paintbox, Two successive codes of “0” may be combined to one code of “8”
connecting the (x,y) coördinates by lines. , two codes of “1” to one code of “9” etcetera.
A ColorPicker component is added to the form as well as an A 4 bits -movement- code I call a “stroke” for the moment.
ArrayButton, to allow selection of pen-color and pen-width. (see
earlier articles or visit my website) The list of strokes
Drawing is not too difficult, but we want to store the drawing as At the start of a drawing, memory space is reserved for the storage
well to be repainted later. of maximal 5000 strokes. This is accomplished by the statement
getmem( P , number_of_bytes) which reserves number_of_bytes
The program allows for storage of 9 drawings. bytes on the heap. (note: the heap is memory space outside the
To verify this storage, bitbuttons “clear” and “repaint” are added. program area and is managed by the operating system) P is a
“Clear” erases the paintbox and “repaint” draws all recorded pointer to this space. The strokes are stored in an array of words.
drawings again. Type TA = array[0..strokewords] of word;
The “backspace” button removes only the last added drawing. PA = ^TA;
Type PA points to the start of an array of (strokewords + 1) words.
The elements in this array are now addresable by statement like
Coding a drawing var p : PA;
I choosed to code a drawing by means of a step-by-step route ................
description. See figure below: P^[ index] := .................
p^[0] contains the number of strokes in the array. See figure ,
showing the data format.
The line (x1,y1) ----> (x2,y2) is painted on the screen and The general format is reallocmem(pointer, bytesize) .
function “recordstrokes” is called to encode the strokes.
The expression for the bytesize : (p^[0]+1) shr 1)+2 evolved
by
Converting a line into strokes p^[0] : the number of strokes stored
“Recordstrokes” translates a line into a sequence of strokes valued (P^[0]+1) shr 1 : the number of bytes needed {rounded
0..7 (not 0..15). upwards}
+2 : bytes needed for p^[0] itself.
For each stroke generated, procedure “savestroke” is called to add
this stroke to the list. Savestroke looks at the previously stored
stroke and in case of equality the new stroke is not stored but the Please refer to the program listing for more details.
old one is increased by 8.
David Dirkse
To encode a line , it must be analysed point by point.
Born 1945 in Amsterdam, David joined Control Data
In this process it is convenient to distinguish “horizontally”- and Corporation in 1968, after studying electrical
“vertically”- oriented lines, see figure: engineering. As a hardware engineer, he was
responsible for the installation and maintenance of
mainframes at scientific data centers in the
Netherlands.
With the decline of CDC around 1990, he studied
mathematics and became a math teacher.
His hobbies are programming, in particular
educational software, math algorithms, and puzzle
solving.
http://home.hccnet.nl/david.dirkse
1.2 .Net
+ added Functions in the "Data" window
+ added new report objects - CellularTextObject,
ZipCodeObject added
+ report's Email settings (see Report|Options... menu,
"Email" tab)
+ added multi-frame TIFF export added RC4 128-bit
encryption in PDF
+ export added "Visible" flag in the highlight editor.
Now the highlight
+ condition may hide the object
+ added TextObject's AutoShrink, AutoShrinkMinSize
properties added
+ DataBand's RowCount property added reportPage.
ManualBuild event added
+ PictureObject.Angle property added AfterData event to all
report
+ objects added CommandTimeout property to all
connections added export
+ of watermarks in HTML format added export of
underlined TextObject
+ (Underlines = true) in PDF format added Swedish,
Chinese
+ (Traditional), Czech, Turkish, Spanish localizations
+ added new demo reports in the "Report Objects"
category added new demo
+ projects in the Demos folder
* POSSIBLE BREAKING CHANGE! changes in the
business objects engine.
See details here: http://www.fast-report.com
/en/forum/index.php?showtopic=5695
* improved performance (loading and running reports with
lot of objects)
* you can use Anchor property of report objects when
printing hierarchical bands
* changed default extension of resulting file in
Excel(XML) export from *.xls to *.xml
* changes in Excel(XML) export - added export of
numeric values
* changes in Matrix object
* improvements in hierarchical reports (header/footers, totals)
- fixed bug in VB.Net report language
- fixed bug in Viewer.exe (exception if window is too small)
- fixed bug with selecting Report in the ReportTree in VS
design-mode
- fixed bug when using WebReport with MasterPage
- fixed bug with RTL in HTML export and WebReport
- fixed bug with RTL in RichText(rtf) export
- fixed bug in MS Chart (border width is not scaled
properly when printing)
- fixed bug with preview window's "Search" dialog
- fixed bug with Nullable column type
- fixed bug in PDF export when exporting complex fills
- fixed bug with export different frame styles in XML
and RichText formats
- fixed bug when editing prepared report
- fixed printing of CellularTextObject
- fixed bug with dialogue form
- fixed bug with Entity Framework in ASP.NET mode
- fixed bug in PageSetup dialog in preview
- fixed bug with rendering side-by-side Matrix objects
- fixed bug in Label wizard
- fixed bug with send email via MAPI
Page 40 / 2154 October 2009 BLAISE PASCAL MAGAZINE 8
COMPONENTS
DEVELOPERS 4