Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка СВП (5-8).doc
Скачиваний:
2
Добавлен:
25.08.2019
Размер:
343.55 Кб
Скачать

2.5. Поля

В большинстве случаев, когда Вы хотите получить доступ из программы к индивидуальным полям записи, Вы можете использовать одно из следующих свойств или методов, каждый из которых принадлежит TDataSet:

property Fields[Index: Integer];

function FieldByName(const FieldName: string): TField;

property FieldCount;

Свойство FieldCount возвращает число полей в текущей структуре записи. Если Вы хотите программным путем прочитать имена полей, то используйте свойство Fields для доступа к ним:

var

S: String;

begin

S := Fields[0].FieldName;

end;

Если Вы работали с записью в которой первое поле называется Sht_faktura, тогда код, показанный выше поместит строку “ Sht_faktura ” в переменную S. Если Вы хотите получить доступ к имени второго поля в вышеупомянутом примере, тогда Вы могли бы написать:

S := Fields[1].FieldName;

Короче говоря, индекс, передаваемый в Fields (начинающийся с нуля), и определяет номер поля, к которому Вы получите доступ, т.е. первое поле - ноль, второе - один и так далее.

Если Вы хотите прочитать текущее содержание конкретного поля конкретной записи, то Вы можете использовать свойство Fields или метод FieldsByName. Для того, чтобы найти значение первого поля записи, прочитайте первый элемент массива Fields:

S := Fields[3].AsString;

Если хотите, Вы можете использовать функцию FieldsByName вместо свойства Fields:

S := FieldsByName(‘Pokupatel’).AsString;

Как показано в примерах выше, и FieldsByName, и Fields возвращают те же самые данные. Два различных синтаксиса используются исключительно для того, чтобы обеспечить программистов гибким и удобным набором инструментов для программного доступа к содержимому DataSet.

Давайте посмотрим на простом примере как можно использовать доступ к полям таблицы во время выполнения программы. Создайте новый проект, перетащите на форму компоненты DataSource, TTable, два объекта ListBox и две кнопки - “Fields” и “Values” (см. рис. 1.5).

Сделайте Double click на кнопке «Поля» и создайте метод, который выглядит так:

procedure TForm1.FieldsClick(Sender: TObject);

var

i: Integer;

begin

ListBox1.Clear;

for i := 0 to Table1.FieldCount - 1 do

ListBox1.Items.Add(Table1.Fields[i].FieldName);

end;

Рис. 1.5. Программа, показывающая как использовать свойство Fields

Обработчик события начинается с очистки первого ListBox1, затем он проходит через все поля, добавляя их имена один за другим в ListBox1. Заметьте, что цикл, показанный здесь пробегает от 0 до FieldCount - 1. Если Вы забудете вычесть единицу из FieldCount, то Вы получите ошибку “List Index Out of Bounds”, так как Вы будете пытаться прочесть имя поля, которое не существует.

В Delphi существуют и другие средства, которые позволяют Вам получить ту же самую информацию, но это самый простой способ доступа к именам полей в Run Time.

Свойство Fields позволяет Вам получить доступ не только именам полей записи, но также и к содержимому полей. В нашем примере для второй кнопки напишем:

procedure TForm1.ValuesClick(Sender: TObject);

var

i: Integer;

begin

ListBox2.Clear;

for i := 0 to Table1.FieldCount - 1 do

ListBox2.Items.Add(Table1.Fields[i].AsString);

end;

Этот код добавляет содержимое каждого из полей во второй listbox. Обратите внимание, что вновь счетчик изменяется от нуля до FieldCount - 1.

Свойство Fields позволяет Вам выбрать тип результата, написав Fields[N].AsString. Этот и несколько связанных методов обеспечивают простой и гибкий способ доступа к данным, связанным с конкретным полем. Вот список доступных методов, который Вы можете найти в описании класса TField:

property AsBoolean

property AsFloat

property AsInteger

property AsString

property AsDateTime

Всякий раз (когда это имеет смысл) Delphi сможет сделать преобразования. Например, Delphi может преобразовывать поле Boolean к Integer или Float, или поле Integer к String. Но не будет преобразовывать String к Integer, хотя и может преобразовывать Float к Integer. Если Вы хотите работать с полями Date или DateTime, то можете использовать AsString и AsFloat для доступа к ним.

Как было объяснено выше, свойство FieldByName позволяет Вам получить доступ к содержимому определенного поля, просто указав имя этого поля:

S := Table1.FieldByName(‘Pokupatel’).AsString;

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

Наше приложение выглядит, конечно, очень плохо. Шапка таблицы содержит непонятные пользователю имена полей, а надо, чтобы были написаны нормальные заголовки по-русски. Для редактирования отдельных полей служит Редактор Полей. Вызвать его проще всего двойным щелчком на компоненте Table1. Сначала вы увидите пустое поле этого редактора (рис. 1.6,а). Щелкните на нем правой кнопкой мыши и из всплывающего меню выберите раздел Add fields... (добавить поля). Вы увидите окно, изображенное на рис. 1.6,б, в котором содержится список всех полей таблицы. Выберите из него курсором мыши интересующие поля. Если вы при этом будете держать нажатой клавишу Ctrl, то может выделить любую комбинацию полей. Однако имейте в виду, что только к тем полям, которые вы добавите, вы сможете в дальнейшем обращаться. Так что в данном случае вам имеет смысл выделить все поля. Выделив поля, щелкните на ОК, и вы вернетесь к основному окну Редактору Полей, но в нем уже будет содержаться список добавленных полей (рис. 1.6, в).

Эти поля будут соответствовать колонкам таблицы. Изменить последовательность их расположения можно, перетащив мышью идентификатор какого-то поля на нужное место.

Выделите в списке какое-то поле и посмотрите его свойства в Инспекторе Объектов. Вы увидите, что каждое поле - это объект, причем его класс зависит от типа поля: TStringField, TSmallintField, TBooIeanFicld и т.п. Все эти классы являются производными от TField — базового класса полей. Таким образом, каждое поле является объектом и обладает множеством свойств. Рассмотрим основные из них, которые чаще всего необходимо задавать.

а) б)

в)

Рис. 1.6. Редактор полей: исходное состояние (а), окно выбора (б), состояние после выбора (в).

Свойство Alignment определяет выравнивание отображаемого текста внутри солонки таблицы: влево, вправо или по центру.

Свойство DisplayLabel соответствует заголовку столбца данного поля. Например, для поля Sht_faktura значение DisplayLabel можно задать равным «Счет-фактура», для “Pokupatel” — «Покупатель» и т.д.

Свойство DisplayWidth определяет ширину колонки — число символов.

Рис. 1.7. Приложение с установленными свойствами полей

Свойства EditMask для строк и EditFormat для чисел определяют форматы дображения данных.

Свойство ReadOnly, установленное в true, запрещает пользователю вводить в данное поле значения. Свойство Visible определяет, будет ли видно пользователю соответствующее поле.

После установки всех необходимых свойств приложение уже приобретает при­емлемый вид (рис. 1.7).