Директива об операционной системе в Delphi Prism - PullRequest
1 голос
/ 23 августа 2011

Поскольку я пишу программу, которая в конечном итоге будет работать в среде Windows и Linux, скомпилированной из одних и тех же файлов проекта, я хотел протестировать и посмотреть, насколько хороши директивы операционной системы. Итак, я написал пример кода. Код, кажется, запускается неожиданно или это просто мое воображение.

Вот код:

method MainForm.ControlBtn_Click(sender: System.Object; e: System.EventArgs);
begin
  {$IFDEF linux}
    MessageBox.Show('This is Linux. Horay!!!', 'mypro',MessageBoxButtons.yesno);
  {$ENDIF}

  {$IFDEF WIN32}
    MessageBox.Show('This is Win32. Horay!!!', 'mypro',MessageBoxButtons.yesno);
  {$ENDIF}

  {$IFDEF CLR}
    MessageBox.Show('This is .NET Framework. Horay!!!', 'mypro',MessageBoxButtons.yesno);
  {$ENDIF}
end;

Теперь, когда я запускаю этот метод в Windows, появляется окно с сообщением «Это .NET Framework. Horay !!! Я как бы ожидал, что он работает на Windows. Когда я запустил его в Linux под Mono, он высветил окно с таким же сообщением: «Это .NET FrameWork. Horay !!!» Я ожидал увидеть сообщение Linux: «Это Linux. Horay !!!» Если этот код работает правильно, то как проверить, на какой платформе работает ваша программа, если вам нужно выполнить разные методы, поддерживаемые только Linux, Mac или Windows.

1 Ответ

3 голосов
/ 23 августа 2011

Директивы компилятора оцениваются во время компиляции (отсюда и директивы компилятора). Таким образом, полученный .exe всегда будет указывать платформу, на которой он был скомпилирован, а не ту, на которой он запущен. Кроме того, директивы Delphi-Compiler не определяются таким образом для языка Prism / Oxygene.

Способ получения ОС, на которой вы работаете, несколько сложен (например, есть несколько значений, указывающих, что вы в UNIX), но не слишком сложен.

Первое место, куда нужно пойти - System.Environment.OSVersion.Platform. Это перечисление определяет следующие значения в .NET 2.0: Win32S, Win32Windows, Win32NT, WinCE, Unix, Xbox, MacOSX. MacOS имеет свое значение, в то время как Linux и другие системы Unixoid разделяют значение Unix.

Mono также определяет другие значения (см. Запись FAQ по Mono при определении платформы).

Редактировать: Один из возможных способов будет:

var os: string := if Environment.OSVersion.Platform = System.PlatformID.Unix then
   'Linux/Unix'
else if Environment.OSVersion.Platform = System.PlatformID.MacOSX then
   'Mac OS X'
else
   'Windows';
...