Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Перемещение по записям набора данных

Поиск

Перемещение по НД заключается в управлении указателем текущей записи (курсором). Этот указатель определяет запись, с которой будут выполняться какие-либо операции.

Перед перемещением указателя текущей записи НД автоматически переводится в режим просмотра.

Для перемещения указателя текущей записи используются методы:

Процедура First – установка курсора на первую запись НД;

Процедура Next – на следующую запись;

Процедура Last – на последнюю запись;

Процедура Prior – на предыдущую запись;

Функция MoveBy (n:integer): integer – перемещение на число запсией, указанных в параметре n

n>0 – перемещение вперед;

n<0 – назад;

n=0 – нет перемещения. Результат функции – число записей, на которое переместился указатель.

 

Практическая работа

Перемещение по записям НД с помощью кнопок.

Расположить на форме следующие компоненты:

 

Компонент SpinEdit (п. к. Samples) – редактор числа, обеспечивающий отображение и редактирование целого числа с возможностью его изменения с помощью двойной кнопки.

Для компонента Label1 в свойстве Caption оставьте пустую строку.

При помощи рассмотренных методов напишите процедуру для кнопки «Перваязапись»:

procedure TForm1.Button1Click (Sender: TObject);

Begin

Table1.First;

end;

Процедуры для кнопок «Следующая запись», «Предыдущая запись», «Последняя запись» напишите самостоятельно.

Для перемещения указателя на произвольное число записей используется счетчик SpinEdit1, в поле которого вводится это число. Для кнопки «Перемещение на…записей» напишите процедуру:

procedure TForm1.Button5Click (Sender: TObject);

Begin

Table1.MoveBy (SpinEdit1.Value);

end;

Напишите обработчик события OnAfterScroll для компонента Table1. После выполнения события OnAfterScroll информация о текущей записи обновляется сразу после перемещения текущего указателя. Это событие происходит и при открытии НД, когда указатель текущей записи устанавливается на первую запись.

 

procedure TForm1.Table1AfterScroll (DataSet: TDataSet);

Begin

label1.Caption:='Запись номер '+IntToStr(Table1.RecNo);

SpinEdit1.MinValue:= 1-Table1.RecNo;

SpinEdit1.MaxValue:= Table1.RecordCount-Table1.RecNo;

end;

 

Доступ к полям

Каждое поле НД представляет собой отдельный столбец, для работы с которым в Delphi служат:

объект Field: TField;

объекты: TIntegerField,: TFloatField, TStringField (производные от TField).

Объекты типа TField являются невизуальными и служат для доступа к данным соответствующих полей записей. Управляя объектами типа TField, можно управлять поведением полей, при этом все объекты полей являются независимыми друг от друга. Например, можно запретить модификацию значения отдельного поля, несмотря на то, что НД в целом является модифицируемым и допускает изменение значений других полей. Кроме того, можно скрыть то или иное поле от пользователя, сделав его невидимым.

Для доступа к объектам TField и, соответственно, к полям записей НД имеет соответствующие методы и свойства.

Свойство FieldCount: nteger указывает количество полей НД. Количество полей НД может отличаться от физического числа полей таблицы БД, поскольку в НД не обязательно включаются все поля таблицы.

Свойство Fields[Index:Integer]: TField – возвращает содержимое указанного в параметре Index поля НД.

К отдельному полю можно обратиться, указав его номер Index в массиве Fields. Номера полей изменяются от 0 до FieldCount-1.

 

Пример.

Edit1.Text:=Table1.Fields[5].AsString; – в компонент Edit1 появится та информация, которая находится в шестом поле НД.

Свойства объекта Field – AsString, AsInteger, AsFloat, AsBoolean позволяют обращаться к значению поля текущей записи как к строковому, целочисленному, вещественному или логическому значению.

Чтобы обращаться к какому-либо полю НД не по его номеру в массиве полей, а по его имени существуют методы FindField и FieldByName.

Функция FindField (const FieldName: String): TField возвращает для НД поле, имя которого указано в параметре FieldName. Имя поля, определяемое параметром FieldName, является именем физического поля таблицы БД, заданным при создании таблицы. Если заданное параметром FieldName поле не найдено, то функция FindField возвращает значение Nil. На практике часто используется метод FieldByName, который отличается от метода FindField тем, что если заданное поле не найдено, то генерируется исключительная ситуация.

