Delphi Convert возвращает недопустимые типы - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь выполнить самые простые преобразования в 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.

1 Ответ

0 голосов
/ 05 декабря 2018

Ваша программа должна изменять значения vuUKGallons и vuLiters или использовать другие.Эта программа:

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

вызывает исключение:

Incompatible conversion types [Illegal type, Illegal type]

AsЭта программа:

{$APPTYPE CONSOLE}

uses
  System.StdConvs,
  System.ConvUtils;

var
  vuUKGallons, vuLiters: Word;

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

Вы должны использовать переменные vuXXX, определенные в System.StdConvs блоке.

Обновление

УвидевВаш полный код, теперь ясно, что произошло.

  • Вы не использовали System.StdConvs устройство.
  • Когда вы пытались обратиться к vuUKGallons и vuLitersкомпилятор сказал вам, что таких символов не существует.
  • Вы объявили новые переменные vuUKGallons и vuLiters.
  • Ваш код теперь скомпилирован, но значения vuUKGallons и vuLiters

Решите проблему следующим образом:

  1. Удалите объявления переменных vuUKGallons и vuLiters в своем коде.
  2. Добавьтеединица System.ConvUtils в соответствии с пунктом об использовании.
...