[Lazarus] record literal in FPC?

classic Classic list List threaded Threaded
18 messages Options
Reply | Threaded
Open this post in threaded view
|

[Lazarus] record literal in FPC?

Xiangrong Fang
Hi, 

Is there "record literal in FPC? e.g. normally, you do:

var
   cp : TPoint;

cp.X := 0;
cp.Y := 0;
Edit1.CaretPos := cp;

I would like to use literal directly, such as:

Edit1.CaretPos := (X: 0, Y: 0); 

But the above syntax is wrong. Is there such thing exists?

Thanks,
Shannon

--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
ik
Reply | Threaded
Open this post in threaded view
|

Re: [Lazarus] record literal in FPC?

ik
On Tue, Jan 8, 2013 at 5:30 PM, xrfang <[hidden email]> wrote:

> Hi,
>
> Is there "record literal in FPC? e.g. normally, you do:
>
> var
>    cp : TPoint;
>
> cp.X := 0;
> cp.Y := 0;
> Edit1.CaretPos := cp;
>
> I would like to use literal directly, such as:
>
> Edit1.CaretPos := (X: 0, Y: 0);
>
> But the above syntax is wrong. Is there such thing exists?

no, but try the point function

>
> Thanks,
> Shannon
>
> --
> _______________________________________________
> Lazarus mailing list
> [hidden email]
> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
>

--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
Reply | Threaded
Open this post in threaded view
|

Re: [Lazarus] record literal in FPC?

Howard Page-Clark
In reply to this post by Xiangrong Fang
On 08/1/13 3:30, xrfang wrote:

> I would like to use literal directly, such as:
>
> Edit1.CaretPos := (X: 0, Y: 0);

You can use a typed constant thus:

const Origin: TPoint = (x:0; y:0);

begin
...
  Edit1.CaretPos := Origin;
...


--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
Reply | Threaded
Open this post in threaded view
|

Re: [Lazarus] record literal in FPC?

Xiangrong Fang
Thanks, but what I want is to AVOID any kind of declarations. So I will use the Point() function suggested by ik.

在 三, 1月 9, 2013 at 12:26 上午,Howard Page-Clark <[hidden email]> 写道:
On 08/1/13 3:30, xrfang wrote:

> I would like to use literal directly, such as:
>
> Edit1.CaretPos := (X: 0, Y: 0);

You can use a typed constant thus:

const Origin: TPoint = (x:0; y:0);

begin
...
Edit1.CaretPos := Origin;
...


--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus


--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
Reply | Threaded
Open this post in threaded view
|

Re: [Lazarus] record literal in FPC?

leledumbo
Administrator
In reply to this post by ik
If you declare an inline function producing the record, the effect would be the same with that literal record.
Reply | Threaded
Open this post in threaded view
|

Re: [Lazarus] record literal in FPC?

Xiangrong Fang
Hi leledumbo,

As far as I know pascal inline directive only affect the compiler, not how you write code. Could you please give an example how inline function helps in my question?

Thanks

2013/1/9 leledumbo <[hidden email]>
If you declare an inline function producing the record, the effect would be
the same with that literal record.



--
View this message in context: http://free-pascal-lazarus.989080.n3.nabble.com/Lazarus-record-literal-in-FPC-tp4028464p4028474.html
Sent from the Free Pascal - Lazarus mailing list archive at Nabble.com.

--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus


--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
Reply | Threaded
Open this post in threaded view
|

Re: [Lazarus] record literal in FPC?

Andreas Schneider
In reply to this post by Xiangrong Fang

Hi,

you could also use the with-statement, that is pretty handy in such cases:

with Edit1.CaretPos do
begin
  X := 0;
  Y := 0;
end;

Best Regards,
Andreas


On 08.01.2013 16:30, xrfang wrote:
Hi, 

Is there "record literal in FPC? e.g. normally, you do:

var
   cp : TPoint;

cp.X := 0;
cp.Y := 0;
Edit1.CaretPos := cp;

I would like to use literal directly, such as:

Edit1.CaretPos := (X: 0, Y: 0); 

But the above syntax is wrong. Is there such thing exists?

Thanks,
Shannon


--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus


--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
Reply | Threaded
Open this post in threaded view
|

Re: [Lazarus] record literal in FPC?

leledumbo
Administrator
In reply to this post by Xiangrong Fang
> As far as I know pascal inline directive only affect the compiler, not how you write code. Could you please give an example how inline function helps in my question?

Yes it does, what I mean is to create something that Point() function does and using inline directive it's nearly the same as assigning record via literal. Well, if you know how it's done by other compilers, record literal assignment is actually broken down into field by field assignment. So if you make a function that returns the record with given arguments as record fields, with inline directive the final code would be the same. Well... maybe you'll need some other directives as well, but it's just my thought. I never really compare the generated code...
Reply | Threaded
Open this post in threaded view
|

Re: [Lazarus] record literal in FPC?

