ВНИМАНИЕ! Конкурс по программированию!
Проект Programmers.kz и школа hotPen3D2D предлагает Вам курсы по веб-дизайну, веб-программированию и компьютерной графике. Подробности здесь.
- Просмотров: 3109
- Автор: КазКиберГетик
Глава 21. Проблемы переноса приложений
Категория: Программирование » Kylix » Уроки Kylix
Глава 21. Проблемы переноса приложений
Перенос Windows-приложений в среду Linux
CLX как версия VCL
Отличия CLX от VCL
Команды, компоненты и другие элементы, перенос которых невозможен
Совместимости модулей Kylix и Delphi
Непереносимые возможности
Совместное использование файлов ресурсов Linux и Windows
Различие сред Linux и Windows
Написание переносимого кода
Использование специальных директив
Вывод сообщений
Перенос кода ассемблера в Linux
Сообщения и системные события
Переносимые приложения баз данных
Отличия в dbExpress
Отличия на уровне компонентов
Отличия на уровне интерфейса пользователя
Перенос приложений баз данных в Linux
Обновление данных в приложениях dbExpress
Кроссплатформенные интернет-приложения
Перенос интернет-приложений в среду Linux
Kylix предоставляет возможность разработки так называемых кроссплатформленных (межплатформенных) 32-разрядных приложений, которые могут гать как в среде Linux, так и в Windows. Для этого вы можете выбрать один из двух вариантов:
взять готовое Windows-приложение и модифицировать его с помощью средств Kylix;
создать в среде Kylix новое приложение, следуя рекомендациям, которые представлены в данной главе.
Примечание
Большинство приложений, разработанных для работы в среде Linux (если не используются специфичные для Linux вызовы API), могут после перекомпиляции работать под Windows.
Перенос Windows-приложений в среду Linux
Сложность переноса приложений из одной среды в другую зависит от сложности самого приложения. Если в приложении используются специфичные вызовы функций ядра одной из операционных систем, то перенос значительно затрудняется. Если же вы в своем приложении используете стандартные компоненты CLX, проблемы будут возникать значительно реже.
Итак, для переноса приложения из одной операционной системы в другую вы можете использовать три метода.
Платформозависимый перенос. В этом случае вы перерабатываете значительную часть кода приложения для новой операционной системы. Благодаря этому приложение будет активизировать характерные для данной операционной системы вызовы функций ядра и, следовательно, работать значительно быстрее.
Межплатформенный перенос. Подразумевает создание кода, который будет работоспособным как в одной, так и в другой операционной системе. В результате, несмотря на достаточную трудоемкость написания кола, получается приложение с единым интерфейсом, но разным содержанием.
Эмулирование среды Windows. Данный метод является наиболее комплексным и дорогостоящим. Однако получившееся приложение для среды Linux будет выглядеть наиболее похожим на переносимое из Windows приложение. Недостатком является низкая скорость выполнения приложения при эмуляции.
Если вы переносите приложение под Linux с целью запускать его только в данной среде, вы можете удалить все специфичные для Windows команды из приложения. Если же вам нужно запускать приложение в обеих средах, вам придется модифицировать код или использовать директиву компилятора $IFDEF для указания блоков кода, специфичных для одной из сред (Linux или Windows).
Перечислим семь главных шагов, которые нужно выполнить для переноса приложения из Windows в Linux:
1. Перенесите все исходные файлы вашего Windows-приложения на компьютер с установленной средой Linux. Исходные файлы должны включать файлы модулей (pas), файл проекта (dpr) и файлы используемых пакете!! (dpk). Кроме того, необходимо перенести файлы, связанные с файлом проекта: файлы форм (dfm), файлы ресурсов (res) и файлы опций проекта (dof). Если вы хотите откомпилировать файл только из командной строки, вам необходим файл конфигурации (cfg).
2. Если вы планируете использование совместных ресурсов для приложении Windows и Linux, переименуйте dfm файлы в файлы xfm, сохранив их названия (например, переименуйте unit I.dfm в unit 1.xfm). Переименуйте ссылки на .dfm файлы в модулях приложения из
{$R .dfm} в ($R .xfm}.
Примечание
Файлы dfm работают в среде Kylix, но после изменения могут и не работать в Delphi.
3. Смените все разделы uses с указанием правильных названий модулей Kylix (см. далее в этой главе).
4. Перепишите код, использующий специфические для Windows процедуры, чтобы сделать приложение более независимым от операционной системы. Сделайте это с помощью встроенных библиотек Kylix.
5. Найдите эквиваленты для команд, которые не поддерживаются в Linux. Используйте директиву компилятора $IFDEF (умеренно) для разграничения кода под Linux и Windows
Например, вы можете для вашего межплатформенного приложения воспользоваться следующим кодом (листинг 21.1):
Листинг 21.1. Использование директивы $IFDEF
//Если среда - Windows
[$IFDEF MSWINDOWS]
IniFile.LoadfromFile('с:\x.txt');
[$ENDIF]
//Если среда - Kylix
[$IFDEF LINUX]
IniFile.LoadfromFile('/home/name/x.txt');
[$ENDIF]
6. Найдите ссылки на пути ко всем файлам проекта:
- укажите правильные пути ко всем файлам Linux;
- смените ссылки на имена дисковых накопителей (например, С:\);
- в местах, где вы указали множество путей, смените разделитель путей с точки с запятой ";" на двоеточие ":";
так как имена файлов являются в Linux чувствительными к регистру, убедитесь, что в приложении все имена файлов записаны правильно.
Примечание
Пути в Linux используют прямой слэш "/" как разделитель (например, /usr/lib). Читатели, которые не знакомы с организацией файловой системы Linux, могут обратиться за краткой информацией в Приложение 3 данной книги.
7. Откомпилируйте проект в Linux. Просмотрите список ошибок, которые укажут, что еще необходимо сделать для того, чтобы ваше приложение работало в среде Linux.
CLX как версия VCL
Kylix использует библиотеку компонентов Borland для создания кроссплатформенных приложений (Borland Component Library for Cross Platform, CLX) вместо библиотеки визуальных компонентов Delphi (Visual Component Library, VCL). В VCL многие оконные компоненты позволяли достаточно просто работать с окнами Windows. В среде Linux CLX обеспечивает доступ к Qt widgets (образовано от двух слов: window - "окно" и gadget - "приспособление") при помощи специальной библиотеки Qt. CLX очень похоже на VCL. Множество компонентов CLX имеют такие же имена, как и в VCL. Многие свойства также имеют одинаковые названия.
Компоненты CLX можно сгруппировать в части, представленные в табл. 21.1.
Таблица 21.1. Части, в которые сгруппированы компоненты CLX
| Часть | Описание |
| visualCLX |
Межплатформенные графические компоненты и графика. Компоненты этой части могут различаться под Windows и Linux |
| DataCLX |
Клиентские компоненты для доступа к данным. Код этих компонентов одинаков для Linux и Windows |
| NetCLX | Компоненты Интернета, включающие Apache DSO и CGI WebBroker. Они одинаковы для Linux и Windows |
| BaseCLX | Библиотека времени выполнения, включающая модуль Classes, pas. Код одинаков для Linux и Windows |
В VisualCLX Widgets используется вместо оконных компонентов VCL. В CLX TWidgetControl используется как TWinControi в VCL. Другие компоненты (такие как TScroiiingwidget) имеют соответствующие имена. Вам не нужно самостоятельно изменять TWinControl на TWidgetControl. В файле ресурсов OControls.pas имеются объявления типов, такие как:
TWinControl = TWidgetControl;
которые предназначены для упрощения использования компонентов разными приложениями. Класс TWidgetControl и все его потомки имеют свойство Handle, которое представляет собой ссылку на объект Qt, а также свойство Hooks, ссылающееся на механизм обработки событий.
Названия модулей и расположение отдельных классов в CLX отличаются от VCL. Вам придется самостоятельно модифицировать разделы uses для исключения модулей, которых нет в Kylix и смены имен на имена модулей Kylix.
Отличия CLX от VCL
Хотя многое в CLX и VCL выполнено одинаково, они имеют некоторые отличия. Рассмотрим их.
Визуальная среда Linux выглядит несколько иначе, чем Windows. Внешний вид диалоговых окон может достаточно сильно отличаться, в зависимости от того, каким менеджером окон вы пользуетесь в Linux (например, KDE или Gnome).
В Linux вы можете использовать свойство TApplication. style для задания внешнего вида приложения (начертания графических элементов).
Можно оставить стиль таким, каким он установлен в Linux, но все же рекомендуется использовать свойство style.
Весь код для работы с вариантным типом данных (variant), который находился в модуле System, в CLX содержится в двух новых модулях:
Variants.pas;
VarUtils.pas .
Таким образом, если вы хотите использовать в своем приложении вариантные переменные, не забудьте добавить в раздел uses модуль variants.
Среда Linux не использует для хранения информации о текущей конфигурации системы системный реестр. Вместо него вы можете применять текстовые файлы конфигураций и переменные среды для получения такого же эффекта, как при работе с системным реестром Windows. Системные конфигурационные файлы в Linux часто находятся в каталоге /etc, например /etc/hosts. Кроме того, можно сохранять информацию в файлах инициализации ini как и в Windows. Есть лишь одно отличие: вам нужно использовать для работы с файлами инициализации объект TMeminiFile вместо TreginiFile, применяемого в Windows.
Нажатие клавиши <Enter> не имитирует событие щелчка кнопки мыши, как это происходит в Delphi.
Компонент TColorDialog не имеет свойства TColorDialog.options. Таким образом, вы не можете настроить работу и функциональность диалога выбора. Кроме того, TColorDialog не всегда является модальным (модальным называется окно, которое не позволяет пользователю работать с другими окнами, пока не будет закрыто).
Во время выполнения приложения комбинированные списки (TсоmbоВох) работают по-разному в Kylix и Delphi. В Kylix вы можете добавить строку в список, введя нужный текст строки и нажав на клавишу <Enter> для ввода комбинированного списка. Эту опцию можно отключить, установив свойство insertMode в ciNone. Также в Kylix можно добавить пустой (не содержащий строку) элемент списка в комбинированный список. Если вы нажмете и будете удерживать клавишу <> на клавиатуре управления курсором при активном комбинированном списке, то список не остановится на последней строке как в Delphi, а будет прокручиваться опять сверху вниз.
Компонент TCustomEdit не поддерживает Undo, ClearUndo и CanUndo. Но
пользователь приложения может отменить редактирование в поле для ввода TEdit во время работы приложения, нажав правую кнопку мыши над полем для ввода и выбрав в выпадающем меню пункт Undo.
Значение кода клавиши <Enter> при использовании событий onkeydown или ОnКеуup в Windows равно 13. В Linux для этой же клавиши код имеет значение 4100.
Команды, компоненты и другие элементы, перенос которых невозможен
Некоторые специфичные для Windows возможности не могут быть перенесены напрямую в среду Kylix. Такие элементы, как COM, ActiveX, OLE. BDE и ADO недоступны в среде Kylix. В табл. 21.2 перечислены элементы отличающиеся в средах Linux и Windows, а также эквивалентные элементы Kylix, если таковые имеются.
Таблица 21.2. Различие возможностей Delphi и Kylix
| Delphi/Windows возможность | Kylix/Linux возможность |
| Вызовы Windows API | Методы CLX, вызовы Qt, вызовы libc или вызовы других системных библиотек |
| Компоненты СОМ (включая ActiveX) | He поддерживаются |
| Компоненты ADO | Компоненты доступа к базам данных |
| Сообщения Windows | События Qt |
| Winsock | Сокеты BSD |
| Messaging Application Programming Interface (MAPI), включая стандартную библиотеку функций сообщений Windows | SMTP/POPS позволяют вам отсылать, получать и сохранять сообщения e-mail |
| Компоненты наследования (компоненты, расположенные на вкладке Win 3.1 палитры компонентов) | Не поддерживаются |
В Kylix эквивалентом файлов dll Windows являются файлы библиотек разделяемых объектов so, которые содержат независимый от расположения коя (position-independent code, PIC). Это приводит к следующему:
переменные, которые ссылаются на абсолютные адреса в памяти, недопустимы;
ссылки на глобальную память и вызовы внешних функций должны осуществляться через регистр ЕВХ, значение которого должно сохраняться между вызовами.
Совместимости модулей Kylix и Delphi
Все компоненты и объекты VCL и CLX определены в файлах модулей (pas). Например, вы можете найти описание объекта TObject в модуле system.pas. а описание базового класса TComponent - в модуле classes.pas. Когда вы помещаете объект на форму или используете его внутри своего приложения, имя модуля, который содержит данный компонент, помешается в раздел uses.
позволяет компилятору узнать, какие модули использует ваше приложение при работе.
В табл. 21.3 приведен список модулей Delphi и совместимых с ними модулей Cylix. Некоторые модули Delphi имеются только в новой версии Delphi - Delphi 6.
Таблица 21.3. Совместимые модули Delphi и Kylix
|
Модуль Delphi |
Модуль Kylix |
| ActnList |
QactnList |
| Buttons | Qbuttons |
| CheckLst | QcheckLst |
| Classes | Classes |
|
Clipbrd |
Qclipbrd |
| ComCtrls | QcomCtrls |
| Consts |
Consts, QConsts И RTLConsts |
| Contnrs | Contnrs |
|
Controls |
Qcontrols |
| ConvUtils | ConvUtils |
| DateUtils |
DateUtils |
| DB | DB |
| DBActns | QDBActns |
|
DBClient |
DBClient |
| DBCommon | DBCommon |
| DBConnAdmin | DBConnAdmin |
| DBConsts | DBConsts |
| DBCtrls | QDBCtrls |
| DBGrids |
QDBGrids |
| DBLocal | DBLocal |
|
DBLocalS |
DBLocalS |
| DBLogDlg |
DBLogDlg |
| DBXpress | DBXpress |
| Dialogs |
Qdialogs |
| DSIntf | DSIntf |
| ExtCtrls | QExtCtrls |
| FMTBCD | FMTBCD |
| Forms | QForms |
| Graphics | QGraphics |
|
Grids |
Qgrids |
| Heiplntfs | Heiplntfs |
| ImgList | QimgList |
| IniFiles | IniFiles |
| Mask | Qmask |
|
MaskUtils |
MaskUtils |
| Masks | Masks |
| Math | Math |
| Menus | Qmenus |
| Midas | Midas |
| MidConst | MidConst |
|
Printers |
QPrinters |
| Provider | Provider |
| Qt | Qt |
| Search | Qsearch |
| Sockets | Sockets |
| StdActns | QStdActns |
| StdCtrls | QStdCtrls |
| SqlConst |
SqlConst |
| SqlExpr | SqlExpr |
| SqlTimSt | SqlTimSt |
| StdConvs | StdConvs |
| SyncObjs | SyncObjs |
| SysConst | SysConst |
| Syslnit | Syslnit |
| System | System |
| SysUtils | SysUtils |
| Types |
Types И QTypes |
| Typlnfo |
Typlnfo |
| VarCmplx | VarCmplx |
| Variants | Variants |
| VarUtils | VarUtils |
В Kylix имеются два модуля, эквивалентов для которых нет в Delphi. Это модули:
DirSei - отвечает за выбор каталога;
Qstyie - отвечает за графический интерфейс пользователя.
Табл. 21.4 содержит список модулей, которые не поддерживаются средой Kylix, т. к. содержат объекты, специфичные для
среды Windows.
Таблица 21.4. Модули VCL, не поддерживаемые средой Kylix
|
Модуль VCL |
Причина, по которой он не поддерживается в Kylix |
| ADOConst |
Нет ADO |
| ADODB | Нет ADO |
| AppEvnts | Нет объекта TapplicationEvent |
| AxCtrls | Нет COM |
| BdeConst | Нет BDE |
| ComStrs | Нет COM |
| CorbaCon | Нет Corba |
| CorbaStd | Нет Corba |
| CorbaVCL | Нет Corba |
| CtlPanel |
Нет панели управления Windows |
| DataBkr | Может появиться в более поздних версиях |
| DBCGrids | Нет BDE |
| DBExcept | Нет BDE |
| DBInpReq | Нет BDE |
| DBLookup | Устарело |
| DbOleCtl | Нет СОМ |
| DBPWDlg | Нет BDE |
| DBTables | Нет BDE |
| DdeMan | Нет DDE |
| DRTable | Нет BDE |
| ExtDlgs |
Нет графических диалогов |
| FileCtrl | Устарело |
| MConnect | Нет СОМ |
| Messages | Специфичная Windows-функция |
| MidasCon | Устарело |
| MPlayer | Медиа-проигрыватель Windows |
| Mtsobj | Нет СОМ |
| MtsRdm | Нет СОМ 356 |
| Mtx | Нет COM |
| mxConsts | Нет COM |
| ObjBrkr | Может появиться в более поздних версиях |
| OleConstMay | Нет СОМ |
| OleCtnrs | Нет СОМ |
| OleCtrls | Нет СОМ |
| OLEDB | Нет СОМ |
| OleServer | Нет СОМ |
| Outline | Устарело |
| Registry | Специфичная для Windows поддержка системного реестра |
| ScktCnst | Заменено на Sockets |
| ScktComp | Заменено на Sockets |
| SConnect | Неподдерживаемый протокол связи |
| SvcMgr | Поддержка сервисов Windows NT |
| Tabnotbk | Устарело |
| Tabs | Устарело |
| ToolWin | Не поддерживается |
| VCLCom | Нет СОМ |
| WebConst | Константы Windows |
| Windows | Специфичные для Windows виртуальные коды клавиш |
Непереносимые возможности
При создании объекта CLX с помощью палитры компонентов или написания кода, использующего метод create, компилятор создает экземпляр widget. Этот экземпляр принадлежит данному объекту CLX. Если вы вызываете метод Free для уничтожения объекта CLX или автоматически уничтожаете родительский контейнер, содержащий объект CLX, экземпляр widget данного объекта будет также уничтожен. Эта функция характерна для VCL в приложениях Windows.
Если вы создаете объект CLX с помощью метода create (AHandle), то этот объект не будет иметь в собственности Qt widget. Таким образом, при вызове метода Free будет уничтожен только объект CLX. В VCL Windows это невозможно.
Совместное использование файлов ресурсов Linux и Windows
Если вы хотите, чтобы ваше приложение успешно функционировало и в Windows и в Linux, вы можете распространять ваше приложение с ресурсными файлами, которые необходимы как для одной, так и для другой операционной системы. Для этого вы можете разместить файлы ресурсов на сервере, который является доступным для обеих систем или использовать Samba на
Linux-компьютере для обеспечения доступа к файлам через сеть Microsoft.
Файлы форм (dfm в Delphi) имеют расширение xfm в Kylix. Если вы хотите использовать один и тот же файл формы для Linux и Windows, переименуйте dfm файлы в xfm. Иначе файлы dfm будут изменены средой Linux таким образом, что они не будут функционировать в среде Windows.
Примечание
Переименование файлов принесет результат лишь в том случае, если вы используете Delphi 6, которая поддерживает CLX.
Различие сред Linux и Windows
В табл. 21.5 приводится список отличий сред Linux и Windows.
Таблица 21.5. Отличия Linux и Windows
| Отличие |
Описание |
|
Чувствительность к регистру букв в именах файлов |
В Linux заглавные буквы не являются эквивалентом прописных букв. Таким образом, файлы Test.txt и файл test.txt - разные |
| Символ конца строки |
В Windows строки текста завершаются двумя байтами ASCII: 13 и 10 (перевод строки и переход на начало строки), в Linux - только одним переходом на начало строки. При переносе кода из Windows помните об этом отличии |
| Символ конца текстового файла | В DOS и Windows символьное значение #26 (комбинация клавиш <Ctrl>+<Z>) распознается как конец текстового файла. Все, что находится после этого символа, не рассматривается системой как текст. Среда Linux не имеет специального символа, обозначающего конец текстового файла. Текстовые данные завершаются в конце файла |
|
Пакетные файлы и файлы скриптов оболочки |
Эквивалентом пакетных bat-файлов Windows в Linux являются файлы скриптов оболочки. Файлы скриптов - это текстовые файлы, содержащие инструкции и команды. Такие файлы сохраняются и делаются выполняемыми с помощью команды chmod +x <имя файла скриптах Для выполнения этого файла достаточно набрать его имя и нажать <Enter> |
| Подтверждение команды |
В DOS и Windows, если вы хотите удалить файл или папку, система запрашивает подтверждение "Вы уверены, что хотите удалить файл или папку?". Linux обычно не выдает такого запроса, а просто удаляет файл или папку. Поэтому будьте особенно внимательны при удалении файлов или папок |
| Обратная связь с командой | Если команда Linux выполнена успешно, будет отображена командная строка без каких-либо сообщений |
| Ключи команд |
Linux использует дефис "-" для ключей команд и двойной дефис "--" - для множественных опций команды, в то время как DOS и Windows используют слэш "/" или дефис "-" |
| Файлы конфигурации |
В Windows сведения о конфигурации системы хранятся в системном реестре и в файлах, таких как autoexec.bat. В Linux файлы конфигурации созданы как скрытые файлы, имена которых начинаются с точки. Многие из них находятся в каталоге /etc и в вашем домашнем каталоге /home. Кроме того, для хранения системной информации Linux использует переменные среды, такие как LD_LIBRARY_PATH (путь поиска файлов библиотек), НОМЕ (ваш домашний каталог), TERM (тип терминала: xterm, vtlOO, console), SHELL (путь к файлам оболочки), USER (ваше имя для входа в систему), PATH (список путей к файлам программ). Эти переменные определяются в оболочке или в re-файлах, например bashrc |
| Динамически присоединяемые библиотеки | В Linux используются файлы разделяемых объектов so, а в Windows - файлы динамически присоединяемых библиотек dll |
| Буква, обозначающая имя накопителя | В Windows для указания накопителя используется буква, например А: для накопителя на гибких дисках. В Linux такие имена не используются. Об организации файловой системы Linux см. Приложение 3 |
| Исполняемые файлы | В Linux исполняемые файлы не нуждаются в расширении. В Windows такие файлы должны иметь расширение ехе Глава 21. Проблемы переноса приложений |
| Расширения имен файлов | Linux не использует расширения имен файлов для определения типов файлов или для ассоциаций файлов с приложениями |
| Права на файлы | В Linux с файлами и каталогами сопоставлены права на чтение, запись и выполнение для владельца файлов, групп пользователей и отдельных пользователей. Например, -rwxr-xr-x обозначает "слева направо": - - тип файла (- - обычный файл, d - директорий, I - ссылка); rwx - права для владельца файла (г - чтение, w - запись, х-запуск); r-х - права для группы пользователей (х - выполнение, г - чтение); r-х - права для всех остальных пользователей (чтение и выполнение). Пользователь может отменить все эти права. При использовании прав убедитесь, что приложение запущено пользователем, имеющим достаточные права |
| Утилита make | Утилита фирмы Borland make не доступна в среде Linux. Вместо нее вы можете использовать собственную утилиту Linux GNU make |
| Многозадачность | Linux полностью поддерживает многозадачность. Вы можете запустить несколько различных программ (называемых процессами Linux) одновременно. Вы можете запустить любой из процессов в фоновом режиме. Для этого используйте символ & после имени выполняемого файла |
| Пути к файлам | Для указания пути к файлу в Linux используется прямой слэш "/", в то время как в DOS и Windows используется обратный слэш "\" |
| Символические ссылки | В Linux символические ссылки - это специальные файлы, которые указывают на другие файлы, расположенные на диске. Эти ссылки создаются с помощью команды In (link). В Windows эквивалентом символических ссылок являются ярлыки рабочего стола |
Написание переносимого кода
Для создания кроссплатформенного приложения следуйте приведенным ниже советам:
сократите вызов специфичных функций API Win32 или Linux или откажитесь от него совсем, используйте вместо этого методы CLX;
устраните конструкции PostMessage и SendMessage внутри приложения;
используйте объект TMemlniFile вместо TreglniFile;
обращайте внимание на регистр символов при наименовании файлов или каталогов;
откажитесь от кода ассемблера TASM (ассемблер GNU не поддерживает синтаксис TASM);
попробуйте написать код, использующий платформонезависимые библиотеки и константы, находящиеся в модулях system, sysutiis и других модулях, одинаковых для обеих платформ.
Приведем пример, который позволяет использовать многобайтные символы для обеих платформ (Windows и Linux). Среда Windows традиционно сопоставляет только два байта каждому многобайтному символу. В Linux многобайтная кодировка символов может содержать намного больше байтов на один символ (до шести байтов в кодировке UTF-8). Обе платформы могут использовать одинаковую кодировку с помощью функции strNextchar, находящейся в модуле Sysutiis. В листинге 21.2 приведен код для среды Windows.
Листинг 21.2. Код для среды Windows
while р^ <> #0 do
begin
if p^ in LeadBytes then
inc(p) ;
inc(p);
end;
Этот код можно преобразовать в платформонезависимый, как показано в листинге 21.3.
Листинг 21.3. Платформонезависимый код
while р^ <> #0 do
begin
if р^ in LeadBytes then
p := StrNextChar (p)
else
inc(p);
end;
Если использование функций библиотек не приводит к работающему решению можно попробовать изолировать специфичный код в блоки SIFDEF. ОДНако постарайтесь ограничить число таких блоков.
Использование специальных директив
Пользование директивы компилятора $IFDEF является достаточно разумным путем для разделения кода Windows и Linux в вашем межплатформенных приложении. Тем не менее, использование директивы $IFDEF делает приложения более трудным для понимания, поэтому старайтесь применять эту директиву как можно реже.
Пользуясь директивой $IFDEF, следуйте нижеприведенным указаниям:
постарайтесь не применять директиву $IFDEF без крайней необходимости. Эта директива применяется в исходном файле только после компиляции;
не используйте директиву SIFDEF в файлах пакетов (dpk). Создателям компонентов нужно разработать два пакета для каждой из платформ без использования директивы SIFDEF;
применяйте директиву SIFDEF MSWINDOWS для проверки того, что приложение запушено в среде Windows. Используйте директиву $IFDEF WIN32 для определения различных Windows-платформ, например 32- и 64-бит-ную версии Windows;
используйте директиву $IFDEF LINUX для проверки того, что приложение запущено в среде Linux;
избегайте в своих приложениях комбинации $IFNDEF/$ELSE. Пользуйтесь положительными тестами ($IFDEF/$ELSE) для лучшего понимания кода;
старайтесь использовать директивы $IFDEF MSWINDOWS и SIFDEF LINUX вместо комбинаций $IFDEF LINUX/$ELSE или $IFDEF MSWINDOWS/$ELSE.
Приведем пример неосторожного обращения с директивой $IFDEFF (листинг21.4).
Листинг21.4. Неправильная работа директивы $IFDEF
{$IFDEF WIN3
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.