Свойство Fields и методы FindField и FieldByName наиболее часто используются для доступа к значению поля текущей записи совместно с такими свойствами объекта Field, как AsString, AsInteger, AsFloat или AsBoolean, которые соответственно позволяют обращаться к значению поля как строковому, целочисленному, вещественному или логическому значению.

 

Практическая работа

Вывести в компонент ListBox1 содержимое всех полей текущей записи (начиная с первого).

Расположите на форме компоненты в соответствии с рисунком:

Напишите обработчик события OnClick для кнопки:

procedure TForm1.Button1Click (Sender: TObject);

var n:integer;

Begin

for n:=0 to table1.FieldCount-1 do

ListBox1.Items.Add (table1.Fields [n].AsString);

end;

После этого запустите программу и щелкните по кнопке на форме. В ListBox вы увидите список содержимого полей текущей записи набора данных. Содержимое каждого поля интерпретируется как строковое значение и добавляется к списку ListBox.

 

Самостоятельно выполните следующие задания:

1. Вывести в компонент ListBox1 содержимое всех полей текущей записи (начиная с последнего).

2. Использую общую схему обработки всех записей НД, вывести в компонент ListBox1 содержимое всех записей из всех полей (начиная с последней записи).

 

 

Практическая работа

Выведем на экран общую сумму количества товара (поле Kolvo), общую стоимость каждой единицы товара (поле Cena) и общую стоимость товара (для текущей записи) для таблицы Tovar.db.

Расположите на форме следующие компоненты:

Для кнопок напишите соответствующие процедуры:

procedure TForm1.BitBtn1Click(Sender: TObject);

var s:integer;

i:longint;

Begin

s:=0;

table1.First;

for i:=1 to table1.RecordCount do

Begin

s:=s+table1.fieldbyname('kolvo').asinteger;

table1.Next;

end;

label1.Caption:=inttostr(s);

end;

procedure TForm1.BitBtn2Click(Sender: TObject);

var s:real;

i:longint;

Begin

s:=0;

table1.First;

for i:=1 to table1.RecordCount do

Begin

s:=s+table1.fieldbyname('cena').asfloat;

table1.Next;

end;

label2.Caption:=floattostr(s);

end;

procedure TForm1.BitBtn3Click(Sender: TObject);

var s:real;

Begin

s:=table1.fieldbyname('kolvo').asfloat*table1.fieldbyname('cena').asfloat;

label3.Caption:=floattostr(s);

end;

 

2.11. Способы задания состава полей набора данных

Существуют два способа задания состава полей НД:

§ по умолчанию (динамические поля);

§ с помощью редактора полей (статические поля).

Динамические поля создаются автоматически при разработке приложения. Статические поля создаются с помощью Редактора полей, с помощью которого можно:

§ определять вычисляемые поля, значения которых рассчитываются с помощью выражений, в которых можно использовать значения других полей;

§ ограничить состав полей НД;

§ изменить порядок полей НД;

§ скрыть или показать отдельные поля при выполнении приложения;

§ задать формат отображения или редактирования данных поля на этапе разработки приложения.

 

Редактор полей

Для запуска редактора полей нужно дважды щелкнуть по компоненту Table или вызвать его контекстное меню и выбрать команду Fields Editor (Редактор полей). В заголовке редактора полей – составное имя НД (например, Form1.Table1).

Для перемещения по полям в редакторе полей используются четыре кнопки навигации Редактора или мышь.

Большая часть Редактора – список статических полей, которые перечислены в порядке их создания.

Первоначально список пуст, так как все поля НД по умолчанию динамические.

С помощью Редактора полей разработчик может:

  • создать новое статическое поле;
  • удалить статическое поле;
  • изменить порядок статических полей.

Кроме того, для любого выбранного в Редакторе статического поля с помощью Инспектора объектов возможно задание и изменение свойств этого поля.

Для создания статического поля следует вызвать контекстное меню Редактора полей и выбрать пункт Add Fields (Добавить поля), в результате чего появится диалоговое окно добавления новых полей.

