📄 dbtreeview.cpp.txt
字号:
table->max_rows = dlg.m_nMaxRows;
table->used_rows = 0;
table->flags |= dlg.m_bIsLockTable ? TF_TABLE_LOCK : 0;
if (hash_insert(&m_hashEditDb, (byte *)table))
return;
// 加入表名称
CString strTitle = table->name;
NODE_DATA *nd = new NODE_DATA;
if (nd)
{
nd->type = DATA_TYPE_TABLE;
nd->data = (BYTE *)table;
}
HTREEITEM hti = InsertTreeNode(m_treeCtrl, NULL, TVI_SORT, strTitle, 2, 2, nd);
if (hti)
{
m_treeCtrl.EnsureVisible(hti);
m_treeCtrl.SelectItem(hti);
}
else if (nd)
delete nd;
}
}
void CDbTreeView::OnDeleteTable()
{
// TODO: Add your command handler code here
}
void CDbTreeView::OnEditField()
{
// TODO: Add your command handler code here
HTREEITEM hItem = m_treeCtrl.GetSelectedItem();
if (hItem == NULL)
return;
NODE_DATA *nd = (NODE_DATA *)m_treeCtrl.GetItemData(hItem);
if (nd == NULL)
return;
BOOL bAlterTable = FALSE;
FIELD *f = (FIELD *)nd->data, of;
CFieldDlg dlg(this, f);
if (dlg.DoModal() == IDOK)
{
of = *f;
of.name = NULL;
if (stricmp(f->name, dlg.m_strFieldName) != 0)
{
if (_PM(f->name))
delete f->name;
f->name = new char[dlg.m_strFieldName.GetLength() + 1];
strcpy(f->name, dlg.m_strFieldName);
m_treeCtrl.SetItemText(hItem, dlg.m_strFieldName);
}
if (f->type != (BYTE)dlg.m_nFieldType)
{
bAlterTable = TRUE;
f->type = (BYTE)dlg.m_nFieldType;
}
if (f->count != (USHORT)dlg.m_nCount)
{
bAlterTable = TRUE;
f->count = dlg.m_nCount;
}
f->min_value = dlg.m_nMinValue;
f->max_value = dlg.m_nMaxValue;
if ((f->flags & FF_HAVE_DEFAULT)
&& (f->count > 1)
&& _PM(f->dv_ptr))
delete f->dv_ptr;
if (dlg.m_bDefaultValue)
{
f->flags |= FF_HAVE_DEFAULT;
if (f->count == 1)
f->dv_ulong = dlg.m_nDefaultValue;
else
f->dv_ptr = dlg.m_pDefaultValue;
}
else
f->flags &= ~FF_HAVE_DEFAULT;
f->flags &= ~FF_NOT_NULL;
f->flags |= dlg.m_bIsNotNull ? FF_NOT_NULL : 0;
// 更改Table数据
{
HTREEITEM htiParent = m_treeCtrl.GetParentItem(hItem);
NODE_DATA *ndTable = (NODE_DATA *)m_treeCtrl.GetItemData(htiParent);
TABLE *table = NULL;
if (ndTable)
table = (TABLE *)ndTable->data;
if (table)
AlterTable_EditField(table, &of);
}
}
}
void CDbTreeView::OnCreateField()
{
// TODO: Add your command handler code here
HTREEITEM hItem = m_treeCtrl.GetSelectedItem();
if (hItem == NULL)
return;
NODE_DATA *nd = (NODE_DATA *)m_treeCtrl.GetItemData(hItem);
if (nd == NULL)
return;
CFieldDlg dlg(this, NULL);
if (dlg.DoModal() == IDOK)
{
// 放在所有字段的最后
HTREEITEM htiParent = NULL;
TABLE *table = NULL;
NODE_DATA *ndTable = NULL;
if (nd->type == DATA_TYPE_TABLE)
{
table = (TABLE *)nd->data;
htiParent = hItem;
ndTable = nd;
}
else if (nd->type == DATA_TYPE_FIELD)
{
htiParent = m_treeCtrl.GetParentItem(hItem);
ndTable = (NODE_DATA *)m_treeCtrl.GetItemData(htiParent);
if (ndTable)
table = (TABLE *)ndTable->data;
}
else
{
htiParent = m_treeCtrl.GetParentItem(hItem);
ndTable = (NODE_DATA *)m_treeCtrl.GetItemData(htiParent);
if (ndTable)
table = (TABLE *)ndTable->data;
}
if(htiParent == NULL || table == NULL)
return;
// 更改表信息
FIELD *fields = new FIELD[table->field_count + 1];
if (table->field_count > 0)
memcpy(fields, table->fields, sizeof(FIELD) * table->field_count);
if (_PM(table->fields))
delete table->fields;
table->fields = fields;
table->field_count++;
// 设置字段信息
FIELD *f = fields + (table->field_count - 1);
memset(f, 0, sizeof(FIELD));
f->name = new char[dlg.m_strFieldName.GetLength() + 1];
strcpy(f->name, dlg.m_strFieldName);
f->type = (BYTE)dlg.m_nFieldType;
f->count = dlg.m_nCount;
f->min_value = dlg.m_nMinValue;
f->max_value = dlg.m_nMaxValue;
if (dlg.m_bDefaultValue)
{
f->flags |= FF_HAVE_DEFAULT;
if (f->count == 1)
f->dv_ulong = dlg.m_nDefaultValue;
else
f->dv_ptr = dlg.m_pDefaultValue;
}
f->flags |= dlg.m_bIsNotNull ? FF_NOT_NULL : 0;
// 改变记录大小
uint flen = get_field_length(f);
table->record_size += flen;
// 设置offset&fno
f->offset = table->record_size - flen;
f->fno = table->field_count - 1;
// 重新载入表信息
LoadTable(m_treeCtrl, htiParent, table);
// 更改Table数据
AlterTable_CreateField(table, f);
}
}
void CDbTreeView::OnDeleteField()
{
// TODO: Add your command handler code here
// 更改Table数据
//AlterTable_DeleteField(table, f);
}
void CDbTreeView::OnEditKey()
{
// TODO: Add your command handler code here
HTREEITEM hItem = m_treeCtrl.GetSelectedItem();
if (hItem == NULL)
return;
NODE_DATA *nd = (NODE_DATA *)m_treeCtrl.GetItemData(hItem);
if (nd == NULL)
return;
KEY *key = (KEY *)nd->data;
HTREEITEM hTableItem = m_treeCtrl.GetParentItem(hItem);
if (hTableItem == NULL)
return;
NODE_DATA *nd1 = (NODE_DATA *)m_treeCtrl.GetItemData(hTableItem);
if (nd1 == NULL)
return;
TABLE *table = (TABLE *)nd1->data;
CKeyDlg dlg(this, table, key);
if (dlg.DoModal() == IDOK)
{
if (!dlg.m_pKeyFields)
return;
if ((key->field_count != (BYTE)dlg.m_nFieldCount) ||
memcmp(key->fields, dlg.m_pKeyFields, key->field_count * sizeof(ushort)) != 0)
{
if (_PM(key->fields))
delete key->fields;
key->field_count = (BYTE)dlg.m_nFieldCount;
key->fields = dlg.m_pKeyFields;
CString strTitle = _T("");
for (int m = 0; m < key->field_count; m++)
{
FIELD *f = table->fields + key->fields[m];
strTitle += f->name;
if (m < key->field_count - 1)
strTitle += _T(" | ");
}
m_treeCtrl.SetItemText(hItem, strTitle);
}
key->flags &= ~KF_NO_SAME;
key->flags |= dlg.m_bIsNoSame ? KF_NO_SAME : 0;
}
}
void CDbTreeView::OnCreateKey()
{
// TODO: Add your command handler code here
HTREEITEM hItem = m_treeCtrl.GetSelectedItem();
if (hItem == NULL)
return;
NODE_DATA *nd = (NODE_DATA *)m_treeCtrl.GetItemData(hItem);
if (nd == NULL)
return;
// 放在最后
HTREEITEM htiParent = NULL;
TABLE *table = NULL;
NODE_DATA *ndTable = NULL;
if (nd->type == DATA_TYPE_TABLE)
{
table = (TABLE *)nd->data;
htiParent = hItem;
ndTable = nd;
}
else if (nd->type == DATA_TYPE_FIELD)
{
htiParent = m_treeCtrl.GetParentItem(hItem);
ndTable = (NODE_DATA *)m_treeCtrl.GetItemData(htiParent);
if (ndTable)
table = (TABLE *)ndTable->data;
}
else
{
htiParent = m_treeCtrl.GetParentItem(hItem);
ndTable = (NODE_DATA *)m_treeCtrl.GetItemData(htiParent);
if (ndTable)
table = (TABLE *)ndTable->data;
}
if(htiParent == NULL || table == NULL)
return;
if (table->field_count == 0)
{
MessageBox(_T("请先建立字段列表!"), _T("提示信息"), MB_OK | MB_ICONINFORMATION);
return;
}
CKeyDlg dlg(this, table, NULL);
if (dlg.DoModal() == IDOK)
{
if (!dlg.m_pKeyFields)
return;
// 更新表信息
KEY *keys = new KEY[table->key_count + 1];
if (table->key_count > 0)
memcpy(keys, table->keys, sizeof(KEY) * table->key_count);
if (_PM(table->keys))
delete table->keys;
table->keys = keys;
table->key_count++;
// 设置索引信息
KEY *key = keys + (table->key_count - 1);
memset(key, 0, sizeof(KEY));
key->fields = dlg.m_pKeyFields;
key->field_count = (BYTE)dlg.m_nFieldCount;
key->flags |= dlg.m_bIsNoSame ? KF_NO_SAME : 0;
// 重新载入表信息
LoadTable(m_treeCtrl, htiParent, table);
}
}
void CDbTreeView::OnDeleteKey()
{
// TODO: Add your command handler code here
}
/*
1、编辑字段、增加字段后对表的所有记录进行处理,符合新的表定义
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -