Академический Документы
Профессиональный Документы
Культура Документы
QUANTUM COMPUTING
QUANTUM COMPUTING
QUANTUM COMPUTING
QUANTUM COMPUTING
QUANTUM COMPUTING
QUANTUM COMPUTING
QUANTUM COMPUTING
QUANTUM COMPUTING
QUANTUM COMPUTING
QUANTUM COMPUTING
QUANTUM COMPUTING
QUANTUM COMPUTING
QUANTUM COMPUTING
QUANTUM COMPUTING
QUANTUM COMPUTING
QUANT
UM CO
MPU TING
QUA
M C
OMP
UTI
NTU
QUANTUM COMPUTING
QUANTUM COMPUTING
NG
QUANTUM COMPUTING
BY EDITOR
CONTENTS
Articles
QUANTUM COMPUTING
BY EDITOR PAGE 5
MOTION
BLAISE
BLAISE PASCAL
PASCAL MAGAZINE
MAGAZINE
Advertisers
Barnsten 21
Components 4 Developers 40
Computer Math & Games 4
Daniel Teti 4
Raize Software 27 Publisher: Foundation for Supporting the Pascal Programming Language
Visuino MITOV 21 in collaboration with the Dutch Pascal User Group (Pascal Gebruikers Groep)
Stichting Ondersteuning Programmeertaal Pascal
Daniele Teti
www.danieleteti.it
d.teti@bittime.it
Please note: extra space characters have been deliberately added around the @ symbol in
these email addresses, which need to be removed if you use them.
editor @ blaisepascal.eu
Authors - Christian name in alphabethical order
A Andrea Raimondi , L Wagner R. Landgraf, Sergey Lyubeznyy
B Stephen Ball, Peter Bijlsma, Dmitry Boyarintsev K Max Kleiner
C Michal Van Canneyt, Marco Cant, M Kim Madsen, Felipe Monteiro de Cavalho
D David Dirkse, Daniele Teti N Jeremy North,
F Bruno Fierens O Inoussa Ouedraogo
G Primo Gabrijeli, Mattias Gaertner P Howard Page-Clark,
H Fikret Hasovic S Rik Smit, Bob Swart,
J Cary Jensen Z Siegfried Zuhr
Editor - in - chief
Detlef D. Overbeek, Netherlands Tel.: +31 (0)30 890.66.44 / Mobile: +31 (0)6 21.23.62.68
News and Press Releases email only to editor@blaisepascal.eu
Editors
Peter Bijlsma, W. (Wim) van Ingen Schenau, Rik Smit,
Correctors
Howard Page-Clark, James D. Duff
Trademarks
All trademarks used are acknowledged as the property of their respective owners.
Caveat Whilst we endeavour to ensure that what is published in the magazine is correct, we cannot accept responsibility for any errors or omissions.
If you notice something which may be incorrect, please contact the Editor and we will publish a correction where relevant.
Subscriptions ( 2013 prices )
1: Printed version: subscription 65.-- Incl. VAT 6 % (including code, programs and printed magazine,
10 issues per year excluding postage).
2: Electronic - non printed subscription 45.-- Incl. VAT 21% (including code, programs and download magazine)
Subscriptions can be taken out online at www.blaisepascal.eu or by written order, or by sending an email to office@blaisepascal.eu
Subscriptions can start at any date. All issues published in the calendar year of the subscription will be sent as well.
Subscriptions run 365 days. Subscriptions will not be prolonged without notice. Receipt of payment will be sent by email.
Subscriptions can be paid by sending the payment to:
ABN AMRO Bank Account no. 44 19 60 863 or by credit card: Paypal
Name: Pro Pascal Foundation-Foundation for Supporting the Pascal Programming Language (Stichting Ondersteuning Programeertaal Pascal)
IBAN: NL82 ABNA 0441960863 BIC ABNANL2A VAT no.: 81 42 54 147 (Stichting Programmeertaal Pascal)
Subscription department Edelstenenbaan 21 / 3402 XA IJsselstein, The Netherlands / Tel.: + 31 (0) 30 890.66.44 / Mobile: + 31 (0) 6 21.23.62.68
office@blaisepascal.eu
Copyright notice
All material published in Blaise Pascal is copyright SOPP Stichting Ondersteuning Programeertaal Pascal unless otherwise noted and may
not be copied, distributed or republished without written permission. Authors agree that code associated with their articles will be made
available to subscribers after publication by placing it on the website of the PGG for download, and that articles and code will be placed on
distributable data storage media. Use of program listings by subscribers for research and study purposes is allowed, but not for commercial
purposes. Commercial use of program listings and code is prohibited without the written permission of the author.
procedure ;
var
begin Delphi Cookbook
for i := 1 HOICE A
SC
to 9 do 50 hands-on recipes to master the power of Delphi for
M
R BLAISE
cross-platform and mobile development on Windows,
TO
begin PASCAL
Mac OS X, Android, and iOS MAGAZINE
DI
AZING
E
end;
end;
Daniele Teti
Archimedes Mathematician
Roman Empire 700 BC
Archimedes of Syracuse was an Ancient
Greek mathematician, physicist, engineer,
inventor, and astronomer.
He is regarded as one of the leading scientists
in classical antiquity. Wikipedia
Born: 287 - 212 BC, Syracuse, Italy
Euclid Mathematician
Born Mid-4th century BC - 3rd century BC
Residence Alexandria, Hellenistic Egypt
Fields Mathematics Known for
Euclidean geometry / Euclid's Elements
Euclidean algorithm
Pythagoras Philosopher
Pythagoras of Samos was an
Ionian Greek philosopher, mathematician,
and founder of the religious movement
called Pythagoreanism.
Born: 571 - 495 BC,
Thales Philosopher
Thales of Miletus was a pre-Socratic Greek philosopher Difference Engine No. 1, portion,1832
from Miletus in Asia Minor and one of the
IN THIS ISSUE (42) Seven Sages of Greece. Many, most notably Aristotle,
regard him as the first philosopher in the Greek tradition.
Born: 624 BC - 546
DELPHI
The cult of Apollo at
Delphi probably
dates back to
ISSUE 40
the 700s B . C .,
Page 9
WATER CLOCK - CHINA - BEGINNING OF TIME (BC 4000)
Some authors claim that water clocks appeared in China
as early as 4000 BC Babbage Difference Engine No. 2
THALES OF MILETUS PAGE 1/3
Thales of Miletus (c. 624 c. 546 BC)
was a pre-Socratic Greek philosopher, Diogenes Lartius quotes the chronicle of
mathematician from Miletus in Asia Apollodorus of Athens as saying that Thales
Minor and one of the Seven Sages of died at the age of 78 during the 58th Olympiad
Greece.( The Seven Sages (of Greece) (548545 BC) and attributes his death to heat
or Seven Wise Men ( hoi hepta sophoi; stroke while watching the games.
c. 620 550 BC) was the title given by
ancient Greek tradition to seven early-
6th-century BC philosophers, Thales involved himself in many activities,
statesmen and law-givers who were taking the role of an innovator.
renowned in the following centuries for
their wisdom.) Many, most notably
Aristotle, regard him as the first
philosopher in the Greek tradition.
14
6 Issue Nr 4 2015 BLAISE PASCAL MAGAZINE
ARDUINO: THE VISUINO PROJECT - PART 2 PAGE - 4/9
COLLECT DATA AND WORK WITH IT IN DELPHI
In the Object Inspector, select the COM port to which Arduino is connected:
Switch to the OpenWire view, by clicking on the OpenWire tab and connect the OutputPin of the
CLComPort1 to the InputPin of the CLTerminal1:
Compile and run the application. If you The data arrives in binary form. Since in this case
press the reset button on the Arduino board, we know that we are sending text, we can convert
you will see this message: the data to text:
procedure TForm1 . CLComPort1Receive (
ASender : TObject ; AData :
TArray < System . Byte >);
var AText : String ;
begin
AText := TEncoding . ASCII . GetString ( AData
);
end ;
ARCHITECTURE
The three core parts of the TTMSFMXPlanner
are: timeline, resources and items (events). RESOURCES
The TTMSFMXPlanner can display events for a
TIMELINE single resource or can deal with multiple
The timeline determines the visible period of time resources. But there is more.
on the TTMSFMXPlanner and is highly Views with multiple resources can be combined
configurable. Default, it represents the standard with multiple days.
24hr timeline but this can be easily changed to In this way, multiple resources per day and
month mode, a day period mode, a half-day multiple days per resource can be shown. And in
period mode, multi-month mode or a custom addition to this, there is also the flexible
timeline mode. With the custom timeline mode, capability to create groups of a different number
the unit of time along the timeline can be fully of resources or days, like grouping a number of
programmatically set. In one of the included days in a week or grouping a number of
demos will be a timeline in seconds mode that resources to a company etc...
represents a schedule of TV-adds. The timeline
can be displayed on the left side, right side, left ITEMS
and right side or also at the top of the Finally, the TTMSFMXPlanner hosts a collection
TTMSFMXPlanner in a 90 rotated view. of items (events). The items have a start time, end
time, title, notes, color,
Items have settings to allow moving, sizing, for
read-only, for allowing overlap or not etc.. .
Items can be edited via inplace-editing or a built-in
or custom dialog can be used for editing.
To allow the user to insert new items via the user Similarly, we can setup the TTMSFMXPlanner to
interface, various options exist. First, an item canautomatically create and edit items on the selected
be inserted in the selected area from an external time slots when pressing the INS key by setting
button with code: TTMSFMXPlanner.Interaction.
var keyboardInsertMode to
it: TTMSFMXPlannerItem; pkimSelection or
begin
it := TMSFMXPlanner1.Items.Add;
pkimSelectionDialog.
it.StartTime := In a similar way, via settings
TMSFMXPlanner1.CellToDateTime(TMSFMXPlanner1.Selection.StartCell); under TTMSFMXPlanner.
it.EndTime := TMSFMXPlanner1.CellToDateTime(MakeCell( Interaction,
TMSFMXPlanner1.Selection.EndCell.Col,
it can be configured how items
TMSFMXPlanner1.Selection.EndCell.Row + 1));
end; are edited with mouse or
keyboard interaction.
TTMSFMXPlanner.
NOTE the increment of 1 for the Interaction.MouseEditMode defines
Selection.EndCell to retrieve the time at the whether the item goes in edit mode after a
end of the last timeslot in the selection. single click, double click or single click on an
Alternatively, with a simple property we can already selected item.
instruct the TTMSFMXPlanner to automatically When TTMSFMXPlanner.Interaction.
create an item after selection with KeyboardEdit = true, pressing F2 starts
TTMSFMXPlanner.Interaction. editing for the selected item.
MouseInsertMode = mimAfterSelection. The type of editing, i.e. in-place editing or editing
When an item is created this way, the via a popup dialog is chosen with
OnAfterInsertItem is triggered when the TTMSFMXPlanner.Interaction.
item is created and from there the item can further UpdateMode set to pumInplace or
customized: pumDialog.
procedure TForm1.TMSFMXPlanner1AfterInsertItem(Sender: TObject;
AStartTime,
AEndTime: TDateTime; APosition: Integer; AItem: TTMSFMXPlannerItem);
begin
AItem.Title := 'Insert';
end;
Many other timeline modes are built-in also In the TTMSFMXPlanner modes where multiple
and set with resources come into play, the resources are setup
TTMSFMXPlanner.Mode: via a TTMSFMXPlannerResource collection
pmDay: under TTMSFMXPlanner.Resources.
single day, multiple resources By default, there are already 3 resources added
viewpmMultiDay: but this can be easily changed to the number of
multiple day view resources required. In a simple multiresource
pmMultiDayRes: mode like the pmHalfDayPeriod mode in the
mixed multiple day / resources view screenshot above, when
pmMultiResDay: TTMSFMXPlanner.Positions is set to 3,
mixed multi resource / multiple day view it will list in the header for each position the
pmDayPeriod:
resource description found under
multiday per day timeline with TTMSFMXPlanner.Resources or when for a
multiresource view
position no resource collection is defined,
pmHalfDayPeriod:
it will get the description Position X.
multiple day per halfday timeline with
Items in the TTMSFMXPlanner are bound to a
multiresource view
pmMonth: resource via the
per month and per day with multiresource view TTMSFMXPlannerItem.Resource property.
pmMultiMonth: multiple months, single
resource view
pmCustom: custom timeline view
procedure TForm1.TMSFMXPlannerGoogleAdapter1GCalendarItemToItem(
Sender: TObject; GoogleItem: TGCalendarItem; Item: TTMSFMXPlannerItem);
begin
case GoogleItem.Color of
icBlue : Item.Color := claBlue;
icGreen : Item.Color := claGreen;
icRed : Item.Color := claRed; i
cYellow : Item.Color := claYellow;
end;
end;
Figure3:
Map 2.1: Dynamic map of Delfi
Issue Nr 4
3 2015 BLAISE PASCAL MAGAZINE 33
29
MAPPING USING DELPHI PAGE 3/5
In order to control the map inside of Delphi we MAPPING USING COMPONENTS
need to know how to call a Javascript routine in While building dynamic maps you'll soon come
the webpage our Webbrowser component is to the conclusion that it's a lot of work to get
currently showing. For the newer versions of things right, and very error-prone too. When you
Delphi you can use the procedure wonder if it would be possible to convert it to a
EvaluateJavaScript. That is if you're using FMX. handy Delphi component you're in luck. Xavier
For some unknown reason this functionality is Martinez Garsaball has taken the initiative to
not available for the VCL-component. build a complete component-set and make it
available to us. You can download it at:
So even adding it in a future version will not
http://www.cadetill.com/gmlib_en/
solve your problem as Embarcadero most likely
won't give you an update for your current, The components come with full source code and
somewhat older, version. instructions how to install them (for Delphi 6 and
higher). The base component is called
Luckily we can find examples how to do it on TGMMap. This is not, as you tend to expect, an
the internet. In the example in the download I adapted version of a TWebbrowser, but a
implemented the procedure using a helper, standalone component that connects to a
so now we can use is just as if it was embedded TWebbrowser component which you have
inside the TWebbrowser component. dropped on your form.
Using this procedure we have the possibility Furthermore there is a load of component to
to call the right Javascript and manipulate the simplify tasks like adding your own track to
map as we want. Just like with static maps we the map. In most cases these components have a
now can change the view, put all kinds of layers reference to the Google-documentation, another
on and off, and again many more, as long as we way to find out where they can be meant for.
have added the Javascript functionality needed to Besides these components the download contains
do to accomplish it. an example program MegaDemo. It gives a
But this procedure doesn't return any decent insight in the plenty of possibilities of the
information to us. Knowing where we, component set.
For too many to describe in the context of this
geographically speaking, did click on the map
article. I'll pick out just one: adding your own
could of course be handy. Again we can find
track . Using a TPolyLine allows you to
examples how to do this. Most writers write the
show a series of geographical coordinates on the
information from Javascript to a hidden
map. The MegaDemo already shows two
inputbox in the HTML context. Then search
examples.
inside Delphi for this inputbox and then read the
(text)information. To do it you need to know But of course it's more fun to show your own
about the internals of the TWebbrowser. walk on the map. As a matter of fact I rarely go
The kind of things you don't really want to know. outdoor without my GPS-unit so easy enough
I added a function in the earlier mentioned to find one to use, even in Barcelona, the location
helper, so now you can read the inputbox using shown when MegaDemo is started. But how to
just one simple statement. load it? Unfortunately this is not worked-out in
A few writers use a more direct way of retrieving MegaDemo as it is just a Demo!
data. The following (example) code can be used to So we have to code this ourselves. After some
read an existing Javascript variable directly: thinking and inspecting the code it's obvious
where we should add it, in PolylinesFrm.
Var v :OleVariant;
MyJavaX :int32;
There I added a button to add a track from a
begin external file. But how to read a file with
v := WebBrowser1.Document; geographical information in Delphi.
MyJavaX := v.parentWindow.myX; The problem is there exist quite a lot of different
end; formats. For a few I use myself I have my own
Code example: reading a Javascript-Variabele
parser but for the vast lot of them not. Luckily
enough there is a program called GPSBabel
The example code reads then variable myX. that can be used to convert most of the formats to
Be careful, all inside of Javascript is casesensitive. the format you happen to need.
So there exist both variables myX en myx. I used it to convert my track to a simple csv-
In consequence we must use the right case for our file containing a list of geographical
variable, even inside Delphi. coordinates only. Just beware of decimal comma
The code in the download contain an example or point or comma problems and the track is
where I use both ways to retrieve the same loaded.
information.
Figure 6.
Height measurement from the GPS-unit
HOW TO CONTINUE...
This article introduces some ways to build a map
using Delphi. The effort made by cadatill opens
the way to a vary many possibilities. Let this
rainy Sunday afternoons come! Wouldn't this be
enough, also offline there is still a lotto explore.
Thanks to OpenStreetMap nowadays there are
maps available for the whole world, very
complete and accurate. The download contains
some links to give you a start.
IkbmMWSystem
LogManager
IkbmMWLocalFile
LogManager
A log manager 1
IkbmMWTee
LogManager
Log (IkbmMWLog) A log manager 2
IkbmMWProxy
LogManager A log manager
IkbmMWClient IkbmMWServer
LogManager LogManager
34 COMPONENTS
DEVELOPERS 4 Issue Nr 4 2015 BLAISE PASCAL MAGAZINE
LOG, DEBUG AND AUDIT THE KBMMW WAY PAGE - 3/7
mwllAdvanced THE FRONTEND
This is only of interest for log managers that The Log object contains a number of methods in
specify interest in this level or higher for the various categories.
given log type. The basic category consists of the methods
mwllHighest Info(..), Debug(..), Warning(..),
This is only of interest for log managers that Error(..), Fatal(..) and Audit(..).
specify interest in this level or higher for The functions are overloaded to allow for
the given log type. various arguments starting with a simple string,
to providing a timestamp, an origin, a format
Typically you would use the levels in combination and a number of values. Use the version that
with for example debug to log relevant coarse makes sense for your purpose.
grained debug info at normal level Example:
and more fine grained and detailed Log.Info('This is some info');
info at a higher log level. This way Log.Debug('This is some debug info');
Log.Warn('This is a warning');
you can, at runtime, indicate on the Log.Error('This is an error');
various log managers, what level of Log.Fatal('This went very bad: %d/%s',[10,'shit happens']);
log info you want the log manager Log.Audit('This is to be stored as audit info');
kbmMW will then automatically load it, All log entries includes a timestamp with
and provide line number and source code timezone information, the log type, a process id
information in the stack trace. / thread id and an explanatory text. In addition
If the map file is not available, only the raw more lines may be added like a stack trace,
hexadecimal source address for the call will be binary dump etc.
presented.
2015-05-26T14:32:11.817+02:00 : Info : 315736/318408 : This is some info
2015-05-26T14:32:11.836+02:00 : Warning : 315736/318408 : This is a warning
2015-05-26T14:32:11.836+02:00 : Error : 315736/318408 : This is an error
2015-05-26T14:32:11.837+02:00 : Fatal : 315736/318408 : This went very bad: 10/shit happens
2015-05-26T14:32:13.155+02:00 : Info : 315736/318408 : Some XML
<start></start>
2015-05-26T14:32:13.156+02:00 : Debug : 315736/318408 : c:\windows\write.exe
00000000 : 4D 5A 90 00 03 00 40 00 00 00 00 00 00 00 MZ ..... ...... ....... @.......
36 COMPONENTS
DEVELOPERS 4 Issue Nr 4 2015 BLAISE PASCAL MAGAZINE
LOG, DEBUG AND AUDIT THE KBMMW WAY PAGE - 5/7
The last category of log methods is the timing All log managers have these properties available:
methods. They are powerful for performance
check specific parts of your application. LogTypeFilter
Timing a part of code is done by starting a named of type TkbmMWLogTypes,
timer, and querying it at relevant times and LogDataTypeFilter of type
finally ending it when it's no longer needed. TkbmMWLogDataTypes and
The way it has been implemented in kbmMW, LogLevelFilter
they take up very few resources, while being of type TkbmMWLogLevels.
extremely fast and with the highest precision
available on the platform. Default LogTypeFilter is set to include all
There is a limit of 100 concurrent active timers. log types, LogDataTypeFilter to include all
You can name them as you see fit. data types and LogLevelFilter to include all
You start time measuring by (specifying the timers log levels.
name as A):
Log.TimeStart('A'); However let's say you only want to log errors
and fatal errors in the default log manager, you
And can optionally log time lapse info by: do like this:
Log.TimeLapse('A','Time taken
until this point'); Log.Log.LogTypeFilter:=[TkbmMWLogType.mwltEr
LogTypeFilter:=
[TkbmMWLogType .mwltError,TkbmMWLogType.mwltFatal];
ror,TkbmMWLogType.mwltFatal];
You must always end a timer by:
Log.TimeEnd('A','Time taken until All other logs are now ignored by the log
this point');
manager.
This will free up the timer slot which can then be CHANGING THE LOG MANAGER
reused by another named timer. For now we have used the system log manager.
TimeLapse and TimeEnd both logs and Changing to use a local file log manager is easy
returns the measured time in msecs.
var filelogmgr:IkbmMWLocalFileLogManager;
begin
If you want to get the precise time, without filelogmgr:=
making a log entry, you can use: TkbmMWLocalFileLogManager.Create(
Msecs:=Log.TimeEnd('A'); '.\log.txt','.\audit.txt');
filelogmgr.DeleteOldLog:=true;
filelogmgr.DeleteOldAudit:=true;
If you do not provide an explanatory text to filelogmgr.FlushInterval:=0;
TimeEnd, it assumes you want to end the timer Log.LogManager:=filelogmgr;
and return the time taken, without logging
anything. In this case we have specified that the log should
The log entries made using the be collected in two local files. All audit logs
TimeLapse/TimeEnd methods are default should end up in audit.txt, while all
registered as type mwltDebug and level remaining logs should end up in log.txt.
mwllNormal. Each log manager has a number of properties
If you want the timings to be logged as a different that can be set. The local file log manager has
type or a different level, you can use other one, called FlushInterval.
variants of TimeLapse/TimeEnd methods Its default set to flush data to disk when more
where the log type and log level can be given. than 10 seconds have passed since last log, when
a new log entry is added.
FILTERING LOGS Setting it to 0, force it to always flush each single
Let's say that you have a lot of debug logging
logging to disk.
around in your code, and you want to filter it out
from your log presentation, without having to
remove or comment out all the log statements.
You can do that easily by manipulating properties
on the log manager.
Figure 10
filelogmgr:=TkbmMWLocalFileLogManager.Create('.\log.txt','.\audit.txt');
filelogmgr.DeleteOldLog:=true;
filelogmgr.DeleteOldAudit:=true;
systemlogmgr:=TkbmMWSystemLogManager.Create;
teelogmgr:=TkbmMWTeeLogManager.Create(filelogmgr,systemlogmgr);
Log.LogManager:=teelogmgr;
First we define a system log manager and a local On the log server side, you will need to do
file log manager, and then we define a tee something similarly.
manager, which sends logs to the var
two other log managers. fm:IkbmMWLocalFileLogManager;
lm:IkbmMWServerLogManager;
begin
fm:=TkbmMWLocalFileLogManager.Create('.\loginfo.txt',0);
lm:=TkbmMWServerLogManager.Create(fm);
lm.Transport:=kbmMWTCPIPIndyMessagingServerTransport1;
Log.LogManager:=lm;
REMOTE LOGGING
A next logical step is to want to send
log from a client to a server to centralize log The server log manager will automatically
somewhere. This feature is only available in subscribe for LOG events coming from the client
kbmMW Enterprise Edition, as it uses the WIB log manager, and will forward those to a local
publish/subscribe transport. file log manager.
On the log client, we define a client log
manager. That log manager can be connected to All local logging on the server via the Log
either a client or a server WIB transport. methods, are also sent directly through the
Notice that the client log manager must be in the server log manager to the local file log manager
end where you use the Log command and and is thus interleaved with log from clients.
where you want that log to be shipped off to A couple of other properties are also available on
somewhere else. It probably is often in an the log managers.
application where you use a WIB client side
transport, but it doesn't necessarily have to be. BinaryPrettyMode can be set to
mwlbpmDefault, mwlbpmBase64
var
lm:IkbmMWClientLogManager; or mwlbpmPretty.
begin It controls how binary data is output.
// Setup log manager for remote logging. In default mode, then audit data is
lm:=TkbmMWClientLogManager.Create;
handled as base 64, while other binary
lm.Transport:=kbmMWTCPIPIndyMessagingClientTransport1;
Log.LogManager:=lm; data is handled as pretty data
(nice 32 column hexdump).
Each time you use the Log methods, their You can force it to one or the other by setting this
output will automatically be sent via the property.
messaging system and thus be placed in the Enabled is default true. If set to false, then all
outbound queue until a connection is logs via this log manager is ignored.
established to the receiving end. The log system Options control various things like if the log
does not attempt to establish that connection system should dump process and thread id
automatically. (mwloProcessThreadInfo), thread name
(mwloThreadName) and if it should dump
handled exceptions
(mwloAutoLogExceptions).
38 COMPONENTS
DEVELOPERS 4 Issue Nr 4 2015 BLAISE PASCAL MAGAZINE
LOG, DEBUG AND AUDIT THE KBMMW WAY PAGE - 7/7
ASSERT BASED LOGGING FINAL NOTES
Delphi contains an intrinsic procedure called To use assert based logging, you will have to
Assert, that normally throws an exception if a ensure that
condition is false. It's designed to check for KBMMW_INSTALL_ASSERT_HANDLER is
logical values before use in an application, while defined in kbmMWConfig.inc, or alternatively
the application is compiled for debug. you can manually call
Typically when the application is compiled kbmMWLog_InstallAssertionHandler
for release, assert is disabled, which means the before use.
compiler completely avoids including code
related to the assert statement and functions If you have installed the assert handler manually
called that are part of arguments for the assert you MUST uninstall it too, before program exit
statement. by calling
kbmMW optionally takes advantage of this kbmMWLog_UnInstallAssertionHandler
feature. .
COMPONENTS
4
- Improved performance on Indy TCP/IP
Client messaging transport for large number
of inbound messages.
DEVELOPERS
EESB, SOA,MoM, EAI TOOLS FOR INTELLIGENT SOLUTIONS. kbmMW IS THE PREMIERE N-TIER PRODUCT FOR DELPHI /
C++BUILDER BDS DEVELOPMENT FRAMEWORK FOR WIN 32 / 64, .NET AND LINUX WITH CLIENTS RESIDING ON WIN32 / 64,
.NET, LINUX, UNIX MAINFRAMES, MINIS, EMBEDDED DEVICES, SMART PHONES AND TABLETS.