Subject RE: [IBO] IBO version 4.5 - Could you supply change list?
Author Jason Wharton
> where can one access the full list of changes?

Here is the information I have in my release notes so far:

RELEASE NOTES for IBO Version 4.x

11/6/2004 Release 4.5 Ab

I added the ability to save the contents of a BLOB column to a disk file in
the IB_SQL FRM_Browse form.

I pulled most of the include files from the IB_Controls.pas unit back into
it so it is in one file.

I fixed some additional issues with Params when using ClientDatasets.

I fixed some parsing problems to do with FIRST and SKIP features of

11/4/2004 Release 4.5 Aa

I'm continuing to add in the code allowing the dataset to act as a treed
structure. This is a work in progress.

I enhanced the TIB_StringList component to enforce uniqueness at the
IndexName level instead of the whole IndexName and IndexValue pair. Thus,
if you have multiple entries that use the same name there is a potential
problem now. Ideally there shouldn't be such cases in your code and now
this change will prevent that from happening.

When scrolling zero records it is possible to have the current record drop
out. There was a little confusion surrounding whether or not the
BeforeScroll and AfterScroll events should be triggered if nothing was
scrolled to and in fact it was not triggering them. Now I made it
intelligent enough to trigger them when the record will change when
scrolling zero record places.

Changes in IB_Grid.pas:
{ Jason Wharton
{ I made it so that when using the mousewheel and attempting to scroll
to }
{ the BOF or EOF row and there were current edits they would get lost
due }
{ to a DataChange event being fired off because a scroll to the same
w }
{ still considered a scroll, although the BeforeScroll and
rScroll }
{ events may not be fired off causing the edits to be flused to the

The problem with a mouse up event causing a click when it wasn't really a
click on the grid has been resolved. A mouse click event won't be
registered unless there was also a mouse down event to correspond with it.

When using embedded controls in the grid there was a problem when tabbing
into and out of the grid. The embedded control wasn't always displaying
correctly when first entering focus to the grid by tabbing to it. The
embedded controls weren't always showing the correct color either.

Fixed a problem with parameter value handling when using the MIDAS
PSExecuteStatement() method. The values were not properly transferred to
the new statement generated.

10/30/2004 Release 4.5 A

Marco Menardi provided a fix for TIB_CurrencyEdit that had to do with a
VK_DELETE KeyDown event being allowed when the control is ReadOnly.

I fixed a problem with the TIB_LookupCombo control where the color scheme
wasn't working correctly when the dataset was in search mode and the
affected columns were tagged with the NOSEARCH option in the FieldsReadOnly

The ability to have the TIB_Grid control double as a tree viewer has been
started with continuing improvements to come over the next few releases.
The changes impacted the buffering data structures to some extent as well
causing the TIB_Query component to be impacted some to act specifically as a
dataset to service records in a treed configuration.

TIB_Dataset has been enhanced with various optimizations surrounding the use
of field maps which store references to columns on both sides of KeyLinks,
KeyDescLinks, MasterLinks and MasterParamLinks relationships. This is so
that it is no longer necessary to repeatedly use FieldByName() calls which
are expensive computationally. This should make many operations using these
relationships run much snappier.

10/27/2004 Sub-Release 4.3 Ac

I added the ability to deal more robustly with CachedUpdates with the
TIBODataset components by adding a new event called OnCheckCachedInsert:
TIBOCheckCachedInsert. This event allows you to identify if cached inserted
records in the buffer are associated with the various different master
records as they are scrolled though. This makes it so that cached updates
can be fully used in a master-detail context. The only glitch left is that
they will always show up first in the sort order of the detail dataset, but
they are flagged as unsorted so that they don't throw off any other
algorithms relying upon the dataset being sorted.

I enhanced the DisplayFormat of TNumericField instances when they are based
on an underlying integer storage so that they will consistently show as
whole numbers.

I fixed a problem when combining the logic of OnFilterRecord and calculated
fields during the OnFilterRecord event. It was returning NULL when it
should be returning valid data for a column's value. This only had to do
with BLOB fields when in the OnFilterRecord context. Thanks to Ed Dressel
for isolating and assisting with the resolution of this problem.

I fixed a bug in the handling of TField objects in the InternalSetFieldData
method. I thought I was checking the field's ReadOnly property to prevent
the setting when appropriately but due to the way the variable reference
scope was it was mistakenly reading the dataset's ReadOnly property instead.
Thus, I was allowing fields marked as read only to be modified. It will now
raise an exception as it should.

I made various enhancements to the core of the buffering structures in
IB_Session.pas. These mostly had to do with correcting some problems with
CachedUpdates. Some very significant problems were fixed that took me quite
some time to root out. Many thanks to Carlos Cantu who has persisted with
me and worked dilligently with me to solve these problems and provide
testing and feedback.

Changes in IB_Components.pas unit:
{ Jason Wharton
{ I eliminated the record re-fetch operation on an Insert or Edit when
{ blob column is involved if there are no KeyLinks defined. This
ids }
{ the buffer getting wiped out because it is unable to fetch
t }
{ knowing what the KeyLinks

I added BeforeSavePoint and BeforeLosePoint events to the transaction

I moved the event BeforeConnect of the connection component to fire after
the processing of the Login so that the BeforeConnect event is just prior to
the call to the API to obtain the connection.

I enhanced the database level ApplyUpdates() method so that it would process
Detail datasets prior to master datasets.

I fixed a problem with the Locate() method such that when using it on a
detail dataset of a master-detail relationship the detail dataset was
getting an extra parameter added to the internal locate cursor when it
performed the locate on the server that caused it to fail.

I changed the order of calling the AvterOpen event in relation to the
initialization of some of the internal RowNode pointers so that they were
properly interpreted based on the new status of the dataset rather than any
former, potentially bogus values.

I solved a logic problem in the incremental searching routine where it
wasn't coordinating the CallbackInitTick setting just right. When a cursor
reaches the end of the dataset it sets this timing indicator to 0, which
could happen right in the middle of incremental searching processing. I've
now made the incremental searching logic deal with it robustly.

I solved a problem with the handling of NULL columns in incremental
searching. NULLs are sorted to the end of the dataset and when I was
running into the NULL area it was making a comparison based on a blank value
rather than a NULL and thinking that it had gone too far in the dataset and
that the search should be terminated, thus preventing it from finding
targets near the boundary where the NULL values begin. This is because I
have an algorith that will skip ahead records by 10, 100 or more records
(for having the FetchWholeRows false scenario) so that they can approach the
efficiency of a bracketed search in a linear, mostly unbuffered

I fixed a bug in the handling of the time portion of the TIB_DateTimePicker

I fixed a problem with the base class for service applications. The way the
ShutDown logic was causing the host machine to terminate an OS shutdown.
The service app would have to be stopped manually in order to proceed with
an OS shutdown which caused quite a bit of hassles.

{ Mark Pickersgill
{ Added Spacing property to autolabel to provide more control over
{ pixel spacing between the control and the
{ Added new albLeftCenter and albTopCenter Kind options to
{ vertically and horizontally centered
{ Added TrimX and TrimY to the Options
{ Added Font, Transparent and Color
The font property above will more than likely be changed to FontColor,
FontSize, etc. to conserve resources.

3/13/2004 Sub-Release 4.3 Ab

Changes in IB_Components.pas unit:

{ Steven Beames
{ Changed csLoading to csReading in functions
Statement.SysPrepare }
{ and TIB_Dataset.SysOpen to allow a custom component to initialise
owned }
{ TIB components in its Loaded() method. (Based on a suggestion
{ Mahris

{ Christopher Hart
{ Updated support for Boolean Assignment. Was a problem with
TIB_Checkbox }
{ and display of Boolean
{ Updates applied to TIB_COLUMN.GetAsVariant and
TIB_COLUMN.SetAsVariant. }

I added the option for password storage to TIB_Connection.PasswordStorage
property of psParams which simly allows for storing the password in the
Params property in plain text.

I added a new dataset refresh action type called raKeepDataPosOrRowNum which
allows a dataset to try and refresh using a Bookmark but if it is not able
to find the bookmark to then revert to refreshing to the previous row number
rather than just going to the top of the dataset.

I solved a problem with master-detail data change event triggering getting
caught in a perpetual loop due to the possibility of data types not lining
up in such a way that allows their values to exactly match. This is a rare
and special case that really took me a long time to get figured out, but in
short, IBO is now bullet proof when it comes to master-detail linking with
the interruptible fetching of records being in the mix. This is pretty deep
stuff, but the gist of it is, if you have a master dataset and you are
clicking to scroll from one record to the next you can get mouse click
events handled before the detail dataset has refreshed its records based on
the new master record scrolled to. Thus, you could go whipping through
master records and then the detail dataset would have to untangle where this
weird callstack with windows message processing taking place. Now, IBO will
always know exactly how to untangle this and have the detail dataset sync up
with the master even if much of the work it would normally have done was
bypassed. Thus, this is a very unique and powerful feature of IBO allowing
much snappier interfaces, to be perfected. Something I am rather proud of
accomplishing and hope you will enjoy.

I added a new translated constants file for German, Portugese and Russian.

I fixed the problem with the menu on the TIB_Script editor taking the DELETE
keypress away from the editor control.

I added the feature to show NULL values in the FRM_Browse form so that it is
easy to tell between a NULL value and a blank value. This is also due to a
new feature added to the TIB_Grid control to show nulls.

Consideration of PreventDeleting was added to the logic for determining
whether or not the inplace editor for the TIB_Grid goes into edit mode or

I improved the handling of the BaseTransaction in the base class form
IBF_Base that underlies all the forms of the component editors and dialog
forms. It was not using the DefaultTransaction of the associated connection
when an explicit Transaction is not provided. This added behavior made
sense to do since it had the connection reference, which may have a default
transaction reference to make use of.

The ability to explicitly assign a TIB_Session reference to a TIBODataset
component was added. The IB_Session property was made writable.

There was a problem with the handling of the field definition of BCD columns
that needed to be addressed. It now follows explicitly what is defined in
the database to ensure the correct precision is followed in all cases, not
just the most typically used ones.

The TIBODataset.CanModify logic was enhanced to include consideration of the
EditSQL, InsertSQL and DeleteSQL properties as well as the OnUpdateRecord
and UpdateObject references with RequestLive.

I added the option to optionally display FieldTypeInfo in the

I enhanced the SchemaCache so that it would take into consideration the
explicit PRIMARY KEY constraint type instead of relying upon the naming
concention of RDB$PRIMARY.

The usage of macro substitution has been impacted such that the BeginChar
and the EndChar are explicitly spelled out with a string rather than being
just a char that was doubled. This will add to the flexibility for the
future, although it will likely break existing implementations.

A destination stored procedure property was added to the TIB_Import
component so that data can be imported via a stored procedure instead of
just inserted into a table.

The AbortExecuting method of the TIB_Process component was overrided in
TIB_DataScan so that fetching in the dataset will be aborted properly. This
will make usage of the TIB_DataPump more friendly.