[DUG] Stupid /easy question

Jeremy North jeremy.north at gmail.com
Thu Oct 15 10:29:36 NZDT 2009


The enumerator for TStringList returns a pointers not the specific
object type so you still need a typecast.

var
   CountryAddressFormat: Pointer;
begin
   for CountryAddressFormat in Self do begin
       Strings.AddObject(
TCountryAddressFormat(CountryAddressFormat).CountryName,
TObject(TCountryAddressFormat(CountryAddressFormat).CountryRefAsInteger)
);
   end;

Didn't test it to see it is 100% correct.

This raises the issues with FOR..IN in pre-generics versions. Unless
you encapsulate your list in a class and implement the enumerator on
the class you will most likely have to still typecast when using
enumerators.

With generics in D2009 and D2010 you wouldn't need to do this because
you'd do something like (untested).


var
  FCountryList: TStringList<TCountryAddressFormats>;


....

var
   CountryAddressFormat  : TCountryAddressFormat;
begin
   for CountryAddressFormat in FCountryList do
   begin
       // no typecasting necessary
   end;
end;

cheers,
Jeremy

On Thu, Oct 15, 2009 at 8:06 AM, Robert martin <rob at chreos.co.nz> wrote:
> Hi
>
> After the D2010 presentation yesterday I decided I should actually use
> some of the D2007 features I had not gotten around to using.
> Specifically the For .. in construct.
>
> I am sure I am missing something but here iss what I want to do
>
>
> I have the following 'old school code'  (note the base class here
> inherits from TObjectList)
>
> procedure TCountryAddressFormats.LoadStringListWithCompanies(Strings:
> TStrings);
> var
>    Counter     : Integer;
> begin
>
>    for Counter := 0 to Self.Count - 1 do begin
>        Strings.AddObject(
> TCountryAddressFormat(Self.Items[Counter]).CountryName,
> Tobject(TCountryAddressFormat(Self.Items[Counter]).CountryRefAsInteger) );
>    end;
> end;
>
> I wanted to replace it with
>
> procedure TCountryAddressFormats.LoadStringListWithCompanies(Strings:
> TStrings);
> var
>    CountryAddressFormat  : TCountryAddressFormat;
> begin
>    for CountryAddressFormat in Self do begin
>        Strings.AddObject( CountryAddressFormat.CountryName,
> TObject(CountryAddressFormat.CountryRefAsInteger) );
>    end;
> end;
>
> but I get the following error
>
> [DCC Error] AddressFormat.pas(157): E2010 Incompatible types:
> 'TCountryAddressFormat' and 'Pointer'
>
> what am I missing ?
>
>
> Cheers
> Rob
>
> _______________________________________________
> NZ Borland Developers Group - Delphi mailing list
> Post: delphi at delphi.org.nz
> Admin: http://delphi.org.nz/mailman/listinfo/delphi
> Unsubscribe: send an email to delphi-request at delphi.org.nz with Subject: unsubscribe
>



More information about the Delphi mailing list