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