2013-09-04 2 views
0

새로운 Firemonkey HD Desktop 응용 프로그램 프로젝트를 만듭니다. 도구 팔레트에서 idThreadComponent1을 내 Form1에 저장했습니다. 나는 OS X을 활성 타겟 플랫폼으로 만든다. 나는 F9를 누르고 곧 Debugger Exception Notification을 얻는다.idThreadComponent가 설치된 Firemonkey XE4 HD 응용 프로그램을 OSX에서 작동시키는 방법은 무엇입니까?

Project dyld는 예외 클래스 EReadError와 함께 'Invalid property value'라는 메시지를 발생시킨다.

여기를 어기면 Application.Run이됩니다. 새 디버거 예외 알림 계속 :

프로젝트 dyld 예외 클래스 EReadError 'IdThreadComponent1.Priority 읽기 : 잘못된 속성 값을 읽는 중'오류 메시지가 발생했습니다.

OS X에서만 응용 프로그램이 실행되지 않습니다. idThreadComponent에 대한 힌트는 OS X이 지원되는 플랫폼 중 하나임을 나타냅니다. IDE 버그인가요? 어떻게 작동 시키나요? enter image description here

답변

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.