- - * - WhiteUnicorn - * - -




* #WhiteUnicorn/ StartPage/ Documentation/DelphiFAQ >


2780:Delphi vs Visual Basic

KEYWORDS: Delphi, VisualBasic, Microsoft, Comparison, evaluation AREA: Product

An Evaluation of
Rapid Application Development Tools for Windows:
A Comparison Between
Delphi and Visual Basic

Table Of Contents

Introduction
Windows Visual Development
Performance
Benchmarks
Benchmark Results
Rapid Application Development (RAD)
Controls
Control Icon Array
Templates and Experts
Object Placement
Property Lists
Code Window
Debugging And Object Inspecting
Component Reuse
Shared Event Functions
Reusable Functions and Libraries
Components
Programming Language
OOP Design Methodology
Database Scalability
Moving Up to Delphi
Conclusion

Introduction

With the growing demands on Windows applications developers to
create increasingly complex applications in less time, the
evolution of Rapid Application Development (RAD) tools has become
a crucial focus of the development community. First-generation
RAD tools for Windows included application frameworks (such as
OWL and MFC), DLL-based class libraries, and VBXs (Visual Basic
custom controls).

The release of Borland's Delphi heralds a new generation of RAD
tools that combines the power of traditional 3GL compilers with
the ease of use and development speed of a 4GL environment.  This
white paper will contrast the approach of the new technology used
by Delphi with that of Microsoft's Visual Basic.

Windows Visual Development

The earliest methodology for Windows applications programming was
to code directly using calls to the Windows API.  The API
provided a crude mechanism for creating such items as menus and
windows, leaving the developer with an enormous coding task even
when creating a rudimentary application.  These early programs
were typically created with C compilers that were equally crude
by today's standards.   As a result, the expectations for what
could reasonably be achieved by professional developers was
severely limited by schedule and performance constraints.  Early
applications were also, for the most part, independent. In other
words, they were generally not reliant on each other and did not
share data or invoke other applications.

Appreciating the underlying potential of the Windows environment,
the development community demanded better tools, to enhance their
productivity and facilitate the creation of more sophisticated
applications.  As Windows evolved, inter-application
communications using DDE and OLE was introduced, then more
powerful application frameworks products such as Borland's OWL
and Microsoft's MFC appeared, as well as third-party products
such as zApp from Zinc and Island Systems' object-Menu.

These libraries were used to encapsulate the most common
functions of Windows applications, as well as to leave room for
expansion and customization by developers. Thus, a programmer
could quickly create a window with a certain border style, make
it modal and add a "Close" button, then invoke it with a single
call.  Further, the advent of C++ compilers for Windows allowed
experienced developers to exploit the power of object-oriented
technology.  Developers now had the means to create complex
applications within acceptable schedules.

Object-oriented languages allowed developers to create classes
and override specific virtual functions, providing a direct path
to building custom libraries.  This generation of tools still had
two major shortcomings:

1.   Although productivity had been significantly increased,
     schedules for complex applications development were still
     quite lengthy.  For example, the common development scenario
     would proceed as follows:
     a)   some sample screens would be created in a prototype
          environment or a resource tool;
     b)   marketing would critique the screen design and
          modifications would be made;
     c)   the "final" screens would be integrated with code to
          complete the application;
     d)   any changes that were requested often became
          complicated and painful, since the code and the screens
          were so closely linked.

2.   The expertise required made Windows programming the sole
     domain of the experienced developer.  In other words, the
     extensive needs of the corporate community simply could not
     be met due to the requirement for significant programmer
     expertise.

Thus evolved the next stage of Windows development, characterized
by 4GL visual design environments such as Microsoft Visual Basic
and high-end products such as Powersoft's PowerBuilder.  These
environments provided a major step forward in user-friendly
development, with high-level, reusable components called controls
which introduced the concept of a "building block" approach to
software development.  Most of the application development effort
could now occur within a visual design tool where the programmer
would piece together an interface from a suite of available
libraries.  Customization of the components can be accomplished
by modifying a corresponding collection of properties sheet.  Any
"work" to be done within the application is triggered via events
that affect the interface components (mouse clicks, keyboard
entries and so on).  With these first-generation visual
development tools, the specification of the actions to be taken
on these events is defined using a Basic-like scripting language.

