Виртуальная библиотека Delphi
- Название:Виртуальная библиотека Delphi
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Виртуальная библиотека Delphi краткое содержание
Виртуальная библиотека Delphi - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Result := (MySport asTFootball).TotalYardage;
end;
Также, базовый класс TObject имеет набор методов, которые возвращают информацию, созданную компилятором в момент компиляции текста для поддержки RTTI. Hапример, метод TObject.ClassName возвращает имя класса любого объекта, наследованного от TObject . Hапример, TButton.ClassName вернет значение 'TButton' .
2. Как работает обработка исключительных ситуаций в Delphi?
Основная структура выглядит примерно так:
P := New(BigThing);
try
try
Proc1(P);
Proc2(P);
except
Handle(P);
raise;
end;
finally
Dispose(P);
end;
Первая строка распределяет большой блок памяти. Затем, в блоке try, выполняется несколько операторов, каждый из которых может вызвать ошибку, или, другими словами, "вызвать исключительную ситуацию". Если возникает ошибка, оставшаяся часть блока tryпропускается, и выполняются блоки exceptи finally. Если ошибок нет, то после выполнения всех операторов в блоке tryвыполнится блок finally. В любом случае, блок памяти будет освобожден. Блок try … finallyловит все, включая Windows GPF или Access Violation. Обратите внимание на вызов raiseв блоке try … except. Он снова вызывает исключительную ситуацию, которая вызовет сообщение об ошибке после того, когда закончится блок finally. Если не вызвать raise, то считается, что вы обработали исключительную ситуацию самостоятельно в пределах блока except.
3. Есть ли простой способ перехватить exception?
Создайте метод для формы, перехватывающий исключения. Этот метод будет вызываться обработчиком OnException объекта Application . В вашем методе проверьте, тот ли это исключение, что вы ожидаете, например EDatabaseError . Почитайте on-line help для события OnException . Там есть информация, как вызвать собственный метод для события.
procedureTForm1.MyExcept(Sender: TObject; E: Exception);
begin
ifE isEDatabaseError thenMessageDlg('Поймали exception', mtInformation, [mbOk], 0)
{ это не то, сделать raise }
else raiseE;
end;
procedureTForm1.FormCreate(Sender: TObject);
begin
Application.OnException := MyExcept;
{ здесь вы указываете, что событие OnException выполнит ваш метод }
end;
4. Delphi используют строки в стиле Pascal или C?

И те и другие. Delphi имеет два различных набора функций манипулирования строками, один - для PChar ; но в Delphi также есть функция MessageDlg , которая принимает строки типа Pascal.
Delphi 2.0 добавляет так называемые длинные строки ( AnsiString ), которыми можно манипулировать как обычными строками в Pascal, но они имеют динамически изменяющийся размер и могут быть размером до 4Гбайт. Можно выполнять преобразования от PChar к AnsiString и наоборот. Старый строковый тип теперь называется ShortString . По умолчанию кличевое слово stringсоответствует типу AnsiString .
5. Есть ли в Delphi битовые множества?
В явном виде битовых множеств в языке Object Pascal нет. Но вместо этого можно использовать обычные множества, которые на самом деле и хранятся как битовые. Если множество вам нужно для проверки, установлен ли какой то бит в слове (байте и т.д.) можно попробовать такую конструкцию:
type
PByteSet = ^TByteSet;
TByteSet = set ofByte;
var
W: Word;
...
{ если бит 3 в слове W установлен, тогда ... }
if3 inPByteSet(@W)^ then...
...

В Delphi 2.0 есть специальный класс TBitSet , который ведет себя как битовое множество.Для Delphi 1.0 вы можете написать такой класс самостоятельно.
6. Проблема с числом типа Single в DLL.

Я написал на C++ DLL, в которой у меня функция использует число типа float, передал из Delphi число типа Single и получил GPF 'Invalid Opcode'. Что неправильно?

Если вы используете числа с плавающей точкой, лучше передавать их не по значению, а по ссылке (указатель в C++). Вероятно DLL написана на MS Visual C++, так как Microsoft и Borland используют разные соглашения о передаче параметров при работе с сопроцессором. В случае Borland C++ и Delphi должны использовать одинаковый способ передачи параметров и значений (через стек сопроцессора). В любом случае вместо Single лучше использовать Double ( doubleили long floatв C++), так как вообще говоря, реальный тип, который соответствует типу Single точно не определен и может измениться в будущем.
7. Как заставить приложение Delphi отвечать на сообщения Windows?
Используем сообщение WM_WININICHANGED в качестве примера. Объявление метода в TForm позволит вам обрабатывать сообщение WM_WININICHANGED :
procedureWMWinIniChange( varMessage: TMessage); messageWM_WININICHANGE;
Код в implementationможет выглядеть так:
procedureTForm1.WMWinIniChange( varMessage: TMessage);
begin
inherited;
{ ... ваша реакция на событие ... }
end;
Вызов inheritedметода очень важен. Обратите внимание также на то, что для функций, объявленных с директивой message(обработчиков событий Windows) после inheritedнет имени наследуемой процедуры, потому что она может быть неизвестна или вообще отсутствовать (в этом случае вы в действительности вызываете процедуру DefaultHandler).
8. Как обработать события от других приложений?
Попробуйте сделать это следующим образом:
type
TForm1 = class(TForm)
...
private
procedureWMNCActivate( varMsg: TMessage); messageWM_NCACTIVATE;
end;
procedureTForm1.WMNCActivate( varMsg: TMessage);
begin
{ здесь обработка принятых событий }
end;
9. Как перехватить сообщения Windows и обработать их перед тем, как выполнится строка Application.Run?
Пример проекта показывает, как получить сообщения Windows в данном случае. Это редкий случай, в большинстве случаев переопределение процедуры Application.OnMessage будет делать то же самое.
programProject1;
uses
Forms,
Unit1 in 'UNIT1.PAS' { Form1 } ,
Messages, WinTypes, WinProcs,
{$R *.RES}
var
OldWndProc: TFarProc;
functionNewWndProc(hWndAppl: HWnd; Msg, wParam: Word; lParam: Longint): Longint; export;
Интервал:
Закладка: