2011-10-11 12 views
11

w Delphi XE2, musimy użyćDelphi XE2: Czy istnieje predefiniowany warunek identyfikacji VCL i FireMonkey?

{$ifdef Win32} 
{$ifdef Win64} 

zidentyfikować jakiej platformie jesteśmy.

Czy istnieje predefiniowany warunkowe, które mogą zidentyfikować VCL i FMX?

+0

Nie, powinieneś zdefiniować swój własny. – jed

+3

Dlaczego jest to potrzebne? Coś mi pachnie. –

+0

można chcieć użyć jednostki ze wspólną funkcjonalnością w aplikacjach vcl i fmx, nic podejrzanego o to. jak: Używa {$ IFDEF FMX} FMX.Forms {$ ELSE} Vcl.Forms; {$ ENDIF} –

Odpowiedz

9

Jak mówią inni, nie ma warunkowej dyrektywy określającej, czy twoja aplikacja to VCL czy FireMonkey. Myślę, że najbardziej niezawodnym sposobem określenia, czy twoja aplikacja to FireMonkey, czy VCL, jest użycie funkcji zamiast dyrektywy warunkowej.

Coś

Uses 
Rtti; 

function IsVCLApp:Boolean; 
begin 
Result:= CompareText(TRttiContext.Create.GetType(TApplication.ClassInfo).QualifiedName,'Vcl.Forms.TApplication')=0; 
end; 

function IsFireMonkeyApp:Boolean; 
begin 
Result:= CompareText(TRttiContext.Create.GetType(TApplication.ClassInfo).QualifiedName,'FMX.Forms.TApplication')=0; 
end; 
+1

@Craig, oczywiście ten kod wymaga, która jednostka formularzy musi zostać dodana, o zakresie, którego nie potrzebujesz dodać "VCL". lub "FMX". jest to rozwiązywane wewnętrznie przez delphi. Więc jeśli użyjesz 'Forms' lub' Vcl.Forms' kod zadziała poprawnie. I na koniec o twoim ostatnim komentarzu, który zależy od rodzaju aplikacji, ta odpowiedź sugeruje użycie funkcji jako alternatywy dla użycia "dyrektywy warunkowej". – RRUZ

+2

Ten kod * wymaga * użycia "Forms", a nie "Vcl.Forms". Jeśli jawnie użyjesz 'Vcl.Forms' lub' Fmx.Forms', to już zdecydowałeś się na platformę w klauzuli uses dla urządzenia, a tym samym masz już warunkowy sposób sprawdzenia docelowego zestawu widgetów. –

+7

Ponadto, ponieważ zastosowanie TApplication, którego dotyczy, nie może się zmienić w czasie wykonywania, użycie TRttiContext jest ** całkowicie ** niepotrzebne. Możesz uprościć 'IsFireMonkeyApp' do' Wynik: = {$ IF DEKLAROWANY (TFmxObject)} Prawda {$ ELSE} Fałsz {$ IFEND}; 'i będzie miał dokładnie takie samo zachowanie. –

3

Prawdopodobnie nie ma określonego kompilatora dla VCL/FireMonkey. Musisz stworzyć własną.

Listę wstępnie zdefiniowanych warunków można znaleźć w documentation.

+1

Sprawdzanie definicji platformy nie jest niezawodne, ponieważ można na przykład utworzyć aplikację OSX z 'GUI bez klucza Firemonkey', jak pokazano tutaj http://stackoverflow.com/questions/7442131/delphi-xe2-is-it-possible-to-create-mac-gui-applications-without-firemonkey – RRUZ

+0

@RRuz: Wystarczająco fair. Zmieniono moją odpowiedź. –

11

Chociaż nie udokumentowano można mieć VCL i Firemonkey w tej samej aplikacji.

Nie ma zdefiniowanego kompilatora.

Jeśli budujesz coś, co musi być zarówno VCL, jak i Firemonkey, poleciłbym oddzielenie jednostek.

Możliwym sposobem:

  • MyLibrary.X.pas - Common Code że zarówno VCL i Firemonkey would zastosowania.
  • MyLibrary.Vcl.X.Pas - VCL specyficzny kod
  • MyLibrary.Fmx.X.Pas - Fmx Specific Code

mieszania kodu UI z dwóch różnych struktur w tej samej jednostce nie jest dobrym pomysłem . Połączy się w drugiej bibliotece, gdy nie będzie potrzebna.

+3

+1 dla "separacji jednostek" – RRUZ

1

Abbrevia obsługuje zarówno VCL i CLX użyciu tego rodzaju dzielone: ​​

QAbUnit1.pas:

{$DEFINE UsingCLX} 
unit QAbUnit1; 
{$I AbUnit1.pas} 

AbUnit1.pas:

{$IFNDEF UsingCLX} 
{$DEFINE UsingVCL} 
unit AbUnit1; 
{$ENDIF} 

type 
    ... 
    TMyWidget = class({$IFDEF UsingVCL}TWinControl{$ENDIF} 
        {$IFDEF UsingCLX}TWidgetControl{$ENDIF}) 
    ... 
    end; 

end. 

Aby dodać FireMonkey wsparcie, dodałbym plik taki jak ten:

FmxAbUnit1.pas:

{$DEFINE UsingFMX} 
unit FmxAbUnit1; 
{$I AbUnit1.pas} 
{$ENDIF} 

a następnie zrobić cokolwiek warunkowe zmiany muszę AbUnit1.pas.

To nie jest ładny, czysty podział, jak sugestia Roberta, ale zaletą jest to, że cała edycja odbywa się w jednym pliku, a definicja warunkowa jest obsługiwana automatycznie, więc nie musi pojawiać się w opcjach projektu.Kto kiedykolwiek używa twojej biblioteki, zawiera odpowiednią jednostkę do decydowania, z której chce skorzystać. Prawdopodobnie możesz również skorzystać z zakresu jednostek, nazywając pliki Fmx.AbUnit1.pas i Vcl.AbUnit1.pas, ale myślę, że Embarcadero to zniechęca.

+0

Całkiem niezłe rozwiązanie. Ale czy wgląd w pomoc pomaga tej konstrukcji, gdy definiuje się FMX? Przynajmniej w XE2 staje się bezradny podczas edycji dołączonych plików. – Fr0sT

+0

@ Fr0sT Nie używam FMX, więc nie mogę powiedzieć. W XE1 proste testy działają, ale przechwytują tylko niektóre zmiany w jednostce po zamknięciu i ponownym otwarciu projektu. –

4

Nie ma dyrektywy kompilatora, ponieważ technicznie nie ma czegoś takiego jak aplikacja firemonkey lub aplikacja vcl. Tylko aplikacje korzystające z tych technologii. Aplikacja może korzystać z fxm lub vcl, albo z obu, albo bez nich (np. Aplikacja konsolowa). To trochę jak pytanie, czy jest to aplikacja SQL. Można oczywiście programowo sprawdzić pochodzenie poszczególnych formularzy, aby zobaczyć, z której struktury dziedziczą. Ponownie, w jednostce, która nie ma powiązanego formularza, nie ma to znaczenia.

Powiązane problemy