[Lazarus] Extending TRect breaks Lazarus

Ondrej Pokorny lazarus at kluug.net
Sat Nov 7 06:42:14 CET 2015


On 06.11.2015 22:45, Mark Morgan Lloyd wrote:
> Luca Olivetti wrote:
>>  with a=somerecord, b=someotherrecord do
>>  begin
>>    a.x:=b.x;
>>  end;
>
> Just because something is 20+ years old doesn't necessarily make it 
> bad. That syntax looks OK to me (i.e. make a and b look like consts) 
> but I also find myself wondering what the type rules are, i.e.
>
> with pod: TTabSheet= Pages.Objects[deleteAt] do
>
> vs
>
> with pod= TTabSheet(Pages.Objects[deleteAt]) do

Do not forget that you can overload operators! In particular you can 
overload the comparison operator to return a record, so your
"with a=somerecord do" can already be a valid pascal code now:

*type**
**  TMyRec = record**
**    I: Integer;**
**  end;**
**
**  TMyResult = record**
**    Res: Integer;**
**  end;**
**
**operator = (z1: TMyRec; z2 : TMyRec) b : TMyResult;**
**begin**
**  Result.Res := z1.I+z2.I;**
**end;**
**
**var**
**  m1, m2: TMyRec;**
**begin**
**  m1.I := 10;**
**  m2.I := 1;**
**  with m1=m2 do**
**    writeln(Res);**
**  readln;**
**end.*

The assignment operator would be better, since it doesn't return a value 
(in pascal, of course) and thus cannot be used in a with statement now:

*with a:=somerecord, b:=someotherrecord do**
**begin**
**  a.x:=b.x;**
**end; **
*
IMO there is no need to set a type of a/b on the left side of the with 
assignment - the left side should always gain the type from the the 
right side. In this case you can decide whether the "AS" or the direct 
re-type should be used:

*with pod := Pages.Objects[deleteAt] as TTabSheet do **
**with pod := TTabSheet(Pages.Objects[deleteAt]) do **
*
-> both are valid and the syntax is already in pascal - why not to use it.

Ondrej
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus/attachments/20151107/fb06130b/attachment-0003.html>


More information about the Lazarus mailing list