As proven by their broad popularity, these tools went a long way
toward solving some of the problems of corporate developers.
However, there remained a serious deficit in their capabilities,
due to their reliance on the visual design process for creating
the application and also their underlying interpreted languages.

As the demands of Windows applications buyers continued to grow,
developers were stretching the limits of the existing
technologies to create projects such as mission-critical
client/server applications.  Team development and software
quality assurance issues were becoming prominent.  Applications
were being designed as a series of modules that would need to
interact seamlessly, and capable of communicating with and
invoking other applications. For example, a user may have a need
to insert a graphic in the context of an application. The graphic
would be found by accessing a database created by some other
application potentially residing over a network on a remote
system. All of this needed to be transparent to the application
at hand, so that users need not be concerned with where the
graphic came from or how it was created.


Specifically, the following issues thus became crucial to
professional applications developers:

*    Performance
*    Rapid Application Development
*    Component Reuse
*    Database Scalability

The next logical step in this evolution is technology that
combines the significantly enhanced productivity of modern RAD
tools with the power and flexible architecture of proven 3GL
compiled languages.  The remainder of this paper will contrast
how Delphi and Visual Basic address these four key criteria for a
robust Windows development system.

It is assumed that readers of this paper are familiar with RAD
design concepts, but a detailed knowledge of Visual Basic or
Delphi is not necessary in order to understand this paper.

Performance

Performance of deployed applications is a key issue in today's
highly competitive software market.  Particularly for large,
distributed client/server applications, any shortfalls in
execution speed become far more apparent, due to higher overall
system demands.

Delphi is based upon Object Pascal (a significant extension of
the popular Borland Pascal 7.0) whereas Visual Basic uses
Microsoft Basic as its underlying language.  Delphi's performance
is significantly better, simply because it generates compiled
executable files, while Visual Basic produces semi-interpreted
code. That is, Delphi is built around an optimizing native code
compiler instead of the slower interpreted p-code used by
products such as Visual Basic. This results in Delphi
applications executing 10 to 20 times faster than interpreted
code.  Delphi's intelligent linker also enables segment
optimization, thereby reducing executable file size by as much as
30 percent, which enables faster loading and additional
performance gains.

Delphi can compile standalone executable files (.EXEs) as well as
reusable Dynamic Linked Libraries (DLLs).  For the ultimate in
execution speed, Delphi also allows professional programmers to
go one step further by writing in-line assembler code, for direct
control of the microprocessor.

Other areas in which Delphi displays considerable performance
gains over Visual Basic is in database connectivity. The database
layer of Visual Basic is implemented via ODBC, as opposed to the
more efficient Borland Database Engine used in Delphi (and other
core Borland development tools). However, Delphi also supports
links to data via ODBC drivers. The high-performance native SQL
Links supplied with Delphi Client/Server also outperform
comparable Visual Basic SQL connectivity options.

Benchmarks

Delphi's superior performance over Visual Basic becomes
immediately apparent when running a few simple benchmarks.
Consider the following examples, where a database is filled with
items of text representing lastname, firstname, phone and street
information. The phone number field is filled with consecutive
integers, then the database is re-read and filled with a global
array of integers from the phone number field. Finally, the
global array is sorted to become reverse-ordered using a
comparatively slow bubble sort algorithm.

Similar code can be written in both Delphi and Visual Basic, with
the stages of the benchmarks summarized in the following code
fragments:



VB - Fill
---------
Sub btnFill_Click ()
Dim k As Integer
 MaxArray = EdArraySize.Text
 For k = 1 To MaxArray
  Data1.Recordset.AddNew
  Data1.Recordset("LastName") = "Smith " + Str(k)
  Data1.Recordset("FirstName") = "Joe " + Str(k)
  Data1.Recordset("Phone") = Str(k)
  Data1.Recordset.Update
 Next k
 Data1.Recordset.MoveLast
End Sub

VB - Read
---------
Sub btnSearch_Click ()
Dim k As Integer
Dim n As Integer
Dim s As String
 Data1.Recordset.MoveFirst
 For k = 1 To MaxArray
   s = edPhone.Text
   n = Val(s)
   Call AppendArray(k, n)
   Data1.Recordset.MoveNext
 Next k
End Sub