Xiangrong Fang
Well, my purpose is to make the source code look comfortable, not how the binary code is generated :)

Well, again, I got a good idea from Andreas.

Thanks to all of you.

在 三, 1月 9, 2013 at 7:45 下午,leledumbo <[hidden email]> 写道:
> As far as I know pascal inline directive only affect the compiler, not how
you write code. Could you please give an example how inline function helps
in my question?

Yes it does, what I mean is to create something that Point() function does
and using inline directive it's nearly the same as assigning record via
literal. Well, if you know how it's done by other compilers, record literal
assignment is actually broken down into field by field assignment. So if you
make a function that returns the record with given arguments as record
fields, with inline directive the final code would be the same. Well...
maybe you'll need some other directives as well, but it's just my thought. I
never really compare the generated code...



--
View this message in context: http://free-pascal-lazarus.989080.n3.nabble.com/Lazarus-record-literal-in-FPC-tp4028464p4028478.html
Sent from the Free Pascal - Lazarus mailing list archive at Nabble.com.

--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus


--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
Reply | Threaded
Open this post in threaded view
|

Re: [Lazarus] record literal in FPC?

Xiangrong Fang
In reply to this post by Andreas Schneider
Hi Adreas,

I just tried, your method did not work as expected.  It compiled ok, but didn't put the cursor at the end of the line as I wanted.  However, assign CaretPos a new TPoint worked.

Regards,

在 三, 1月 9, 2013 at 4:47 下午,Andreas Schneider <[hidden email]> 写道:

Hi,

you could also use the with-statement, that is pretty handy in such cases:

with Edit1.CaretPos do
begin
  X := 0;
  Y := 0;
end;

Best Regards,
Andreas


On 08.01.2013 16:30, xrfang wrote:
Hi, 

Is there "record literal in FPC? e.g. normally, you do:

var
   cp : TPoint;

cp.X := 0;
cp.Y := 0;
Edit1.CaretPos := cp;

I would like to use literal directly, such as:

Edit1.CaretPos := (X: 0, Y: 0); 

But the above syntax is wrong. Is there such thing exists?

Thanks,
Shannon


--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus



--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
Reply | Threaded
Open this post in threaded view
|

Re: [Lazarus] record literal in FPC?

Mattias Gaertner
On Wed, 09 Jan 2013 12:27:33 +0008
xrfang <[hidden email]> wrote:

> Hi Adreas,
>
> I just tried, your method did not work as expected.  It compiled ok, but didn't put the cursor at the end of the line as I wanted.  However, assign CaretPos a new TPoint worked.
>
> Regards,
>
> 在 三, 1月 9, 2013 at 4:47 下午,Andreas Schneider <[hidden email]> 写道:
> Hi,
>
> you could also use the with-statement, that is pretty handy in such cases:
>
> with Edit1.CaretPos do
> begin
>   X := 0;
>   Y := 0;
> end;

"With" does not work with record properties.

Mattias

--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
Reply | Threaded
Open this post in threaded view
|

Re: [Lazarus] record literal in FPC?

Andreas Schneider
In reply to this post by Xiangrong Fang
Interesting. IIRC that worked correctly in Delphi 2010 (it's been a while ...). This might be a bug in FPC.

The root of the problem is how properties are handled. Afaics however, the use of with should cause it to assign the final record afterwards. Apparently it doesn't - at least not always. Could be by design, could be a bug. I'll check the bug tracker later and may report that. (You can do that yourself, if you want, but sooner or later I would like that functionality to work too, so I've a personal interest in this and therefore would not mind to report it :-))

Greetings,
Andreas


On 09.01.2013 13:19, xrfang wrote:
Hi Adreas,

I just tried, your method did not work as expected.  It compiled ok, but didn't put the cursor at the end of the line as I wanted.  However, assign CaretPos a new TPoint worked.

Regards,

在 三, 1月 9, 2013 at 4:47 下午,Andreas Schneider [hidden email] 写道:

Hi,

you could also use the with-statement, that is pretty handy in such cases:

with Edit1.CaretPos do
begin
  X := 0;
  Y := 0;
end;

Best Regards,
Andreas


On 08.01.2013 16:30, xrfang wrote:
Hi, 

Is there "record literal in FPC? e.g. normally, you do:

var
   cp : TPoint;

cp.X := 0;
cp.Y := 0;
Edit1.CaretPos := cp;

I would like to use literal directly, such as:

Edit1.CaretPos := (X: 0, Y: 0); 

But the above syntax is wrong. Is there such thing exists?

Thanks,
Shannon


--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus




--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus


--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
Reply | Threaded
Open this post in threaded view
|

Re: [Lazarus] record literal in FPC?

Xiangrong Fang
I don't know if it's related to the fact that TEdit.CaretPos.X (or Y) is read only, or as Mattias said, the with syntax cannot work with record anyway... :-)

This should be a problem (if any) with lazarus not fpc.

Shannon

在 三, 1月 9, 2013 at 8:27 下午,Andreas Schneider <[hidden email]> 写道:
Interesting. IIRC that worked correctly in Delphi 2010 (it's been a while ...). This might be a bug in FPC.

The root of the problem is how properties are handled. Afaics however, the use of with should cause it to assign the final record afterwards. Apparently it doesn't - at least not always. Could be by design, could be a bug. I'll check the bug tracker later and may report that. (You can do that yourself, if you want, but sooner or later I would like that functionality to work too, so I've a personal interest in this and therefore would not mind to report it :-))

Greetings,
Andreas


On 09.01.2013 13:19, xrfang wrote:
Hi Adreas,

I just tried, your method did not work as expected.  It compiled ok, but didn't put the cursor at the end of the line as I wanted.  However, assign CaretPos a new TPoint worked.

Regards,

在 三, 1月 9, 2013 at 4:47 下午,Andreas Schneider [hidden email] 写道:

Hi,

you could also use the with-statement, that is pretty handy in such cases:

with Edit1.CaretPos do
begin
  X := 0;
  Y := 0;
end;

Best Regards,
Andreas


On 08.01.2013 16:30, xrfang wrote:
Hi, 

Is there "record literal in FPC? e.g. normally, you do:

var
   cp : TPoint;

cp.X := 0;
cp.Y := 0;
Edit1.CaretPos := cp;

I would like to use literal directly, such as:

Edit1.CaretPos := (X: 0, Y: 0); 

But the above syntax is wrong. Is there such thing exists?

Thanks,
Shannon


--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus




--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus



--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
Reply | Threaded
Open this post in threaded view
|

Re: [Lazarus] record literal in FPC?

Mattias Gaertner
In reply to this post by Andreas Schneider
On Wed, 09 Jan 2013 13:27:50 +0100
Andreas Schneider <[hidden email]> wrote:

> Interesting. IIRC that worked correctly in Delphi 2010 (it's been a
> while ...). This /might /be a bug in FPC.
>
> The root of the problem is how properties are handled. Afaics however,
> the use of /with/ should cause it to assign the final record afterwards.

That would be nice. At the moment fpc does not do that.

> Apparently it doesn't - at least not always. Could be by design, could
> be a bug. I'll check the bug tracker later and may report that. (You can
> do that yourself, if you want, but sooner or later I would like that
> functionality to work too, so I've a personal interest in this and
> therefore would not mind to report it :-))

Feel free to submit a feature request to the fpc bug tracker.

Mattias

--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
Reply | Threaded
Open this post in threaded view
|

Re: [Lazarus] record literal in FPC?

Paul Ishenin
09.01.13, 20:34, Mattias Gaertner пишет:


>> Apparently it doesn't - at least not always. Could be by design, could
>> be a bug. I'll check the bug tracker later and may report that. (You can
>> do that yourself, if you want, but sooner or later I would like that
>> functionality to work too, so I've a personal interest in this and
>> therefore would not mind to report it :-))
>
> Feel free to submit a feature request to the fpc bug tracker.

First check whether it works delphi mode.

Best regards,
Paul Ishenin

--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
Reply | Threaded
Open this post in threaded view
|

Re: [Lazarus] record literal in FPC?

Andreas Schneider
On Wednesday, January 9, 2013, 01:40pm Paul Ishenin wrote:
> First check whether it works delphi mode.

Apparently,  it  even works in mode objfpc. But only when the property
directly  reads/writes  a member. If there is a setter method, it will
still  compile  but  NOT  actually  change the record. Neither in mode
objfpc nor in mode delphi.

Example attached. I will also open a bug report.

--
Best Regards,
Andreas
--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

fpcwith.lpr (1K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: [Lazarus] record literal in FPC?

Hans-Peter Diettrich
In reply to this post by Xiangrong Fang
xrfang schrieb:
> I don't know if it's related to the fact that TEdit.CaretPos.X (or Y) is
> read only, or as Mattias said, the with syntax cannot work with record
> anyway... :-)

A "with" should evaluate to an address, but a Delphi compatible
*property* doesn't have an address.

DoDi

--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
Reply | Threaded
Open this post in threaded view
|

Re: [Lazarus] record literal in FPC?

Michael Schnell
On 01/09/2013 07:48 PM, Hans-Peter Diettrich wrote:
>
> A "with" should evaluate to an address
IMHO this is an "implementation detail", that any compiler can handle as
it likes to. It also could just work as if in the source the appropriate
record elements code are prefixed by the "with" argument. That does not
prevent that during compilation as well a code using "with" as a fully
expanded code can be optimized to use a pointer to the record.

(I in fact never use "with" as with  Delphi 7 -  which I last tested on
that behalf - the debugger does not easily show record elements that are
defined in a "with" clause. Moreover more often than not the code with
(nested) with can get rather ambiguous and confusing.)

-Michael

--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus