Why the compiler generates a `”E2018 Record, object or class type required”` on typed types…
Posted by jpluimers on 2020/05/21
From [WayBack] Why would the compiler generate a "E2018 Record, object or class type required" helper
when I use a ToUpperInvariant (or any TStringsHelper call) on t… – Jeroen Wiert Pluimers – Google+:
Why would the compiler generate a
"E2018 Record, object or class type required"
when I use a ToUpperInvariant (or any TStringsHelper call) on theText
property of aTEdit
?Full failing code is at [WayBack] https://gist.github.com/jpluimers/b5e3684f725216622bdcb80bf5f10698
Failing line is this:
Edit1.Text := Edit1.Text.ToUpperInvariant; // the above line generates this error: // [dcc32 Error] MainFormUnit.pas(29): E2018 Record, object or class type requiredThis fails as well:
Edit1.Text := TStringHelper.ToUpperInvariant(Edit1.Text);
Why would the compiler (in this case XE8) throw this error?
Note the workaround is simple:
var lText: string; begin lText := Edit1.Text; Edit1.Text := lText.ToUpperInvariant;My suspicion is that the
Edit
property is of typeTCaption
which istype string
.Could it be that simple?
To which David Heffernan responded:
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.
More on the implications is at [WayBack] pascal – Delphi Type equivalence and Type equality syntax – Stack Overflow.
–jeroen
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. |
Leave a comment