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 the Text
property of a TEdit
?
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 required
This 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 type TCaption
which is type 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
Read the rest of this entry »