[fpc-pascal] Re: Is this if /else syntax wrong?

Mattias Gärtner nc-gaertnma at netcologne.de
Thu Jul 1 12:27:35 CEST 2010


Zitat von Frank Church <vfclists at gmail.com>:

> I will be upgrading to 2.4.0 soon.
>
> It shouldn't be an error then.
>
> 2010/7/1 Guillermo Martínez Jiménez <gmartinez at burdjia.com>
>
>> > procedure TfrmHometel.SetSplitterSizes;
>> > var
>> >  i: integer;
>> > begin
>> >  for i:=3D 0 to ComponentCount - 1 do
>> >  begin
>> >   if Components[i] is TSplitter then
>> >   begin
>> >     with TSplitter(Components[i]) do
>> >     begin
>> >      if Cursor =3D crHSplit then
>> >        Width :=3D 7
>> >      else if Cursor =3D crVSplit then
>> >        Height :=3D 7;
>> >      ; // <-- removing this semicolon results in a syntax error. Is it
>> > syntax error some kind of extra strict compiler check.
>> >      Color :=3D clBlue;
>> >     end;
>> >   end;
>> >  end;
>> > end;
>>
>> Compare with next:
>>
>>      if Cursor =3D crHSplit then
>>        Width :=3D 7
>>      else
>>        if Cursor =3D crVSplit then
>>          Height :=3D 7; // <-- This semicolon is for the "if".
>>      ; // <-- This semicolon is for the "else".

No. A semicolon ends *all* open if/if-else/do statements.
The second semicolon is an empty statement - a 'no operation'.


>> Is like this:
>>
>> IF ... THEN
>> BEGIN
>>  ...
>> END
>> ELSE BEGIN
>>  IF ... THEN
>>  BEGIN
>>    ...
>>  END;  // <-- This END is for the "IF".
>> END;  // <-- This END is for the "ELSE".
>>
>> I recommend to use "BEGIN ... END" blocks in nested "IF" always to
>> prevent this kind of mistakes.

In general I agree, but in this case there are no nested ifs, so it  
won't help here.

Mattias





More information about the fpc-pascal mailing list