Часто задаваемые вопросы по Borland Delphi 1.0


Delphi 1.0


Вопросы общего характера
  1. Какие существуют варианты поставки Delphi 1.0?
  2. Какие форматы скомпилированных модулей можно получить в Delphi 1.0?
  3. Есть ли проблемы в Delphi с русским языком?
  4. Какую модель данных использует Delphi?
  5. Можно ли использовать в приложении ресурсы, созданные в BPW 7.0?
  6. Возможно ли написать Screen Saver для Windows в Delphi?
  7. Как Delphi обрабатывает функции обратного вызова Windows (сallback)?
Delphi и Visual Basic
  1. Есть ли в Delphi эквивалент массива элементов управления из Visual Basic?
  2. Как использовать DLL, написанные в Delphi, например в Visual Basic?
  3. Конвертация TBasicString (VBX) в string.
Базы данных
  1. Ошибка инициализации BDE ($2C09).
  2. Ошибка при загрузке языкового драйвера.
  3. Что значит ошибка IDAPI $2C08?
  4. Отличается ли локальный InterBase, встроенный в Delphi 1.0, от InterBase для других платформ, в частности, от InterBase для Windows NT?
  5. Что насчет VBX-компонентов для работы с данными?
Object Pascal и Windows API
  1. Можно ли использовать OWL в Delphi?
  2. Как можно зааллокировать блоки памяти больше, чем 64 Кбайт?
  3. GPF в ToolHelp.DLL в Win-OS/2 2.1.
  4. Как получить из Clipboard текст большого размера?
  5. Проблемы Delphi с WinG.
Компоненты и VCL
  1. Каковы ограничения на стандартные компоненты Delphi?
  2. Предел буфера редактирования в 32K для TMemo.
  3. Почему компонент TGauge так медленно работает (медленнее, чем VBX BGauge)?
Разное
  1. Распространение приложений Delphi, использующих Local InterBase.

Вопросы общего характера



1. Какие существуют варианты поставки Delphi 1.0?

Версия Delphi 1.0 имеет два варианта: Delphi Desktop и Delphi Client/Server.

Версия Delphi 1.0 Desktop включает:

Версия Delphi 1.0 Client/Server включает в себя все, что имеется в Delphi Desktop плюс: * Local InterBase - однопользовательский SQL сервер базы данных. Версия, включенная в Delphi Desktop, предназначается для использования разработчиками, которые хотят разрабатывать SQL приложения (для последующего переноса их в среду клиент/сервер) без покупки собственной (дорогой) платформы сервера. Однако, Delphi Desktop не включает права распространения на Local InterBase. Если вы хотите распространять однопользовательское приложение, которое его использует, вы должны заплатить дополнительно за deployment kit.

** Версия ReportSmith из Delphi Desktop специально обнаруживает и исключает из списка возможных соединений любой ODBC драйвер к удаленному серверу данных. Да, вы не ослышались. Даже если вы купили ODBC драйвер третьей фирмы, и даже если вы можете прекрасно общаться с этим драйвером из Delphi, ReportSmith еще не будет с ним работать. Если вы хотите сделать это без покупки Delphi Client/Server , вы может купить ReportSmith/SQL отдельно за $300 (и тем не менее приобретете ReportSmith версии 2.0, а не 2.5, как в поставке Delphi Client/Server) .

На данный момент версия Delphi 1.0 фирмой Borland отдельно не поставляется и имеется только в составе старших версий продукта.

2. Какие форматы скомпилированных модулей можно получить в Delphi 1.0?

Delphi может создавать EXE- и DLL-файлы  для Windows 3.1. Естественно, Вы может также создавать VBX, но для этого нужно знать соглашения по написанию DLL в формате VBX. Имеется информация о написании VBX для Borland Pascal for Windows, которая с небольшими изменениями подходит и для Delphi.

Delphi не создает EXE-файлы для DOS.

