2015-09-15 3 views
1

У меня есть класс, для которого требуется таймер. Класс должен работать как с VCL, так и с FMX. К сожалению, таймер FMX объявлен в FMX.Types и таймер VCL в Vcl.ExtCtrls.Как создать внутренний таймер, который будет работать с VCL и FMX?

Как нет условного определения, как {$IFDEF FMX}xxx{$ENDIF} Как использовать таймер в кросс-платформенном классе?

+0

Связанный, [Delphi XE2: Предусмотрено ли условное обозначение VCL и FireMonkey?] (Http://stackoverflow.com/q/7720508/576719). –

+0

@DavidHeffernan - Это было бы возможно, но я предпочел бы иметь возможность создавать класс в любом проекте, не беспокоясь об установке условных определений. – norgepaul

+0

@DavidHeffernan - Это будет работать в определенной степени, но если я тестирую Windows, я до сих пор не знаю, является ли это FMX Windows или VCL Windows. Если я предполагаю, что это VCL, но это приложение FMX, я буду включать код VCL и наоборот. Этого я хочу избежать. – norgepaul

ответ

4

Если бы это был я, я бы написал специальный сегмент таймера кросс-платформенной передачи, который не зависел от фреймов FMX и VCL. Концептуально он будет сидеть на том же уровне, что и Delphi RTL.

Если вы не хотите этого делать и хотите повторно использовать существующие классы таймера, тогда вы находитесь в привязке. Для целей, у которых нет VCL, что вы делаете? Невозможно узнать, будет ли ваш код потреблять проект FMX или VCL. Думаю об этом. Вы можете скомпилировать свое устройство в .dcu и включить его в любой проект. В то время, когда блок скомпилирован, он не может знать тип проекта, который в конечном итоге будет потреблять его.

А что делать? Вы можете использовать таймер FMX повсюду. Но это заставляет FMX участвовать в проектах VCL. Я знаю, что мне это не понравится. Вы можете использовать таймер FMX везде, кроме Windows, и использовать там таймер VCL. Но это вынуждает VCL к проектам Windows FMX.

Таким образом, вы могли бы принять этот подход:

  1. Создайте свой собственный класс таймера кросс-платформенной.
  2. На платформах, отличных от Windows, реализуется поверх таймера FMX.
  3. В Windows это реализовано с использованием функций Windows API SetTimer и KillTimer.
+1

Emba помещает некоторые сервисы платформы в неправильное место. 'IFMXTimerService' и' IFMXLoggingService' не должны принадлежать FMX. Это больше RTL или но вы правы в создании собственной платформы, которая не имеет отношения к VCL или FMX. –

1

Мы можем предположить, что ваш класс не является визуальным и что, кроме того, он не является компонентом времени разработки. Если бы это было не так, то это было бы не совсем совместимо с FMX и VCL.

В этом случае нет причин, по которым вы не можете включить FMX.Types в приложение VCL, и нет причин, по которым вы не можете создать FMX.Types.TTimer в приложении VCL - вы просто не можете этого сделать во время разработки (т. е. сбросить FMX TTimer по форме VCL). Если вам нужен только таймер внутри, тогда ответ будет чистым - просто используйте таймер FMX, поскольку он будет компилироваться независимо от цели платформы или используемой рамки.

unit FMXTimerInVCLApplication; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 
    System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, 
    FMX.Types; 

type 
    TForm1 = class(TForm) 
    procedure FormCreate(Sender: TObject); 
    private 
    FTimer : TTimer; // FMX.Types.TTimer ! 
    procedure foo(Sender : TObject); 
    end; 

implementation 

{$R *.dfm} 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    FTimer := TTimer.Create(nil); 
    FTimer.Interval := 1000; 
    FTimer.OnTimer := foo; 
end; 

procedure TForm1.foo(Sender : TObject); 
begin 
    ShowMessage('foo'); 
end; 

end. 

Это, конечно, приносит справедливое количество багажа FMX в ваше приложение. Это много раздувается для таймера, если вам все равно. Я представляю его как альтернативу другому естественному ответу (который пишет ваши собственные).

+2

Сколько FMX-устройств вытаскивается в ваш проект VCL, когда вы это делаете? –

+0

@ DavidHeffernan. Обязательно. –

 Смежные вопросы

  • Нет связанных вопросов^_^