【问题标题】:Delphi Convert returning invalid typesDelphi Convert 返回无效类型
【发布时间】:2019-05-07 05:57:05
【问题描述】:

我正在尝试使用内置的 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;

加仑和升的形式为 TConvTypes

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.

【问题讨论】:

  • 也许,您已经声明了 your own vuUKGallonsvuLiters 元素的集合,或者 ypu 具有同名的全局变量。尝试以以下方式显式设置 TConvTypes 声明的单位:Result := Convert(30, StdConvs.vuUKGallons, StdConvs.vuLiters);
  • 我认为@Dima 是对的。我只是自己尝试了一下,没有任何问题。顺便说一句,如果你给了我们一个完整的minimal reproducible example,我们肯定会告诉你的。
  • 我刚刚更新了帖子以包含完整的单元代码。谢谢大家
  • 忘记你的TConvType 并使用预定义的,它在System.StdConvs 单元中声明。
  • @Revski,添加最小示例时,请排除所有 GUI 内容并提供控制台应用程序。

标签: delphi units-of-measurement


【解决方案1】:

您的程序必须修改vuUKGallonsvuLiters 的值,或者使用不同的值。这个程序:

{$APPTYPE CONSOLE}

uses
  System.StdConvs,
  System.ConvUtils;

begin
  Writeln(Convert(30, vuUKGallons, vuLiters));
  Readln;
end.

输出1.36382700000000E+0002

但是这个程序:

{$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.

您必须使用在System.StdConvs 单元中定义的vuXXX 变量。

更新

看到你的完整代码,现在很清楚发生了什么。

  • 您没有使用System.StdConvs 单位。
  • 当您尝试引用 vuUKGallonsvuLiters 时,编译器告诉您不存在此类符号。
  • 您声明了新变量 vuUKGallonsvuLiters
  • 您的代码现已编译,但 vuUKGallonsvuLiters 的值不正确。

通过以下方式解决问题:

  1. 删除代码中变量vuUKGallonsvuLiters 的声明。
  2. 将单位 System.ConvUtils 添加到您的 uses 子句中。

【讨论】:

  • 谢谢大卫。现在我可以看到了。我现在试试这个。我的错误只是将 vuXXX 单独声明。
猜你喜欢
  • 2012-02-07
  • 1970-01-01
  • 2022-12-06
  • 1970-01-01
  • 2014-08-08
  • 2016-08-09
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
相关资源
最近更新 更多