В списке Available fields (Доступные поля) окна содержатся все те поля НД, которые еще не являются статическими.

После выбора одного или нескольких полей и нажатия кнопки ОК эти поля добавляются в состав статических полей НД.

 

Для добавления всех физических полей таблицы нужно выбрать в контекстном меню Редактора полей пункт Add all Fields (Добавить все поля).

Имя статического поля – составное и состоит из имени НД и имени физического поля НД (например, Table1Tovar, Table1Kolvo).

Для удаления статического поля нужно выбрать в контекстном меню Редактора полей пункт Delete (Удалить) или выделить в списке поле и нажать клавишу [Delete]. Это поле становится недоступным для операций в программе. Если понадобится, его снова можно сделать статическим, добавив в список Редактор полей.

Можно изменить порядок следования статических полей, переместив их с помощью мыши или с помощью комбинаций клавиш [Ctrl]+[Page Up] и [Ctrl]+[Page Down].

Для создания нового статического поля любого типа нужно выбрать в контекстном меню Редактора полей пункт New Field (Новое поле), в результате чего появится диалоговое окно New Field.

Для задания общих свойств (параметров) нового поля используется группа управляющих элементов Field properties (Свойства поля). В поле Name (Имя) задается значение свойства FieldName, то есть имя поля, а в поле Component – значение свойства Name, то есть название компонента (объекта типа TField) поля.

При программировании обычно используется имя поля. Значение поля Component формируется Delphi автоматически. В полях Type и Size указываются тип и размер поля. Тип должен быть задан в обязательном порядке для любого поля.

Тип нового поля выбирается с помощью группы переключателей Field type (Тип поля) из следующих вариантов:

  • Data – поле данных, заменяющее соответствующее физическое поле таблицы;
  • Calculated – вычисляемое поле, значение которого рассчитывается в обработчике события OnCalcFields во время выполнения приложения;
  • LookUp –поле выбора, значение которого можно выбирать из списка, формируемого на основе заданных критериев и правил.

 

 

Вычисляемые поля

Для создания статического вычисляемого поля нужно:

1. В окне создания нового статического поля задать имя (поле Name) и тип (поле Type) поля, выбрать переключатель Calculated.

2. Написать обработчик события OnCalcFields для НД Table, в котором производится расчет значения вычисляемого поля.

Практическая работа №7

Создать для таблицы Tovar.db два вычисляемых поля Total (общая стоимость товара в рублях) и TotalUE (общая стоимость товара в у.е. (в $)).

Значения полей Total иTotalUE вычисляются по следующим правилам:

Total=Kolvo*Cena

TotalUE= Total/30.36

При расчете стоимости в условных единицах предполагается, что обменный курс составляет 30 руб. 36 коп.

Расположите на форме компоненты Table1, DataSource1, DBGrid1 для работы с БД (для таблицы Tovar.db) и свяжите их.

Сделайте поля Tovar, Kolvo, Cena набора данных Table1статическими.

В контекстном меню Редактора полей выберите пункт New Field. В поле Name задайте имя поля Total. В списке Type выберите значение Float. Установите переключатель Calculated в группе переключателей Field type. Нажмите ОК.

Произведите аналогичные действия для поля TotalUE.

Закройте Редактор полей.

Напишите обработчик события OnCalcFields для НД Table1:

procedure TForm1.Table1CalcFields(DataSet: TDataSet);

begin

Table1Total.AsFloat:=Table1.FieldByName('Kolvo').AsFloat*

Table1.FieldByName('Cena').AsFloat;

Table1TotalUE.AsFloat:=Table1Total.AsFloat/30.36;

end;

Чтобы отформатировать значение поля TotalUE можно написать следующий обработчик события OnCreate для формы:

procedure TForm1.FormCreate(Sender: TObject);

begin

Table1TotalUE.DisplayFormat:='###.##';

end;

 

Запустите программу и в компоненте DBGrid1 вы увидите вычисляемые поля Total и TotalUE.




Поделиться:


Последнее изменение этой страницы: 2016-06-23; просмотров: 673; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 52.14.77.134 (0.012 с.)