Шаг 16 - Создание произвольной таблицы

Для создания таблицы используется метод CreateTable() компонента TTable (или любого другого аналогичного ему). Строго говоря, в таблице существуют простые поля и индексные. По индексным полям производится автоматическая сортировка. Более подробно индексные поля мы расмотрим в следующем шаге. Предварительные описания полей содержатся в свойстве FieldDefs, которое мы рассмотрели в одной из предыдущих статей. В качестве примера давайте напишем программу создающую произвольную таблицу (пока без индексов). Форма ее будет такова:

16_1.gif (7561 b)

Само собой, компонент TTable нужно настроить на конкретный алиас, я использовал BCDEMOS. В TComboBox* FieldType я набил все значения типов полей:

ftUnknown	ftString	ftSmallint		ftInteger	ftWord
ftBoolean	ftFloat		ftCurrency		ftBCD		ftDate
ftTime		ftDateTime	ftBytes			ftVarBytes	ftAutoInc
ftBlob		ftMemo		ftGraphic		ftFmtMemo	ftParadoxOle
ftDBaseOle	ftTypedBinary	ftCursor	ftFixedChar
ftWideString	ftLargeint	ftADT		ftArray		ftReference
ftDataSet	ftOraBlob	ftOraClob		ftVariant	ftInterface
ftIDispatch	ftGuid		ftTimeStamp		ftFMTBcd

Очень важным является соблюдения порядка, соответствующего enum TFieldType. Затем мы пишем код:

//---------------------------------------
void __fastcall TForm1::AddDefClick(TObject *Sender)
{
	ListBox->Enabled = false;
	AddBox->Enabled = true;
}

//---------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
	table->FieldDefs->Clear();
}
//---------------------------------------
void __fastcall TForm1::AddFieldClick(TObject *Sender)
{
	TFieldDef* def = table->FieldDefs->AddFieldDef();
	def->Name = FieldName->Text;
	def->Size = FieldSize->Text.ToInt();
	def->DataType = (TFieldType)FieldType->ItemIndex;
	def->Attributes << (TFieldAttribute)((faHiddenCol&FieldHidden->Checked)|
		(faRequired&FieldRequired->Checked)|
		(faReadonly&FieldReadOnly->Checked)|
		(faFixed&FieldFixed->Checked));
	Fields->Items->AddObject(FieldName->Text,def);
	Fields->ItemIndex = Fields->Items->Count - 1;
	CancelFieldClick(0);
}

//---------------------------------------
void __fastcall TForm1::CancelFieldClick(TObject *Sender)
{
	ListBox->Enabled = true;
	AddBox->Enabled = false;
}

//---------------------------------------
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
for(int i=0;i<Fields->Items->Count;i++)
        ((TFieldDef*)Fields->Items->Objects[i])->FieldNo = i;
table->TableType = (TTableType)TableType->ItemIndex;
table->TableName = TableName->Text;
table->CreateTable();
}

//---------------------------------------
void __fastcall TForm1::RemoveDefClick(TObject *Sender)
{
	table->Active = false;
	if(Fields->ItemIndex==-1)return;
	TFieldDef* def = (TFieldDef*)Fields->Items->Objects[Fields->ItemIndex];
	table->FieldDefs->Delete(def->Index);
	Fields->DeleteSelected();
}

//---------------------------------------
void __fastcall TForm1::FieldsChange(TObject *Sender)
{
	TFieldDef* def = (TFieldDef*)Fields->Items->Objects[Fields->ItemIndex];
	FieldSize->Text = def->Size;
	FieldType->ItemIndex = def->DataType;
	FieldName->Text = def->Name;
	FieldHidden->Checked = def->Attributes.Contains(faHiddenCol);
	FieldRequired->Checked = def->Attributes.Contains(faRequired);
	FieldReadOnly->Checked = def->Attributes.Contains(faReadonly);
	FieldFixed->Checked = def->Attributes.Contains(faFixed);
}

В листинге по-моему описано все, что нужно для создания таблицы. Для большей убедительности добавляю файл проекта к шагу.


Загрузить проект | Предыдущий Шаг | Оглавление
Автор Аванесов Самвел - 17.02.2004