VB - Sort
---------
Sub btnSort_Click ()
 Dim j As Integer
 Dim k As Integer
 Dim tmp As Integer
 For j = 1 To MaxArray - 1
  For k = 1 To MaxArray - j
   If GlobArray(k) < GlobArray(k + 1) Then
     ' Swap GlobArray[k+] with GlobArray[k] ...
     tmp = GlobArray(k + 1)
     GlobArray(k + 1) = GlobArray(k)
     GlobArray(k) = tmp
    End If
   Next k
  Next j
End Sub


Delphi - Fill
-------------
procedure TForm1.Button4Click(Sender: TObject);
var
 k,err: integer;
 s: string;
begin
 val(edDBsize.Text,maxArray,err);
 for k:=1 to maxArray do
  with Table1 do
   begin
    str(k,s);
    Append;
    FieldByName('Lastname').AsString := 'NewGuy'+s;
    FieldByName('Firstname').AsString := 'Paul'+s;
    FieldByName('Phone').AsString := s;
    Post;
   end
end;

Delphi - Read
-------------
procedure TForm1.btnSearchTestClick(Sender: TObject);
var
 s: string;
 n,err,k: integer;
begin
 val(edDBsize.Text,MaxArray,err);
 Table1.First;
 for k:=1 to MaxArray do
  begin
   s := DBedPhone.EditText;
   val(s,n,err);
   AppendArray(k,n);
   Table1.Next;
  end;
end;

Delphi - Sort
-------------
procedure TForm1.btnSortArrayClick(Sender: TObject);
var
 j,k,tmp: integer;
begin
 for j:=1 to MaxArray-1 do
  for k:=1 to MaxArray-j do
   if GlobArray[k] < GlobArray[k+1] then
    begin
     { Swap GlobArray[k+] with GlobArray[k] ... }
     tmp := GlobArray[k+1];
     GlobArray[k+1] := GlobArray[k];
     GlobArray[k]   := tmp;
    end;
end;

Benchmark Results

The following table shows the results for database tables ranging
in size from 100 to 4000 records.  The test stages Fill, Read and
Sort correspond the code sections described on the previous
pages.
(All benchmark times are in seconds.)













D  = Delphi
FL = Fill
RD = Read
X  = x Sort
ST = Sort

-----------------------------------------------------------------
#     D     VB    D    VB    D    X    VB   D      X Total  VB
items
      FL    FL    RD   RD    ST        ST   Total           Total
      --    --    --   --    --        --   -----           -----
100   2     2     30   1     0    0    0    2      1.5      3

1000  16    70    6    23    1    22   22   23     5        115

2000  33    141   12   46    4    21   84   49     5.5      271

3000  50    227   17   69    8    23.6 189  76     6.4      485

4000  67    297   23   77    15   19.6 294  106    6.3      668
-----------------------------------------------------------------


As can be seen from the results, the resulting Delphi-generated
code outperformed the Visual Basic routines, especially in
code-bound portions such as the Sort stage, by about 20 times
faster.  Delphi's database access functionality was also shown to
be about five times more efficient than that of the Visual Basic
code.


Rapid Application Development (RAD)

The other side of the performance issue relates to the speed of
application development, which is crucial for programmers intent
on ensuring the fastest time to market for their products.  The
RAD features of an environment are the key to establishing how
easy it is for programmers to progress from initial design and
prototyping through to final implementation and deployment.

A modern RAD environment provides developers with several
elements that significantly speed the development process over
the traditional sequential coding approach.  These include:

*    A visual design environment;
*    High-level building block components (often called
     "controls");
*    Contextual access to code segments directly, via objects.
     In other words, homing in on the specific code relating to a
     particular object.

Under Windows, the structure of an application is frequently
molded around its graphical user interface (GUI), with the
behavior of the application triggered by various Windows
messages or events.  The methodology for RAD flows according to
the following outline:

1)   The developer creates an empty window or form to contain the
     application's interface components;

2)   The developer selects a component from a pool of available
     components, which are generally displayed as an array of
     icons. Components are then placed and sized on the form;

3)   Relevant properties are set or adjusted for each component,
     according to the application's requirements;

4)   Code is written and "attached" to all relevant events for
     each component;

5)   The application is run within the development environment;

6)   The developer can then continue to modify the form design or
     underlying code until the final working application is
     completed.

Both Visual Basic and Delphi subscribe to this general
methodology, making the products appear deceptively similar.
However,  there are several key enhancements that Delphi adds to
this process, including:

*    More built-in controls Enhanced icon layout, via a
     fully-customizable, multi-page (tabbed) component palette;

*    Extensive gallery of extensible project templates and
     experts;

*    Enhanced object placement capabilities;

*    Enhanced modification of property lists;

*    Two-way, synchronized code window;

*    Shared event functions;

*    Integrated graphical debugging and object inspection

Controls

Visual Basic custom controls are referred to as VBXs, and a
limited selection is supplied with Visual Basic itself.
Additional controls are sold by third-party manufacturers,
although these not only cost additional money but also extend the
overall learning curve, due to variations in product styles.  To
utilize controls for a tabbed folder, notebook, database grid or
3D list box, for example, Visual Basic owners must obtain
third-party VBXs. Some of the controls supplied with Visual Basic
suffer from memory and other limitations, making it necessary to
purchase third-party alternatives.

Delphi's Visual Component Library (VCL) is a comprehensive suite
of high- performance controls that support all standard Windows
functionality, along with additional features such as tabbed
folders, notebooks, database grids and 3D list boxes. Delphi also
supports third-party VBXs, providing access to a wide range of
third-party components.

Control Icon Array

The Visual Basic control display is an array of icons with
pictorial representations that are not always intuitive.  In
other words, developers can be left searching for the Image
Control, for example, amongst many other icons with a similar
look.  Developers must then place a control into the form to be
certain as to its identity. The Visual Basic control icon array
can quickly become unwieldy as additional third-party custom
controls are acquired.  Since these icons are organized as a
configurable rectangle, developers working with a large set of
VBX controls are forced to give up valuable screen space or
sacrifice accessibility of some controls.

Delphi solves these component layout problems with several
enhancements. Firstly, Delphi's component palette is organized
with several tabbed notebook pages, displaying icons in a
single-row, scrollable toolbar format. This keeps the display
uncluttered, yet fully accessible. More importantly, Delphi's
customization options allow full configuration of the grouping,
placement and display of components, so that  the environment can
be fine-tuned to suit the working style of an individual or
development team. To address the problem of obscure or
similar-looking icons, Delphi offers "fly-by help" showing the
purpose of the control associated with the icon as the cursor is
dragged over it.

Templates and Experts

Delphi includes pre-built templates that make it easy to develop
standard applications or complex components such as MDI windows,
database forms, multi-pages dialog and dual list boxes.  The
architecture is fully extensible, allowing developers to easily
register their own custom templates and experts into the gallery.

Object Placement

Delphi facilitates visual design with features such as automatic
object alignment, sizing and scaling, while Visual Basic supports
placement only.  Delphi's automatic alignment also speeds up the
creation of aesthetic forms.

Property Lists

A subtle yet significant distinction between the two development
tools can be seen in the means of accessing property lists.
Visual Basic users access a pull-down selection of options for a
particular property via an entry bar at the top of the list, so
that changing several property items, requires selection of the
item, clicking on the entry bar to make the change, then clicking
on the next item, and so forth.  Delphi provides pull-down lists
that can be accessed directly alongside the property value,
making for more efficient and intuitive modifications.

Code Window

Delphi's code editing window synchronizes all visual design
representations with the underlying source code.  In other words,
as the application is constructed by dropping objects into a
form, the corresponding bug-free code is generated
simultaneously.  There are no limitations, since the code is
always accessible, and developers can instantly switch between
the code editor and the visual design tools, allowing them to
select the most efficient mode for each part of the project.

Debugging and Object Inspecting

Visual Basic provides program debugging capabilities such as
variable watches and a call stack monitor. However, this
functionality is limited in that it cannot break on a specific
condition, and the call stack is modal, so it cannot be viewed
during the entire debug session.

Delphi provides a full-featured debugger with conditional
breakpoints and a modeless call stack viewer. The debug window
and viewers can be saved from session to session, allowing
developers to create a comfortable custom environment. Delphi
also includes a powerful object browser similar to that used
within Borland C++, which provides a comprehensive display of
code objects and classes - including the capability to trace
object lineage (inheritance, children) and virtual procedures.

Component Reuse

One of the most significant advances in applications development
methodology is the concept of creating an application from
high-level components.  By linking predefined building blocks,
developers need only define the "glue" between objects that
specifies the unique qualities of an application, with the
potential for substantial productivity gains.  Although Delphi
and Visual Basic both provide various ways to reuse and share
components and code, Delphi again delivers a cleaner and simpler
solution.

