Delphi Convert返回无效类型

Delphi Convert返回无效类型,delphi,units-of-measurement,Delphi,Units Of Measurement,我试图使用内置的Convert函数在delphi中执行最简单的转换 简单地把加仑转换成升 但是,delphi在转换单元上返回无效类型 procedure TfrmMain.NumberBox1Change(Sender: TObject); var Result : Double; begin // Update label with result Result := Convert(30, vuUKGallons, vuLiters); lblAreaResult.Text :=

我试图使用内置的Convert函数在delphi中执行最简单的转换

简单地把加仑转换成升

但是,delphi在转换单元上返回无效类型

procedure TfrmMain.NumberBox1Change(Sender: TObject);
var
 Result : Double;
begin
  // Update label with result
  Result := Convert(30, vuUKGallons, vuLiters);
  lblAreaResult.Text := Result.ToString;
end;
加仑和升的形式与Tconv类型相同

vuUKGallons, vuLiters: TConvType;
但是,当我尝试执行代码时,delphi返回以下内容

First chance exception at $7603AB32. Exception class EConversionError with message 'Incompatible conversion types [Illegal type, Illegal type]'. Process UnitConverter.exe (13972)
在阅读Embarcadero的文档后,这应该是最简单的操作,以下操作应该可以正常工作。在这一点上,我不知道发生了什么

谁能给我指一下正确的方向吗

谢谢

我已经编辑了这篇文章,包含了完整的单元代码

unit frmConverter;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls, FMX.ListBox, FMX.Layouts,
  FMX.TabControl, FMX.MultiView, FMX.Objects, FMX.Edit, System.ImageList,
  FMX.ImgList, System.Threading, ConvUtils, FMX.EditBox, FMX.NumberBox;

type
  TfrmMain = class(TForm)
    MultiView1: TMultiView;
    TabControl1: TTabControl;
    tabLength: TTabItem;
    tabVolume: TTabItem;
    tabPressure: TTabItem;
    tabEnergy: TTabItem;
    ListBox1: TListBox;
    StyleBook1: TStyleBook;
    tabMass: TTabItem;
    tabTemp: TTabItem;
    Panel1: TPanel;
    Label3: TLabel;
    Label4: TLabel;
    cbAreaFrom: TComboBox;
    Label5: TLabel;
    cbAreaTo: TComboBox;
    btnMaster: TButton;
    Label6: TLabel;
    Label1: TLabel;
    Layout1: TLayout;
    lblAreaResult: TLabel;
    Image1: TImage;
    ToolBar1: TToolBar;
    Button1: TButton;
    Image2: TImage;
    Button2: TButton;
    Image3: TImage;
    Button3: TButton;
    Image4: TImage;
    Label2: TLabel;
    Button4: TButton;
    Image5: TImage;
    Label9: TLabel;
    Button5: TButton;
    Image6: TImage;
    Label10: TLabel;
    Button6: TButton;
    Image7: TImage;
    Label11: TLabel;
    Button7: TButton;
    Image8: TImage;
    Label12: TLabel;
    Button8: TButton;
    Image9: TImage;
    Label13: TLabel;
    NumberBox1: TNumberBox;
    lblDebugConvFrom: TLabel;
    lblDebugConvTo: TLabel;
    procedure NumberBox1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;
  vuUKGallons, vuLiters: TConvType;

implementation

{$R *.fmx}

procedure TfrmMain.NumberBox1Change(Sender: TObject);
var
 Result : Double;
begin
  // Update label with result
  Result := Convert(30, vuUKGallons, vuLiters);
  lblAreaResult.Text := Result.ToString;
end;

end.

您的程序必须修改
vukgallons
vuLiters
的值,或者使用不同的值。该计划:

{$APPTYPE CONSOLE}

uses
  System.StdConvs,
  System.ConvUtils;

begin
  Writeln(Convert(30, vuUKGallons, vuLiters));
  Readln;
end.
{$APPTYPE CONSOLE}

uses
  System.StdConvs,
  System.ConvUtils;

begin
  vuUKGallons := 0;
  vuLiters := 0;
  Writeln(Convert(30, vuUKGallons, vuLiters));
end.
{$APPTYPE CONSOLE}

uses
  System.StdConvs,
  System.ConvUtils;

var
  vuUKGallons, vuLiters: Word;

begin
  Writeln(Convert(30, vuUKGallons, vuLiters));
end.
输出
1.36382700000000E+0002

但是这个节目:

{$APPTYPE CONSOLE}

uses
  System.StdConvs,
  System.ConvUtils;

begin
  Writeln(Convert(30, vuUKGallons, vuLiters));
  Readln;
end.
{$APPTYPE CONSOLE}

uses
  System.StdConvs,
  System.ConvUtils;

begin
  vuUKGallons := 0;
  vuLiters := 0;
  Writeln(Convert(30, vuUKGallons, vuLiters));
end.
{$APPTYPE CONSOLE}

uses
  System.StdConvs,
  System.ConvUtils;

var
  vuUKGallons, vuLiters: Word;

begin
  Writeln(Convert(30, vuUKGallons, vuLiters));
end.
引发了一个异常:

Incompatible conversion types [Illegal type, Illegal type] 必须使用
System.StdConvs
单元中定义的
vuXXX
变量

更新

看过完整的代码后,现在清楚发生了什么

  • 您没有使用
    系统.StdConvs
    单元
  • 当您试图引用
    vukgallons
    vuLiters
    时,编译器告诉您不存在这样的符号
  • 您声明了新变量
    vukgallons
    vuLiters
  • 您的代码现在已编译,但
    vukgallons
    vuLiters
    的值不正确
通过以下方式解决问题:

  • 删除代码中变量
    vukgallons
    vuLiters
    的声明
  • 将unit
    System.ConvUtils
    添加到uses子句中

  • 也许,您已经声明了自己的
    vukgallons
    vuLiters
    元素或ypu的集合具有相同名称的全局变量。尝试显式设置以下方式声明
    TConvTypes
    的单位:
    Result:=Convert(30,StdConvs.vuUKGallons,StdConvs.vuLiters)我认为@Dima是对的。我自己就试过了,没有问题。顺便说一句,如果你给了我们一个完整的,我们可以肯定地告诉你。Iv'e刚刚更新了帖子,包括完整的单位代码。感谢Guys关注您的
    TConvType
    并使用预定义的,在
    System.StdConvs
    unit中声明的。@Revski,当添加一个最小的示例时,请排除所有GUI内容并提供一个控制台应用程序。谢谢David。现在我明白了。我现在就试试这个。我的错误只是将vuXXX单独声明。