Compare Delphi objects ?

Posted by J. Knol on May 31

I have 2 objects of TControl. Is there in Delphi a function available that compares the objects and says or they are exactly the same, or not ? The objects always are both of the same type (for example: both TLabel, or both TImage).

Who can help me or can give me some advice ? thanks a lot. (I thought there was a custom function in Delphi, but i haven't found one yet !)

Re: webmaster Guido on June 09, 2001

As DelphiLand is an educational site, let's start with a short refresher ;-)

  • Components are objects, that you use as building blocks. Delphi's VCL (Visual Component Library) contains components, and you can create your own. Examples: TLabel, TTimer, TButton.
     
  • Properties are attributes of a component, that you can read or set. Examples: Caption, Color, Height.

So, with "comparing components" you probably mean "comparing their properties". I didn't find a Delphi-defined function for this, so you must make your own. Firstly, you need a list of the properties that you want to compare. If it's only a limited number of component types, say only TLabels, TEdits and TButtons, you can get such a list from Delphi's help, from the "Object Browser" or from the components source code files. Your code could look like this:

function CompareComps(C1, C2: TComponent): Boolean;
begin
 if C1 is TLabel then
  Result := ((C1 as TLabel).Color) = (C2 as TLabel).Color))
   and ((C1 as TLabel).Caption) = (C2 as TLabel).Caption))
   and ((C1 as TLabel).Font) = (C2 as TLabel).Font))
   and ((...
 else
  if C1 is TEdit then 
   Result := ((...
 else
  if C1 is TButton then
   Result := ((...

Though such code is quite lengthy and boring, it is easy enough for a small number of component types. But what if you want to deal with *all* the VCL components, let alone if you also include some new controls of your own?

A component can be written to disk, "streamed", and it can be read back. So, there are possibilities to access a list of its properties. Look for topics such as "TReader" and "streaming" (TReader is used internally by the VCL, to restore a component that has been written to a "stream"). This stuff can get quite heavy ;-) so I'm not going into more details here.

You also have to take a dive into the RTTI, "Run Time Type Information". Delphi itself uses the RTTI to access properties when saving and loading form (.DFM) files, and to display attributes in the Object Inspector. Attention: RTTI is only available for "published" properties, not for protected or public properties.

There is very little information about RTTI in the official Delphi documentation, you'll have to explore other sources like programmers magazines, web sites and newsgroups. If you have the Delphi sources, have a look at the file TYPINFO.PAS, especially the function "GetPropList". Good introductions to the RTTI have been written by the well-known author of Delphi books Marco Cantu.


    Delphi Forum