emailx45
Social Engineer
- Joined
- May 5, 2008
- Messages
- 2,387
- Reaction score
- 2,149
Why the compiler generates a `”E2018 Record, object or class type required”` on typed types…
Posted by jpluimers on 2020/05/21
Posted by jpluimers on 2020/05/21
[SHOWTOGROUPS=4,20]
Why the compiler generates a `”E2018 Record, object or class type required”` on typed types…
Posted by jpluimers on 2020/05/21
Why would the compiler generate a "E2018 Record, object or class type required" when I use a ToUpperInvariant (or any TStringsHelper call) on the Text property of a TEdit?
Full failing code is at [WayBack] on GitHub
Failing line is this:
This fails as well:
Why would the compiler (in this case XE8) throw this error?
Note the workaround is simple:
My suspicion is that the Edit property is of type TCaption which is type string.
Could it be that simple?
To which [ David Heffernan ] responded:
Typed types are indeed different types. They have been there for a long time (to facilitate generating different type information so you can for instance hook up different property editors to TCaption (a typed string) or TColor (a typed integer).
It is explained at [WayBack] Declaring Types. but has existed since Delphi 1 or Delphi 2. and E2018: Record, object or class type required (Delphi)
More on the implications is at [WayBack] pascal – Delphi Type equivalence and Type equality syntax – Stack Overflow.
–jeroen
[/SHOWTOGROUPS]
Why the compiler generates a `”E2018 Record, object or class type required”` on typed types…
Posted by jpluimers on 2020/05/21
Why would the compiler generate a "E2018 Record, object or class type required" when I use a ToUpperInvariant (or any TStringsHelper call) on the Text property of a TEdit?
Full failing code is at [WayBack] on GitHub
Failing line is this:
Code:
Edit1.Text := Edit1.Text.ToUpperInvariant;
// the above line generates this error:
// [dcc32 Error] MainFormUnit.pas(29): E2018 Record, object or class type required
This fails as well:
Code:
Edit1.Text := TStringHelper.ToUpperInvariant(Edit1.Text);
Why would the compiler (in this case XE8) throw this error?
Note the workaround is simple:
Code:
var
lText: string;
begin
lText := Edit1.Text;
Edit1.Text := lText.ToUpperInvariant;
My suspicion is that the Edit property is of type TCaption which is type string.
Could it be that simple?
To which [ David Heffernan ] responded:
Code:
Yup, the issue is TCaption has no helper. Pretty distressing.
Typed types are indeed different types. They have been there for a long time (to facilitate generating different type information so you can for instance hook up different property editors to TCaption (a typed string) or TColor (a typed integer).
It is explained at [WayBack] Declaring Types. but has existed since Delphi 1 or Delphi 2. and E2018: Record, object or class type required (Delphi)
More on the implications is at [WayBack] pascal – Delphi Type equivalence and Type equality syntax – Stack Overflow.
–jeroen
Code:
unit MainFormUnit;
interface
uses
System.Classes,
Vcl.Controls,
Vcl.Forms,
Vcl.StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
procedure Edit1Change(Sender: TObject);
end;
var
Form1: TForm1;
implementation
uses
System.SysUtils;
{$R *.dfm}
procedure TForm1.Edit1Change(Sender: TObject);
begin
Edit1.Text := Edit1.Text.ToUpperInvariant;
// the above line generates this error:
// [dcc32 Error] MainFormUnit.pas(29): E2018 Record, object or class type required
end;
end.
[/SHOWTOGROUPS]