Советы по Delphi

         

FAQ 4, IDE


  1. Где мне получить дополнительную информацию о Delphi?

Теперь доступны для скачивания из библиотеки "From Borland" следующие инфорационные файлы о Delphi: DELBKS.TXT -=> Delphi BookList (список книг о Delphi) DEL_FS.ZIP -=> Delphi Fact Sheet (страница фактов) DEL_ QI.ZIP -=> Delphi Quick Info Sheet (страница краткой информации)

  • Как мне привязать кнопку к нижней границе окна так, чтобы при изменении их размеров расстояние между ней и нижней границей окна не изменялось?
  • Создайте TPanel, установите свойство alignment в bottom и расположите на ней вашу кнопку. Если вы не хотите, чтобы панель была видимой на форме, сбросьте флаг ctl3d, установите bevels в none и parentcolor = true.

  • Как мне добавить "Help Break" в главное меню с выравниванием по правому краю?
  • Вы не можете это сделать во время проектирования. Чтобы сделать это во время выполнения программы, добавьте следующую строку в обработчик события формы OnCreate:

        Help1.Caption := #8 + Help1.Caption;



    Примечание: С недавних пор это не рекомендуется Microsoft, а в Windows 95 не работает вовсе.

  • Что мне нужно прочесть/купить, чтобы узнать о скрытых "методах"?
  • Электронная справка по теме создания компонентов (Component Writer's Help) содержит более глубокие сведения, кроме того, вы можете купить исходный код VCL и изучить это "в подлиннике".

  • Как мне грамотно осуществить выравнивание чисел с десятичной точкой? 0.50 10.55 245.98 В объекте TEdit включите возможность редактирования нескольких строк и установите стиль равным es_Right. В случае TDBEdits, вы можете добавить поля к вашей форме и задать соответствующие значения свойствам Alignment и DisplayFormat.
  • Как мне задать порядок обхода элементов управления клавишей Tab?
  • Выберите на форме необходимые компоненты и воспользуйтесь пунктом меню Edit | Tab Order.

  • Как мне убедить Windows, что программа, написанная в VB, является хранителем экрана?
    1. Поместите следующую строчку в исходном коде проекта (Project Source):
          {$D SCRNS AVE:NameOfScreenSaver}

  • Скомпилите проект
  • Переименуйте .EXE в .SCR и поместите в каталог Windows.
  • Для корректной работы хранителя экрана необходимо в обработчиках событий OnClick и OnKeyUp вызывать метод Close. В ответ на событие OnMouseMove необходимо осуществить проверку, и, если оно возникло НЕ первый раз, необходимо также вызвать метод Close.

        CONST FirstTime : Boolean = True; begin IF NOT FirstTime THEN Close;

  • Как мне обойти ошибку Stream Read Error?
  • Попробуйте удалить *.DSM-файл и перекомпилить ваш проект.

  • Возможно ли создание глобальных переменных в Delphi?
  • Откройте новый модуль и объявите необходимые вам глобальные структуры в секции interface (секция implementation должна оставаться пустой). Добавьте имя данного модуля в список USES тех модулей, для которых необходимо получить доступ к объявленным глобальным переменным.

  • Почему при закрытии окна модуля (pas) также закрывается и окно с формой?
  • Потому что Delphi должен работать с кодом при манипуляциях с формой. Delphi постоянно следит за тем, что вы делаете и изменяет код для отражения изменений на форме.

  • Когда я компилю код с использованием модуля WinPrn, Delphi говорит, что не может найти WinPrn.DCU.
  • Добавьте \DELPHI\SOURCE\RTL70 к путям поиска вашего проекта.

  • Как мне разместить форму в центре экрана?
  • Используйте вместо оператора "/" оператор "div":

        MyLeft := (Screen.Left - Form1.Left) div 2;

    Или присвойте свойству Position вашей формы значение poScreenCenter.

  • Если я компилирую мой BP7-проект в Delphi, могу ли я использовать с ним интегрированный отладчик? Если так, то как мне указать Delphi, какой файл у меня является первичным? А если у меня нет ни одной формы?
  • Да, вы можете воспользоваться встроенным дебаггером. Первичный файл - файл с расширением *.PAS, который вы открывали как проект. Выберите "Open Project", измените тип файла с *.DPR на *.PAS и затем выберите программу BP7, которую вы хотите компилить.

  • Как при добавлении новых элементов (listBoxName.items.add('xxx')), делать их видимыми? Поясняю: если общее число элементов превышает их видимое количество, появляется полоса прокрутки, и новые пункты добавляются в нижнюю, невидимую часть списка. Я хотел бы перемещать список "наверх", чтобы был виден самый последний, нижний пункт.
  • Попробуйте установить:

        listBoxName.items.add('xxx') listBoxName.itemIndex := (listBoxName.items.count-1)

  • Существует у компонента ListBox свойство, позволяющее выровнять текст по правому краю?
  • Нет. Попробуйте заполнить строку пробелами.

  • Что обозначает сообщение отладчика "Debugger Is Unable To Stop Due To 'Hard Mode'"? (отладчик не в состоянии остановиться из-за Hard Mode - дословно "Тяжелый Режим").
  • ОПРЕДЕЛЕНИЕ: Hard mode - это такое состояние Windows, когда невозможна никакая обработка сообщений. Это происходит при отрисовке меню и некоторых операциях ядра. Это означает такое состояние, когда Delphi не может "заморозить" ваше приложение, не блокируя Windows. Обычно это возникает при большом числе вызовов SendMessage. Как можно выйти из режима Hard mode: необходимо сильно "встряхнуть", ударить систему. Например, вполне достаточно вывести системное модальное окно, сообщающее о текущем режиме Hard mode! Коротко: установите дополнительную точку останова на строке *перед* той, которая сообщает системе о переходе в режим Hard. Вызов системного модального диалога обычно заставляет систему выйти из этого режима, после чего вторая точка останова сработает как обычно. Изложенный способ носит название "Маневр Мебиуса".
    Примечание: Поскольку отладчик управляется сообщениями, он не может позволить вам остановить его в точке останова, если он думает что система находится в Hard mode, и если вы не предпримете в этой ситуации попытки выйти из Hard mode, система может зависнуть.

  • Возможно ли загрузить BP-программу (или как проект, или как программу) в IDE и скомпилить ее?
  • Да, возможно, но необходима небольшая квалифицированная подсказка. Если быть более точным, в Delphi можно загрузить BPW-программу. Выберите пункт меню Open Project или соответствующую кнопку на панели управления и в выпадающем списке типов файлов выберите *.PAS files. Это позволит загрузить BPW *.PAS-программы. Не забудьте добавить \DELPHI\SOURCE\RTL70 в пути поиска вашего проекта.

  • Почему простейшие EXE-файлы имеют такой большой размер (одна форма с одной кнопкой 200K)?
  • Delphi VCL основаны на RTTI и исключениях. Это уже "отбирает" примерно 120Kb от 'пустого' приложения. 200K вы получаете за счет добавочной информации или неоптимизированного компилятором кода. Обратите внимание на тот факт, что при добавлении второй кнопки размер вашего EXE-файла будет не 400K, а всего навсего 201K, т.е. после необходимого кода располагаются "обычные данные/код" с типичными (ожидаемыми) размерами. Вы можете немного уменьшить размер EXE, отмечая пукнт "Optimize For Size And Load Time" на странице "Linker" в диалоге OPTIONS|PROJECT.

  • Могу ли я воспользоваться вторым монитором для контроля выходных данных BP-программы?
  • Для использования двух мониторов необходимо, чтобы один из них был MDА-монитором (старый черно-белый стиль Hercules), а другой монитором стандарта VGA (или EGA, и т.п.). Они должны использовать два адресных пространства: $B000 для MDA и $B800 для VGA. После установки обоих мониторов можно сообщить BP IDE о наличии второго монитора в Options/Environment/StartUp. Монитор по умолчанию, стартующий BP IDE, будет отображать поток выходных данных программы.
    ПРИМЕЧАНИЕ: после установки карты Hercules, ваша VGA карта будет доступна только как 8-битная. DELPHI данную характеристику не поддерживает.

  • Каким способом можно сообщить активному дочернему MDI окну о том, что была нажата кнопка "Сохранить" на панели управления родительского окна? Вызов TEditForm.Save1click не работает.
  • Попробуйте:

        with  Application.MainForm. ActiveMDIChild as TEditForm do Save1Click(Sender);

    Или это:

        if  ActiveMDIChild is TEditForm do TEditForm( ActiveMDIChild).Save1Click(Sender);

  • Почему, если в компоненте ComboBox свойству 'Style' присвоить значение 'csDropDownList', то следующая строка ничего не делает?
  •     combobox1.text := 'Здесь происходит что-то странное!';

    Это стандартное поведение выпадающего списка Windows при заданном стиле DropDownList. Идея этого стиля в том, что выводимый текст должен совпадать с одним из элементов списка. В этом случае правильным будет выбор одного из элементов:

        combobox1.ItemIndex:=0; {предположим combobox1.Item[0] = 'Здесь происходит что-то странное!'}

  • Поле редактирования автоматически отрабатывает CTRL-C, CTRL-X, CTRL-Y и CTRL-Z соответственно для копирования, вырезания, вставки и отката. Как мне показать эти опции в главном меню и, самое главное, связать с надлежащими действиями?
  • Попробуйте следующие обработчики событий:

        procedure TStaffSearch.SpeedButtonCutToClipBoardClick(Sender: TObject); begin if ((  ActiveControl ) is TCustomEdit ) then TEdit( ActiveControl).CutToClipBoard; end; procedure TStaffSearch.Delete1Click(Sender: TObject); begin if (( ActiveControl ) is TCustomEdit ) then TEdit( ActiveControl).ClearSelection; end;

    В обоих случаях вы должны определять какой элемент управления активен в настоящий момент и вызывать соответствующий случаю метод. Все элементы управления, позволяющие редактировать текст, являются наследниками TCustomEdit. Приведенный выше код определяет, является ли активный элемент наследником TCustomEdit, и, если да, вызывает соответствующий метод.

  • Какую информацию показывает Инспектор Объектов?
  • Инспектор Объектов (Object Inspector) отображает все опубликованные (published) свойства класса/объекта, и служит как для просмотра значений свойств, так и для их изменения. Инспектор Объектов не показывает методы класса.

  • В чем разница между "SetKey / GoToKey" и "FindKey"? Как определить, когда следует использовать одно вместо другого?
  • Функционально разницы нет никакой. SetKey + некоторые возможности для работы с IndexFields + GotoKey эквивалентен простому FindKey. Если IndexFields для вас чрезвычайно сложен, программируйте с помощью последовательности SetKey.

  • Если какой-нибудь способ узнать о свойстве кнопок TDBNavigator (enabled/disabled)?
  • Попробуйте:

        type TDBNavCracker = class(TDBnavigator); ... if TDBNavCracker(DBNavigator1).Buttons[nbEdit].Enabled then...;

  • Могу ли я использовать более старые версии SQL Links с теми ID API, которые входят в поставку Delphi?
  • Нет, для старых SQL links вы найдете обновления в редакции Delphi Client/Server, или можете получить это отдельно: Delphi + новые SQL Links.

  • Как в Delphi осуществить обработку ошибок времени выполнения?
  • При возникновении ошибки времени выполнения, Delphi генерирует исключение (или, правильнее сказать, создает объект исключительной ситуации). Если отмечена соответствующая опция в настройках среды, исключения будут перехватываться во время выполнения программы из-под Delphi, и Delphi будет перемещать курсор к строке, вызвавшей исключительную ситуацию. Тем не менее, программа при этом не завершает свою работу. Напротив, при возникновении исключительной ситуации программа не сможет окончить свою работу в автоматической режиме, что связано с возможностью поработать с программой в "предсмертном" режиме и найти источник ошибки.

  • Как храняться в Delphi код/формы?
  • Формы храняться в файлах DFM (в бинарном виде), но если вы откроете его (FILE|OPEN FILE) в редакторе IDE как текст, то сможете редактировать его непосредственно.

  • Может ли TMediaPlayer в Delphi проигрывать avi-файлы?
  • Delphi умеет воспроизводить с помощью TMediaPlayer avi-файлы, необходимо всего лишь установить тип файла, его имя, разместить компонент на TPanel и использовать метод open. Для воспроизведения AVI-файлов необходима обновленная версия "Video for Windows", установленная в вашей системе. При выполнении этих условий воспроизведение файлов AVI будет столь же легким, как и воспроизведение файлов WAV. Присвойте типу устройства AutoSelect, поместите компонент на панельку, задайте имя AVI-файла и воспроизведите его. Анимация появится в отдельном небольшом окошке.

  • Как сделать так, чтобы при вводе пароля в поле редактирования присутствовал эффект 'No Echo'?
  • Вам необходимо определить, какой символ (например, *) необходимо отображать при вводе пароля, и назначить его свойству Password в компоненте TEdit. Если вам не нужны символы при вводе, используйте символ пробела, #32. [000581]



    Содержание раздела