(MySport asTFootball)
чтобы получить доступ к специфическим свойствам из типа TFootball . Однако, если вы ошиблись и на самом деле это экземпляр типа TBasketball , то при обращении к несуществующим свойствам будет возникать ошибка. Оператор isопределяет, принадлежит ли экземпляр объекта к данному классу, либо к классу одного из его предков, и используется для проверки, сработает ли преобразование типов с данным объектом. Если вы имеете переменную MySport типа TSport , и в настоящее время она содержит экземпляр TBasketball , тогда следующие выражения истинны:
(MySport isTSport)
(MySport isTBasketball)
not(MySport isTFootball)
Следует иметь ввиду, что компилятор разрешает использовать данные конструкции только для выполнения преобразования типов, связанных родственными отношениями. Так, конструкция (Button1 asTEdit) (переменная Button1 имеет тип TButton ) вызовет ошибку компиляции, так как ни при каких условиях не может быть выполнено преобразование типов от TButton к TEdit или наоборот. Комбинация двух операторов может привести к выражению типа следующего :
functionPlayerGoodness( varMySport: TSport): Integer;
begin
if(MySport isTBasketball) then
Result := (MySport asTBasketball).ReboundShots
else if(MySport isTFootball) then
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 .
Читать дальше