2014-02-10 3 views
5

Предположим, у меня есть набор данных dsSample в приложении Delphi. Для чтения или записи данных в наборе данных необходимо открыть набор данных. Я просто хотел бы знать, в чем разница между следующими утверждениями:Открытие и закрытие наборов данных в Delphi

dsSample.Open; 
dsSample.Active := True; 

and 

dsSample.Close; 
dsSample.Active := False; 

Если Open и Active выполняют ту же операцию, почему два различных ключевых слов для открытия и закрытия наборов данных в Delphi?

+7

Не имея свойства 'Active', вы не сможете открыть набор данных во время разработки, потому что вы не можете публиковать метод в Object Inspector. Это мое мнение. – TLama

+0

@TLama - Итак, это значит, Open предназначен для открытия набора данных во время выполнения и Active для времени разработки? –

+2

Я видел их как в коде. Я просто думаю, что «Актив» был разработан позже, и для контроля времени разработки. Я лично использую его так, так как если вы найдете строку с надписью «Открыть» или «Закрыть» в коде, это гораздо более читаемо, чем оценка того, что назначено свойству «Актив». Но это вопрос вкуса ... – TLama

ответ

6

Использовать либо как здесь мало различий, метод DataSet.Open имеет одну строку кода: Active := True. Активно - это свойство, которое будет называть SetActive или GetActive.Выяснение этих вещей довольно прямолинейно, если вы удерживаете CTRL и нажмите на Open или Active и прочитайте код в источнике VCL, зная, что некоторые из внутренних компонентов VCL прекратят делать такие вещи, как:

if not DataSet.Active then 
    DataSet.Open; 

, а не просто

DataSet.Open; 

Как указано TLama, Active опубликованный свойство делает его доступным для Delphi IDE, что позволяет переключать его во время разработки для DataSets по формам или Datamodules. Open и Close, вероятно, не являются строго обязательными, но являются довольно распространенным образцом на многих языках.

+1

Еще одна вещь, которую стоит упомянуть: 'Active' _can_ использовать для определения того, что набор данных открыт. Очевидно, что его нельзя использовать, как в примере, который вы предоставляете. Но могут быть и другие причины, по которым вы хотите подтвердить, активен ли набор данных, прежде чем делать что-то еще. –

1

TDataset.Open является процедурой так что вы не можете получить набора данных заполняются данными или не

procedure TDataSet.Open; 
begin 
    Active := True; 
end; 

Активный является собственностью:

Использования Активной для определения или задайте, заполняется ли набор данных данными. Когда Active имеет значение false, набор данных закрывается; набор данных не может читать или писать данные, а элементы управления, основанные на данных, не могут использовать его для извлечения данных или редактирования. Когда Active имеет значение true, набор данных может быть заполнен данными. Он может считывать данные из базы данных или другого источника (например, поставщика). В зависимости от свойства CanModify, активные наборы данных могут публиковать изменения. Установка активна в true:

  1. Производит событие BeforeOpen.
  2. Устанавливает состояние набора данных в dsBrowse.
  3. Устанавливает способ получения данных (обычно путем открытия курсора).
  4. Создает событие AfterOpen.

Если при открытии набора данных возникает ошибка, состояние набора данных устанавливается на dsInactive, и любой курсор закрыт. Настройка Active на false:

  1. Запускает событие BeforeClose.
  2. Устанавливает свойство State для dsInactive.
  3. Закрывает курсор.
  4. Запускает событие AfterClose.

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

Примечание: Вызов набора методов Open Активно в true; вызов метода Close принимает значение Active в false.

+1

Я думаю, что ОП знает, как это работает. Этот вопрос связан скорее с тем, почему существуют два способа открытия и закрытия наборов данных. – TLama

+0

Я объяснил в первой строке TDataset.Open - это процедура, поэтому вы не можете получить набор данных, заполненный данными или нет, но активным является свойство ... –

+1

За исключением того, что чтение свойства 'Active' говорит вам ** ничего ** о заполняется ли набор данных данными. Набор данных может быть активным с 0 записями. –

Смежные вопросы