29. Как установить формат для поля таблицы?
В Fields Editor выберите поле для форматирования. Используя свойства DisplayFormat
и EditFormat сделайте то, что нужно. DisplayFormat работает для поля, на которое не установлен фокус. EditFormat работает для поля, на которое фокус установлен. Форматирование аналогично первому параметру в функции FormatFloat, но без скобок.
30. Можно ли использовать клавишу ENTER при вводе данных для перехода от поля к полю?
Используйте данный код для события OnKeyPress
компонента TEdit. procedure
TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin
if
Key = #13 then begin
SelectNext(Sender as
TWinControl, True, True); Key := #0
; end
; end
; Теперь Enter ведет себя как Tab. Затем, выберите все объекты, которые должны вести себя как Edit1
(за исключением кнопок) и в Object Inspector установите обработчик OnKeyPress в Edit1KeyPress. Каждый выбранный вами объект воспринимает Enter как Tab. Если вы хотите обрабатывать событие на уровне формы (а не в каждом отдельном компоненте), уберите обработчики события у всех компонент и создайте FormKeyPress — обработчик OnKeyPress для формы: procedure
TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin
if
Key = #13 then begin
SelectNext(Sender as
TWinControl, True, True); Key := #0
; end
; end
; Все объекты на форме будут воспринимать Enter как Tab.
Общие вопросы по Delphi и данному FAQ (часть 3)
Object Pascal и Windows API
1. Как работает информация времени выполнения (RTTI)?
Имеются два новых оператора: as
и is. as — оператор защищенного преобразования типов (typecasting). Вы можете использовать его, чтобы заставить компилятор преобразовать объект из одного типа в другой, но, если в во время выполнения эти типы окажутся несовместимыми, то вы получите ошибку. Hапример, если вы имеете класс TSport, с потомоками TBasketball и TFootball, вам может потребоваться переменная типа TSport; далее может так случиться, что в программе эта переменная будет фактически содержать экземпляр типа TFootball. Тогда вы можете обратиться к этой переменной (MySport as
TFootball) чтобы получить доступ к специфическим свойствам из типа TFootball
. Однако, если вы ошиблись и на самом деле это экземпляр типа TBasketball, то при обращении к несуществующим свойствам будет возникать ошибка. Оператор is определяет, принадлежит ли экземпляр объекта к данному классу, либо к классу одного из его предков, и используется для проверки, сработает ли преобразование типов с данным объектом. Если вы имеете переменную MySport типа TSport, и в настоящее время она содержит экземпляр TBasketball, тогда следующие выражения истинны: (MySport is
TSport) (MySport is
TBasketball) not
(MySport is TFootball) Следует иметь ввиду, что компилятор разрешает использовать данные конструкции только для выполнения преобразования типов, связанных родственными отношениями. Так, конструкция (Button1 as
TEdit) (переменная Button1 имеет тип TButton) вызовет ошибку компиляции, так как ни при каких условиях не может быть выполнено преобразование типов от TButton к TEdit или наоборот. Комбинация двух операторов может привести к выражению типа следующего : function
PlayerGoodness(var MySport: TSport): Integer; begin
if
(MySport is TBasketball) then Result := (MySport as
TBasketball).ReboundShots else if
(MySport is TFootball) then Result := (MySport as
TFootball).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
;