The issue of reuse can be viewed in three areas:

*    shared event functions

*    reusable functions

*    reusable building blocks (components)

Shared Event Functions

A common problem encountered in Windows programs is how to share
a function that is executed upon the occurrence of several
Windows events. Although the implementation is similar in both
Delphi and Visual Basic, the Delphi solution has some obvious
advantages.  In Visual Basic, shared functions must be placed in
the local code file or in a global .BAS file if the function is
to be shared.  The problem with this is that the function is now
global to the entire project.  In contrast, Delphi allows the
function to be placed in the local file or in a DCU (Pascal unit
file) which must be explicitly referenced only by the files that
use it.

Reusable Functions and Libraries

In Visual Basic, common functions or libraries are accomplished
by use of a global .BAS file, which then makes the functions
accessible to every file in the project. The disadvantage to this
approach is that the shared functions must be global to every
file.  Alternatively, Visual Basic can take advantage of
functions organized in a DLL, but DLLs (like VBXs) must be
created by another development tool external to Visual Basic,
which requires a different level of expertise and an additional
learning curve. All libraries for Delphi can be created from
within the Delphi environment. Pascal code is organized as units,
and shared functions are accessible through a Pascal unit by
simply referencing the "library" unit  that contains the desired
function.  Delphi can also use and create high-performance
Windows DLLs.  Further, Delphi's underlying programming language
allows developers to reuse and customize functionality within a
class via subclassing (see further details of OOP methodology
below).

Components

VBXs can be developed for Visual Basic with functionality that is
usable across different projects, but a significant disadvantage
of VBXs is the complexity involved in creating them.  There is a
detailed set of restrictions associated with creation of a VBX
such that they cannot be created within Visual Basic itself.
Instead, the most common method to create a VBX is to use a C/C++
compiler to create a DLL and then put a VBX "wrapper" around it.
The advantage of this is the speed of computation gained by using
optimized C/C++ compiled code over the Visual Basic's interpreted
technology. The disadvantage is that developers are forced to
"switch gears" in order to work with the compiler, and the added
complexity can lead to additional troubleshooting and debugging
time.

Delphi components are more easily created.   Unlike Visual
Basic, where VBXs must be built using an external compiler,
Delphi components are built within the Delphi development
environment itself. This is an important distinction, because
professional developers prefer to work with a consistent set of
tools. Being able to use Delphi to create reusable components
becomes a major productivity enhancement, enabling more rapid
development with the added benefits of  reusability.

Additionally, since Delphi components are created with Delphi's
optimizing native code compiler and linker, there is improved
performance over traditional VBXs.  One other considerable
advantage of Delphi components is that developers can subclass
the functionality of a component to create their own custom
versions. If a specific VBX is insufficient for a Visual Basic
user, the only alternative is to build (or purchase) an
alternative VBX.

Programming Language

An obvious difference between Visual Basic and Delphi is the
underlying programming language. The use of Object Pascal within
Delphi has several important repercussions:

*    Pascal is a more powerful and structured language than
     Basic.

*    Object Pascal is a true object-oriented programming
     language, providing the benefits of inheritance,
     encapsulation and polymorphism;

*    Pascal is a compiled language, ensuring high-performance
     executables;

*    The organization of files as DCUs provides a cleaner
     mechanism for creating libraries of reusable code (see
     Shared Event Code);

*    Object Pascal utilizes the world's fastest commercial
     compiler technology;

*    Object Pascal support in-line assembler code for maximum
     performance;

One final point of differentiation is that in Visual Basic, all
code files must be specifically associated with a form, except
for a global .BAS file.   In other words, a function must be
global to the entire project unless associated with a form.  In
Delphi, however,  code files (and therefore classes and
functions) can be disassociated with any form, allowing proper
scoping of functions without any loss of functionality.

OOP Design Methodology

The power and flexibility of an object-oriented design
methodology is widely accepted as the best way to solve complex,
real-world programming problems. Object-oriented design provides
both a solid foundation and elegant architecture for an
application.  Some of the benefits of OOP are:

*    Shorter development cycles;

*    Code that is highly maintainable;

*    Code that is easily shared with other modules or other
     projects;

*    Facilitation of team programming and version control;

*    By exploiting object inheritance and polymorphism, the
     coding process can become much simpler and the code itself
     significantly more coherent;

*    Applications can incorporate several functions that are
     mostly similar but have certain distinct "personality
     traits".

Object Pascal is a structured, object-oriented programming
language, providing full support for class architectures,
inheritance, virtual functions and polymorphism. Visual Basic is
not an object-oriented language.  Note that although developers
need not be familiar with object-oriented concepts to create
programs using Delphi, professional programmers will appreciate
the benefit of these capabilities.

Database Scalability

A good RAD environment must address the pervasive issue of
creating a database application, and Visual Basic and Delphi are
no exceptions.  In Visual Basic, developers can place a database
component onto a form which can then have a property set that
allows it to bidirectionally communicate with an ODBC-compatible
database. The database component can be used as a crude mechanism
to navigate through the database using arrows representing first,
next, previous and last records. SQL queries can also be defined
in code, to form a query snapshot into the database for viewing
or computation. Crystal Reports is shipped with Visual Basic,
providing a report generating capability. Setup of the database
structures, the associated forms, interaction between them and
most of the navigation through the database must all be done
explicitly via the visual design tools or within code.

Delphi includes extensive database support including the Borland
Database Engine (BDE) for Paradox and dBASE access, and
middleware layers that support local and remote SQL data access.
The Borland database architecture provide developers with
high-performance access to a variety of data sources including
ODBC drivers.  Delphi includes data access components and
data-aware user interface components to provide a comprehensive
database solution.

Delphi ships with several controls for data entry and display,
including tables and grids. The grid control (TDBGrid Component)
can be used to build a spreadsheet-style of application. A unique
characteristic of the database grid control is that it can be
linked to multiple database sources.

Delphi also includes wizards and experts that facilitate rapid
design and implementation of databases and the corresponding user
interface. The DataSet designer facility included with Delphi
allows developers to rapidly create table or query data for
database components. It is a simple matter to specify which set
of fields from the database must be incorporated into the table
or query.

When designing a database grid, an application often needs an
editor to allow in-place modification of field data. Delphi's
DBEdit provides a consolidated component to handle this task.
Grid-aware, specialized versions of the control are available for
labels, lists, combo boxes, images, memo (multi-line editors),
check and radio buttons, lookup lists and lookup combo lists.

Delphi also features built-in support for queries and reports.  A
query control (TQuery Component) provides the ability to perform
SQL queries in order to form the data set corresponding to the
filtered elements of a database. If this data was extracted from
dBASE or Paradox, you would also have the ability to modify,
insert or delete records. By placing this component into a form
that also contains the database component, developers can create
a filtered, printable report based on some SQL or query into the
data set. Delphi includes the award-winning ReportSmith report
writer for PC and SQL databases.  ReportSmith provides an
intuitive interface for report creation using live data at design
time, and it supports queries, crosstabs, templates, calculations
and unlimited report sizes.

Moving Up to Delphi

Visual Basic developers who may be considering migrating their
applications to Delphi, you may be concerned about the effort
required to migrate existing Visual Basic applications in order
to continue project development and maintenance within Delphi.
Project migration is actually a fairly straightforward process. A
conversion utility is available from EarthTrek, Inc (617)
273-0308 that performs most of the translation including project
files, form files and code translation.  The utility completes
all of the possible automatic translation leaving some ambiguous
language elements to be identified by a simple syntax check using
the Delphi compiler.  Many projects can be translated with
virtually no effort.  Others may require a few hours of post-work
to complete.

Conclusion

When examining the various RAD products in the marketplace, both
Visual Basic and Delphi stand out as leading edge products.
However, Delphi has clearly emerged as a next generation tool
with its higher performance, highly facilitated visual design
capability, extensive support for reusable components and
database readiness.  Delphi achieves its goals as a powerful
application development system by combining a state-of-the-art
visual design environment with the power, flexibility and
reusability of a fully object-oriented language, the world's
fastest compiler, and leading-edge database technology.  Further,
through the integration of Object Pascal, Delphi empowers
developers with a full-featured programming environment without
sacrificing rapid visual development thus allowing construction
of sophisticated client-server applications in record time.

        TI



* #WhiteUnicorn/ StartPage/ Documentation/DelphiFAQ >



- - * - Anastasija aka WhiteUnicorn - * - - LJLiveJournal
PFPhotoFile