如何使用idThreadComponent使Firemonkey XE4 HD应用程序在OSX中工作?

时间:2013-09-04 10:05:38

标签: macos delphi firemonkey delphi-xe4

我创建了新的Firemonkey HD Desktop应用程序项目。我将工具调色板中的idThreadComponent1放到我的Form1中。我将OS X作为主动目标平台。我点击了F9,很快就得到了调试器异常通知:

Project dyld引发了异常类EReadError,消息“Invalid property value”。

这里打破了Application.Run; 继续提供新的调试器异常通知:

Project dyld引发异常类EReadError,消息为'Error reading IdThreadComponent1.Priority:Invalid property value'。

应用程序不能在OS X上运行。 idThreadComponent的提示说OS X是受支持的平台之一。这是一个IDE错误还是什么?我该如何使它工作? enter image description here

1 个答案:

答案 0 :(得分:0)

Mac期望优先级是一个整数,但是它给定了一个枚举类型(适用于Windows),并且它带有错误“无效属性值”。似乎唯一的解决方案是在运行时创建组件:

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Rtti, System.Classes,
  System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs,
  FMX.StdCtrls, IdBaseComponent, IdThreadComponent;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    MyIdThreadComponent: TIdThreadComponent;
    Procedure CreateThread;
    procedure MyIdThreadComponentOnRunHandler(Sender: TIdThreadComponent);
    procedure MyIdThreadComponentOnTerminateHandler(Sender: TIdThreadComponent);
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.MyIdThreadComponentOnRunHandler(Sender: TIdThreadComponent);
begin
  ShowMessage('Hello');
  MyIdThreadComponent.Terminate;
end;

procedure TForm1.MyIdThreadComponentOnTerminateHandler(Sender: TIdThreadComponent);
begin
  Caption := 'Thread terminated';
end;

Procedure TForm1.CreateThread;
begin
  MyIdThreadComponent := Form1.FindComponent('MyIdThreadComponent')
    as TIdThreadComponent;
  if not Assigned(MyIdThreadComponent) then
  begin
    MyIdThreadComponent := TIdThreadComponent.Create(Self);
    MyIdThreadComponent.OnRun := MyIdThreadComponentOnRunHandler;
    MyIdThreadComponent.OnTerminate := MyIdThreadComponentOnTerminateHandler;
{$IFDEF MSWINDOWS}
    MyIdThreadComponent.Priority := tpNormal;
{$ENDIF}
{$IFDEF MACOS}
    MyIdThreadComponent.Priority := 1;
{$ENDIF}
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyIdThreadComponent.Start;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  CreateThread;
end;

end.