3. Есть ли проблемы в Delphi с русским языком?

Что касается визуальных компонент, то все они, включая меню, допускают надписи (Caption) и ввод киррилицей; "горячие клавиши" тоже могут быть русские, например комбинация Alt-Ф для пункта меню &Файл (конечно, должен  быть включен драйвер русской клавиатуры). Для работы с таблицами нужно в утилите конфигурации BDE установить:

  1. В разделе драйверы для всех типов баз данных установить соответствующий драйвер языка (например Pdox ANSI Cyrillic).
  2. Если таблица (в частности, в формате Paradox) уже была создана с использованием другого драйвера языка, то ее можно перенастроить в DataBase Desktop на нужный драйвер.
  3. Для того, чтобы Database Desktop нормально 'видел' русские буквы, его настройки тоже необходимо немного подкорректировать.
Русские буквы в среде:

Поскольку используются разные версии Windows (Eng, Rus, Win-OS2, Win95, WinNT), способы могут быть как разными, так и общими (Windows есть Windows).

Сначала опишем действия, необходимые для русификации Windows:

  1. Если вы собираетесь работать в OS/2, то желательно иметь английскую версию Windows 3.1 или OS/2 с Win-OS2 (в последнем случае вы не сможете запускать Windows без OS/2). Windows for WorkGroups здесь не подойдет, т.к. их сетевые функции под OS/2 работать не будут - для этого есть другие средства.
  2. Hе смотря на то, что вы собираетесь работать с англоязычной версией Windows найдите русские Windows и "вытащите" оттуда все шрифты *.FON, *.FOT, *.TTF.
  3. Каким-нибудь редактором шрифтов (напр FontoGrapher) скопируйте русские буквы с адреса 100 на адрес С0 - в этом случае один шрифт можно использовать и в английских и в русских Windows.
  4. Установите какой-либо русификатор - неплохо ведут себя CyrWin и ParaWin, причем для Win-OS2 предпочтительнее ParaWin. Устанавливать можно только русификатор без шрифтов, т.к. шрифты пойдут от русских Windows. Если вы не выполнили пункт 3, то TTF от русских Windows вам не помогут, и нужно будет ставить шрифты из комплекта русификатора.
  5. Замените все шрифты *.FON на шрифты из русских Windows.
  6. Подключите русские шрифты (Arial Cyr, Courier New Cyr, Times New Cyr).
  7. Добавьте в WIN.INI в секцию [FontSubstitutes] следующую строку: Arial=Arial Cyr или вместо Arial Cyr укажите русский шрифт сходный по начертанию (напр. для CyrWin это NTHelvetica/Cyrillic).
Также на всякий случай можно добавить следующие подстановки: Одновременно закомментируйте строки, где упоминается английский шрифт Arial.

В русских Windows можно совершенно безболезненно удалить (при помощи Control Panel/Fonts) шрифты, имеющие в названии окончание CE (напр. Arial CE) - это сербо-хорватские шрифты, которые вам вряд-ли когда понадобятся (русских букв там нет).

Далее, возможные варианты работы с русскими буквами в редакторе Delphi.

Нельзя в Windows выставлять TrueType fonts only - редактор использует только FixedFonts, в результате Delphi просто не будет работать.

  1. Комментарии и строки могут быть введены только в кодировке 1251 - причина, естественно в том, что русификатор позволит вводить русские буквы только в этой кодировке. Тексты, написанные в DOS (кодировка 866), будут отображаться как "мусор" на экране - редактор HЕ преобразует символы 866->1251. Однако если для редактора установить шрифт Terminal - тексты в 866 будут отображаться нормально, а ввести символы не удастся (опять-же по причине ввода символов только в кодировке 1251). Уже готовый текст в 866 кодировке лучше преобразовать в 1251 с помощью одной из программ конвертации.
  2. Некоторые программные продукты при установке меняют фиксированные шрифты или даже удаляют их. Будьте внимательны при и после установки других программных продуктов, особенно редакторов текстов (WinWord, AmiPro ... ). Держите под рукой архив с русскими шрифтами *.FON, чтобы была возможность восстановить эти шрифты.
  3. Поэкспериментируйте со шрифтами редактора - разные шрифты имеют разное начертание, и разную скорость перерисовки. Выберите нужное для себя - либо скорость перерисовки, либо удобное начертание.
