Читать «Виртуальная библиотека Delphi» онлайн - страница 96

Unknown

Вы можете добавить следующую функцию в ваш модуль и вызвать, например:

Locate(Table1, Table1LName, 'Beman');

Table1 — компонент TTable, Table1LName — TField, который вы добавили с помощью Fields Editor и 'Beman' - имя, которое вы хотите найти.

23. Как узнать, что изменилась текущая запись?

Событие TDataSource.OnDataChange когда State=dsBrowse.

24. Как считать даты для вычисляемых полей?

При вычислении дат важно удостовериться в том, что все используемые значения подходят по типу. В документации не совсем явно отражен тот факт, что на самом деле тип TDataTime эквивалентен типу Double, который можно использовать далее.

В примере, D1 и D2 (поля в Table1) могут быть типа или Date, или TDateTime, а D3 — поле типа Integer.

procedure TForm1.Table1CalcFields(DataSet: TDataset);

var

  T1, T2: TDateTime;

begin

  Table1D1.AsDateTime := Date+2;

{ or Table1D1.Value := Date+2; }

  Table1D2.AsDateTime := Date-2;

  T1 := Table1D1.AsDateTime;

  T2 := Table1D2.AsDateTime;

  Table1D3.AsInteger := Trunc(Double(T1) - Double(T2));

end;

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

1. Почему возникает ошибка компиляции при обращении к объекту Sender в обработчике события?

Я в обработчике события OnChange для компонента TEdit пытаюсь получить содержимое его текстового буфера. Однако, следующая конструкция вызывает ошибку компиляции 'неизвестный идентификатор':

Caption := Sender.Text;

Если вы рассматривали декларацию, объект Sender имеет тип TObject, который является классом, который наследуется почти всеми остальными объектами. Вы, вероятно, пробуете обращаться к свойству, которое не определено в TObject, вроде Text или Caption. По этой причине, выражение Sender.Text вызовет ошибку, но если (для примера) вы знаете, что Sender имеет тип TEdit, тогда вы можете использовать выражение:

Caption := (Sender as TEdit).Text;

Если вы не уверены, что объект Sender будет всегда иметь данный тип, то рекомендуется предварительно проверить это:

if Sender is TEdit then …

2. Проблемы с полями класса типа TObject, TTable и т.д.

Я объявляю поле класса как TTable, но при обращении к нему происходит ошибка.

Дело в том, что в Delphi все экземпляры объектов, объявленых как class, являются динамическими. Соответственно поле MyTable, объявленное как

type

   TMyClass = class(TObject)

   public

     MyTable: TTable;

     constructor Create;

     destructor Destroy; override;

   end;

является указателем на класс TTable, и должно быть инициализировано в конструкторе вашего объекта и соответственно разрушено в деструкторе следующим образом:

constructor TMyClass.Create;

begin

  MyTable := TTable.Create(nil);

  MyTable.DatabaseName := 'DBDEMOS';