我创建了新的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错误还是什么?我该如何使它工作?
答案 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.