Для локального InterBase нормальной русской кодировкой является Win1251 - имена доступных кодировок можно найти открыв любую DB InterBase (в т.ч. и локальную) и заглянув в системную таблицу RDB$CHARACTER_SETS.

4. Какую модель данных использует Delphi?

Delphi использует смешанную (mixed) модель памяти, но она очень похожа на модель large в C.С++:

Эта схема используется в Borland Pascal долгое время.

5. Можно ли использовать в приложении ресурсы, созданные в BPW 7.0?

Все ресурсы, созданные в других приложениях, можно подключить и использовать  в Delphi с помощью директивы компилятора {$R ...} и процедур Windows API. Кроме того, меню из файла ресурсов и графические файлы *.BMP, *.ICO и *.WMF можно импортировать в приложение Delphi на этапе разработки. В настоящее время компанией Borland поставляется программный продукт RAD Pack for Delphi, где в состав поставки входит эксперт, позволяющий преобразовывать ресурсы из BP7.0 в формы Delphi.
6. Возможно ли написать Screen Saver для Windows в Delphi?

Для создания программы, работающей как Screen Saver:

  1. В проектном файле (*.dpr) напишите {$D SCRNSAVE <SaverName>} после uses; данная директива вставляет указанный текст (SCRNSAVE <SaverName>) в раздел описания модуля - в данном случае программы. Это главное, что необходимо для того, чтобы Windows распознал программу как Screen Saver.
  2. Hа главной форме выключите Border (BorderStyle=bsNone) и иконки. Установите свойства Left и Top =0, WindowState=wsMaximize.
  3. В обработчике события OnCreate, установите Application.OnMessage на процедуру деактивации Screen Saver. Установите Application.OnIdle на любую процедуру для рисования на экране.
  4. В обработчике OnCreate должна проверяться командная строка на наличие ключей /c и /s. Эти параметры определяют, нужно ли запускать сам Screen Saver или его конфигурацию (/c - конфигурация).
  5. Скомпилируйте программу и переименуйте из .exe в .scr ;  поместите файл в каталог Windows - Screen Saver должен появиться на панели управления (Control Panel).

7. Как Delphi обрабатывает функции обратного вызова Windows (сallback)?

Точно так же как C: вы можете получить указатель (far pointer) на вашу callback процедуру (не забыть при этом обьявить ее с директивой компилятора  {$F+}, либо спецификатором far) и передать этот указатель в Windows. Это все.

Delphi и Visual Basic


1. Есть ли в Delphi эквивалент массива элементов управления из Visual Basic?

Hет. Компоненты Delphi не имеют свойства Index, подобное VB. Однако, имеются три основные причины, почему вы хотите использовать их в VB, и для каждой из них есть решение в Delphi.

Причина 1. Вы хотите использовать один обработчик события для разных компонент на форме.

Это просто. Все, что вы должны сделать - это выбрать тот же самый обработчик для каждой визуальной компоненты. Это лучше, чем в случае с массивом компонент, потому что вы можете одну и ту же процедуру-обработчик события присвоить различным типам компонент; например, кнопка на форме и пункт меню могут вызывать ту же самую функцию для обработки события OnClick.

Причина 2. Вы хотите динамически создавать и уничтожать визуальные компоненты во время выполнения программы.

Это также довольно просто в Delphi . Предположим, что на форме есть кнопка, и, каждый раз когда она нажимается, вы хотите создавать другую кнопку. Следующий пример показывается, как это делать:

Причина 3. Вам действительно требуется доступ к компонентам по номеру.

Предположим, что вы решили написать игру вроде Реверси в Delphi. Вам нужно разместить 100 объектов TShape на форме, в виде квадрата 10x10. Конечно, размещать каждый элемент вручную на экране - задача трудоемкая и неинтересная, при этом, в декларации формы появляется 100 строк кода, которые, в общем-то, не нужны. Вместо этого можно завести массив вроде

Далее в программе нужно создать каждый из этих объекты, вызвав TShape.Create(FormXX); указать вручную начальные установки для них. Кроме того, в свойстве Parent каждого объекта из массива нужно указать ту панель (TPanel) или форму, на которой они располагаются. Это нужно для правильной перерисовки объектов.

Если же вы не используете такие большие массивы, т.е., например хотите одинаково реагировать на нажатие 3-5 кнопок с незначительным различием для каждой из них, то можно использовать свойство Tag.

2. Как использовать DLL, написанные в Delphi, например в Visual Basic?

Допустим, вы написали на Delphi DLL и в нем объявили функцию

в Visual Basic Вы должны подключить ее как: а в программе на VB использовать следующим образом:
3. Конвертация TBasicString (VBX) в string.

Q:Я использую VBX и испытываю проблемы с конвертацией TBasicString в string. Как это сделать?

A:Существует две функции -

Действительно, ссылок на эти функции нет в документации, но имена этих функций можно "обнаружить" в VBXCTRL.DCU.

Базы данных



1. Ошибка инициализации BDE ($2C09).

Q:Когда я пытаюсь запустить приложение из Delphi, то получаю ошибку EDatabaseError и сообщение 'An error occurred while attempting to initialize the Borland Database Engine (Error $2C09)'

A:Добавьте SHARE.EXE в AUTOEXEC.BAT или добавьте DEVICE=VSHARE.386 в раздел [386Enh] файла SYSTEM.INI и перезагрузитесь.

2. Ошибка при загрузке языкового драйвера.

Q:У меня есть Quattro Pro 6.0 и IDAPI в сети. После установки Delphi и нового IDAPI поверх сетевого IDAPI при запуске Quattro Pro с другой машины я получаю ошибку 'Could not load Language Driver'.

A:Добавьте раздел [Borland Language Drivers] в WIN.INI файл для указания каталога языкового драйвера. Пример:


3. Что значит ошибка IDAPI $2C08?

'Cannot load IDAPI01.DLL'. Убедитесь, что в файле WIN.INI правильно прописаны пути:


4. Отличается ли локальный InterBase, встроенный в Delphi 1.0, от InterBase для других платформ, в частности, от InterBase для Windows NT?

16-Разрядный Local InterBase не поддерживает:

Все остальные функции поддерживаются, но структура хранения базы на диске не совпадает.

Q:Можно ли поставить локальный InterBase на файл-сервере и, таким образом, получить доступ к нему из многих приложений?

A:Работать не будет. И не пытайтесь. Для этой цели вам нужен нормальный многопользовательский InterBase.

5. Что насчет VBX-компонентов для работы с данными?

Delphi поддерживает только VBX 1.0. Это значит что VBX для работы с данными 'не работает' с Delphi. В общем случае, все, что работает с Microsoft Visual C++, должно работать в Delphi. Кроме того, некоторые VBX достаточно хорошо написаны, так что их можно использовать в Delphi и без обращения к возможностям работы с данными.

Object Pascal и Windows API



1. Можно ли использовать OWL в Delphi?

Можно, если уже существуют свои разработки с использованием OWL. Однако следует обратить внимание, не используются ли слова class, try, except и ряда других - в Delphi они являются зарезервированными. Если же опыта использования OWL не было, то вряд ли имеет смысл использование этой библиотеки - в Delphi существуют свои, более удобные средства для работы с Windows.

Компиляция приложений, написанных на BP7 с использованием OWL.

Компилятор Delphi способен компилировать приложения, написанные на OWL Borland Pascal 7.0. Для компиляции таких приложений в среде Delphi необходимо сделать следующее:

  1. Откройте главный файл приложения пунктом меню File|Open Project
  2. Добавьте в список используемых модулей uses модуль Messages в тех файлах, где использовался модуль WinTypes. Модуль Messages должен быть указан ранее модуля OWindows, ODialogs или любого другого OWL-модуля.
  3. При помощи пункта меню Options|Project Dialog добавьте путь x:\DELPHI\SOURCE\RTL70 к пути поиска модулей данного проекта. Этот каталог должен содержать файлы OWL, измененные для компиляции в Delphi.
Если Вы забыли указать использование модуля Messages, то Вы при компиляции получите сообщение 'Unknown identifier'. Указание Messages после модуля OWindows вызовет сообщение 'Header does not match previous definition'.
Идентификатор Result теперь используется особым образом внутри тела функций, поэтому их внимательно посмотрите, где этот идентификатор может встречаться. Недопустимо использование перекрывающихся диапазонов в операторе case.

Изменилась реализация StrDispose. Если Вы распределяете память для строки при помощи GetMem, то освобождение этой области памяти при помощи StrDispose вызовет ошибку выполнения 'Runtime error 203'. Для распределения памяти для строк следует использовать функции StrAlloc или StrNew. Объекты OWL не ориентированы на обработку исключительных ситуаций, т.е. при возникновении таких ситуаций не происходит отката инициализации объектов. Мы не рекомендуем использование исключения в приложениях с OWL.

Компилятор теперь производит поиск модулей, ресурсов и OBJ файлов по пути, указываемому в каталогах OPTIONS|Project. Путь 'EXE and TPU directory' больше не поддерживается. EXE-файлы могут создаваться в 'Output directory', а файлы DCU всегда создаются в том каталоге, где находятся соответствующие файлы PAS. Новые модули WinTypes и Messages могут быть скомпилированы BP7. Для этого не требуется включения дополнительных директив $IFDEF (зато там есть $IFDEF WIN32;).

2. Как можно зааллокировать блоки памяти больше, чем 64 Кбайт?

Используйте GlobalAlloc и GlobalLock из модуля WinProcs.

3. GPF в ToolHelp.DLL в Win-OS/2 2.1.

Поставьте FixPack, или сделайте Upgrade на OS/2 Warp 3 FullPack.

4. Как получить из Clipboard текст большого размера?

Да, стандартный метод TClipboard.AsText ограничивает текст размером строки - 255 байт. Для получения текста длиной более 255 байт можно использовать, например следующую процедуру:


5. Проблемы Delphi с WinG.

Q:Я слышал, что у Delphi проблемы с WinG, однако кто-то их решил?

A:Да, Майк Скотт (Mike Scott, 100140.2420@compuserve.com) даже написал коммерческий вариант VCL-компонентов, использующих WinG для Delphi:

WinG Sprite Kit.
Набор компонентов, осуществляющих доступ к WinG из Delphi. Включает компоненты TWinGCanvas для рисования TWinGDC и TWinGBitmap, TWinGSurface, которые можно поместить на форму и спрайтовый компонент, который можно помещать на них.
$99 EEP

Существует статья по использованию WinG в Borland Pascal - #5 Pascal Magazine. Обзор VCL WinG появится в новом Delphi Magazine. Отошлите письмо с вашим почтовым адресом на 70630.717@compuserve.com для получения бесплатной копии этих журналов (наверняка из России это не сработает.

Компоненты и VCL



1. Каковы ограничения на стандартные компоненты Delphi?

Все компоненты, использующие TList для сохранения информации, имеют верхний предел 16368 единиц. Hапример, TTabControl может содержать до 16368 закладок и Delphi Component Palette может содержать до 16368 страниц.

Многие из стандартных компонент Delphi являются надстройкой над стандартными управляющими элементами Windows. Windows 3.1 налагает свои собственные ограничения на эти компоненты. Hапример: TComboBox или TListbox могут содержать до 5440 единиц, а TMemo или TEdit (и соответствующие компоненты) - до 32k текста.

Ресурсы Windows 3.1 ограничивают компонент TNotebook 570 страницами. (Трудно получить более 500 хендлов /handles/ окон в любом приложении Windows). Превышение этих границ вызывает ошибку или послужит причиной странного поведения Windows. 
2. Предел буфера редактирования в 32K для TMemo.

Q:Почему в документации написано, что TMemo может редактировать тексты до 256К, а на деле получается не более 32К?

A:В документации ошибка. 32К - это ограничение Windows. В Windows все стандартные редакторы используют общий буфер в 32К, компонент TMemo использует другую технику, позволяющую каждому TMemo иметь буфер в 32К. В Windows 95 эта проблема решена.

3. Почему компонент TGauge так медленно работает (медленнее, чем VBX BGauge)?

Компонент TGauge - просто пример, и ничего более. В нем отсутствует даже намек на оптимизацию перерисовок. Если вы посмотрите на код процедуры SetProgress, то увидите

Это означает, что как только положение изменилось, весь компонент будет перерисован. Тем не менее, есть пути для того, чтобы сделать компонент более быстрым:
  1. Не присваивать Progress каждый раз (напр. 3000 раз), т.е. делать обновление менее часто
  2. Проверять, действительно ли позиция на экране изменится. Например, в SetProgress сделать следующее:

  3.  

    if Abs(FCurValue-FLastDrawn) >= FDisplayDelta then 
    begin
      Refresh;
      FastDrawn := FCurValue;
    end;

    где FDisplayDelta что-то вроде (FMaxValue-FMinValue) div Width (идеально было-бы учитывать реальный размер экрана.

  1. Обновлять только часть индикатора, которая действительно меняется. Процедура Refresh стирает и перерисовыает весь компонент. Можно сделать вызов InvalidateRect (Windows API) и вызвать Update.
  2. Если вы сделали как в пункте 3, вы дополнительно можете оптимизировать процедуру перерисовки, чтобы не перерисовывать неизменяющийся участок.

Разное



1. Распространение приложений Delphi, использующих Local InterBase.

Для распространения таких приложений, в соответствии с лицензионным соглашением вы должны перенести следующие файлы:

Главные модули (X:\IBLOCAL\BIN)

Сообщения, лицензионные файлы и т.п. (X:\IBLOCAL) Утилиты (если они необходимы) После копирования этих файлов необходимо проделать следующие операции:
  1. Добавить в AUTOEXEC.BAT в команду PATH  X:\IBLOCAL\BIN
  2. Там-же сделать SET INTERBASE=X:\IBLOCAL
  3. В WIN.INI создать секцию

    [Interbase]
    RootDirectory=X:\IBLOCAL

    Естественно, если путь к локальному InterBase отличается от IBLOCAL, то вы должны изменить его на нужный.

Для распространения BDE вы должны передать пользователю две инсталляционные дискеты с редистрибутивным BDE (на CD-ROM каталог REDIST\BDE).

Для установки BDE вручную скопируйте содержимое каталога IDAPI (с подкаталогом языковых драйверов), и создайте в WIN.INI следующие секции:

После этого ненужные файлы (неиспользуемых языковых драйверов, поддержку ODBC ... ) можно удалить с диска, или временно перенести, убедиться в работоспособности приложения, и удалить.

Возникает неясность - как добавить драйвер INTRBASE в IDAPI.CFG? Получается, что его необходимо переносить, и затем настраивать псевдонимы на новые каталоги. Иначе драйвер локального InterBase не попадет в IDAPI.CFG

[Назад][Содержание][Вперед]

 

Hosted by uCoz