📄 newtablefrm.pas
字号:
Application.MessageBox(PChar(AppLangMgr.Trans('Too many AutoInc fields.')), PChar(Application.Title), 48);
FieldListView.SetFocus;
Result := False;
Exit;
end;
if AutoIncNum = 1 then
begin
for I := 0 to IndexListView.Items.Count - 1 do
begin
if tiPrimary in GetIndexNodeData(IndexListView.Items[I]).IndexOptions then
begin
Application.MessageBox(PChar(AppLangMgr.Trans('AutoInc field is primary key, so you cannot create the second primary index.')), PChar(Application.Title), 48);
IndexListView.Items[I].Selected := True;
IndexListView.SetFocus;
Result := False;
Exit;
end;
end;
end;
end;
function TNewTableForm.CreateTableFromUI(ATinyDB: TTinyDatabase; TableName: string): Boolean;
var
FieldItems: array of TFieldItem;
FieldNames: array of string;
FieldInfo: TFieldItemInfo;
IndexInfo: TIndexItemInfo;
I, Idx: Integer;
List: TStrings;
begin
SetLength(FieldItems, FieldListView.Items.Count);
for I := 0 to FieldListView.Items.Count - 1 do
begin
FieldInfo := GetFieldNodeData(FieldListView.Items[I]);
FieldItems[I].FieldName := FieldInfo.FieldName;
FieldItems[I].FieldType := FieldInfo.FieldType;
FieldItems[I].DataSize := FieldInfo.DataSize;
FieldItems[I].DPMode := FieldInfo.DPMode;
end;
Result := ATinyDB.CreateTable(TableName, FieldItems);
List := TStringList.Create;
try
try
for Idx := 0 to IndexListView.Items.Count - 1 do
begin
IndexInfo := GetIndexNodeData(IndexListView.Items[Idx]);
List.Clear;
List.CommaText := IndexInfo.IndexFields;
SetLength(FieldNames, List.Count);
for I := 0 to List.Count - 1 do
FieldNames[I] := List[I];
Result := ATinyDB.CreateIndex(TableName, IndexInfo.IndexName, IndexInfo.IndexOptions, FieldNames);
end;
except
ATinyDB.DeleteTable(TableName);
raise;
end;
finally
List.Free;
end;
end;
function TNewTableForm.CreateTable: Boolean;
begin
Result := CreateTableFromUI(MainForm.TinyDatabase, TableNameEdit.Text);
end;
function TNewTableForm.ModifyTable: Boolean;
var
TempFile: string;
TempTinyDB: TTinyDatabase;
SrcTinyTable, DstTinyTable: TTinyTable;
NewTableName: string;
I, J, RecIdx: Integer;
begin
Result := True;
TempFile := GetTempFileName;
TempTinyDB := TTinyDatabase.Create(nil);
TempTinyDB.CreateDatabase(TempFile);
SrcTinyTable := TTinyTable.Create(nil);
DstTinyTable := TTinyTable.Create(nil);
MainForm.BeginProgress;
try
try
NewTableName := TableNameEdit.Text;
TempTinyDB.DatabaseName := TempFile;
CreateTableFromUI(TempTinyDB, NewTableName);
//Copy records to temporary table
SrcTinyTable.DatabaseName := FTinyDB.DatabaseName;
SrcTinyTable.TableName := FTableName;
SrcTinyTable.Open;
DstTinyTable.DatabaseName := TempFile;
DstTinyTable.TableName := NewTableName;
DstTinyTable.Open;
DstTinyTable.BeginUpdate;
for RecIdx := 0 to SrcTinyTable.RecordCount - 1 do
begin
MainForm.DoProgress(Trunc((RecIdx+1) / SrcTinyTable.RecordCount * 100));
DstTinyTable.Append;
for I := 0 to SrcTinyTable.Fields.Count - 1 do
for J := 0 to FieldListView.Items.Count - 1 do
begin
if I = GetFieldNodeData(FieldListView.Items[J]).Idx then
begin
DstTinyTable.Fields[J].Value := SrcTinyTable.Fields[I].Value;
Break;
end;
end;
DstTinyTable.Post;
SrcTinyTable.Next;
end;
SrcTinyTable.Close;
DstTinyTable.EndUpdate;
DstTinyTable.Close;
//Delete old table
FTinyDB.DeleteTable(FTableName);
//Create new table
CreateTableFromUI(FTinyDB, NewTableName);
//Copy records from temporary table to new table
SrcTinyTable.DatabaseName := TempFile;
SrcTinyTable.TableName := NewTableName;
SrcTinyTable.Open;
DstTinyTable.DatabaseName := FTinyDB.DatabaseName;
DstTinyTable.TableName := NewTableName;
DstTinyTable.Open;
DstTinyTable.BeginUpdate;
for RecIdx := 0 to SrcTinyTable.RecordCount - 1 do
begin
MainForm.DoProgress(Trunc((RecIdx+1) / SrcTinyTable.RecordCount * 100));
DstTinyTable.Append;
for I := 0 to SrcTinyTable.Fields.Count - 1 do
DstTinyTable.Fields[I].Value := SrcTinyTable.Fields[I].Value;
DstTinyTable.Post;
SrcTinyTable.Next;
end;
SrcTinyTable.Close;
DstTinyTable.EndUpdate;
DstTinyTable.Close;
finally
DeleteFile(TempFile);
TempTinyDB.Free;
SrcTinyTable.Free;
DstTinyTable.Free;
MainForm.EndProgress;
end;
except
Application.MessageBox(PChar(AppLangMgr.Trans('Fail to modify table structure. Perhaps, field type cannot be converted, or database cannot be written.')), PChar(Application.Title), 48);
Result := False;
end;
end;
procedure TNewTableForm.InsertFieldToListView(Item: TFieldItemInfo; Index: Integer);
var
DPModeStr: array[TFieldDataProcessMode] of string;
ListItem: TListItem;
begin
DPModeStr[fdDefault] := AppLangMgr.Trans('fdDefault');
DPModeStr[fdOriginal] := AppLangMgr.Trans('fdOriginal');
ListItem := FieldListView.Items.Insert(Index);
ListItem.Caption := IntToStr(Index);
ListItem.SubItems.Add(Item.FieldName);
ListItem.SubItems.Add(MainForm.GetFieldStrByType(Item.FieldType));
ListItem.SubItems.Add(IntToStr(Item.DataSize));
ListItem.SubItems.Add(DPModeStr[Item.DPMode]);
ListItem.SubItems.Add(Item.Comments);
ListItem.ImageIndex := 1;
AddFieldNodeData(ListItem, Item);
AdjustFieldIdxList;
end;
procedure TNewTableForm.AddFieldToListView(Item: TFieldItemInfo);
begin
InsertFieldToListView(Item, FieldListView.Items.Count);
end;
procedure TNewTableForm.InsertIndexToListView(Item: TIndexItemInfo; Index: Integer);
var
YesStr, NoStr: string;
AscStr, DescStr: string;
ListItem: TListItem;
begin
YesStr := AppLangMgr.Trans('Yes');
NoStr := AppLangMgr.Trans('No');
AscStr := AppLangMgr.Trans('Ascending');
DescStr := AppLangMgr.Trans('Descending');
ListItem := IndexListView.Items.Insert(Index);
ListItem.Caption := IntToStr(Index);
ListItem.SubItems.Add(Item.IndexName);
ListItem.SubItems.Add(Item.IndexFields);
ListItem.SubItems.Add(Iif(tiPrimary in Item.IndexOptions, YesStr, NoStr));
ListItem.SubItems.Add(Iif(tiUnique in Item.IndexOptions, YesStr, NoStr));
ListItem.SubItems.Add(Iif(tiCaseInsensitive in Item.IndexOptions, NoStr, YesStr));
ListItem.SubItems.Add(Iif(tiDescending in Item.IndexOptions, DescStr, AscStr));
ListItem.ImageIndex := 2;
AddIndexNodeData(ListItem, Item);
AdjustIndexIdxList;
end;
procedure TNewTableForm.AddIndexToListView(Item: TIndexItemInfo);
begin
InsertIndexToListView(Item, IndexListView.Items.Count);
end;
procedure TNewTableForm.AddFieldButtonClick(Sender: TObject);
var
Value: TAddFieldFormData;
begin
Value.NewTableForm := Self;
Value.FieldInfo.DPMode := fdDefault;
ShowAddFieldForm(Value);
end;
procedure TNewTableForm.DeleteFieldButtonClick(Sender: TObject);
var
ListItem: TListItem;
begin
ListItem := FieldListView.Selected;
if ListItem = nil then Exit;
FreeFieldNodeData(ListItem);
ListItem.Delete;
AdjustFieldIdxList;
end;
procedure TNewTableForm.MoveUpFieldButtonClick(Sender: TObject);
var
ListItem: TListItem;
FieldItemInfo: TFieldItemInfo;
Idx: Integer;
begin
ListItem := FieldListView.Selected;
if ListItem = nil then Exit;
if ListItem.Index = 0 then Exit;
Idx := ListItem.Index;
FieldItemInfo := GetFieldNodeData(ListItem);
ListItem.Delete;
if Idx > 0 then Dec(Idx);
InsertFieldToListView(FieldItemInfo, Idx);
FieldListView.Items[Idx].Selected := True;
end;
procedure TNewTableForm.MoveDownFieldButtonClick(Sender: TObject);
var
ListItem: TListItem;
FieldItemInfo: TFieldItemInfo;
Idx: Integer;
begin
ListItem := FieldListView.Selected;
if ListItem = nil then Exit;
if ListItem.Index = FieldListView.Items.Count - 1 then Exit;
Idx := ListItem.Index;
FieldItemInfo := GetFieldNodeData(ListItem);
if Idx < FieldListView.Items.Count - 1 then Inc(Idx);
ListItem.Delete;
InsertFieldToListView(FieldItemInfo, Idx);
FieldListView.Items[Idx].Selected := True;
end;
procedure TNewTableForm.AddIndexButtonClick(Sender: TObject);
var
Value: TAddIndexFormData;
begin
Value.NewTableForm := Self;
Value.AvailableFields := GetCanIndexedFields;
ShowAddIndexForm(Value);
end;
procedure TNewTableForm.DeleteIndexButtonClick(Sender: TObject);
var
ListItem: TListItem;
begin
ListItem := IndexListView.Selected;
if ListItem = nil then Exit;
FreeIndexNodeData(ListItem);
ListItem.Delete;
AdjustIndexIdxList;
end;
procedure TNewTableForm.ClearIndexButtonClick(Sender: TObject);
begin
ClearIndexNodeData;
IndexListView.Items.Clear;
end;
procedure TNewTableForm.CreateTableButtonClick(Sender: TObject);
begin
if CheckValid then
begin
if FModifyMode then
begin
if ModifyTable then ModalResult := mrOk;
end else
begin
if CreateTable then ModalResult := mrOk;
end;
end;
end;
procedure TNewTableForm.CancelButtonClick(Sender: TObject);
begin
ModalResult := mrCancel;
end;
procedure TNewTableForm.HelpButtonClick(Sender: TObject);
begin
ShowHelp;
end;
procedure TNewTableForm.FieldListViewDblClick(Sender: TObject);
var
ListItem: TListItem;
Idx: Integer;
Value: TAddFieldFormData;
begin
ListItem := FieldListView.Selected;
if ListItem = nil then Exit;
Idx := ListItem.Index;
Value.FieldInfo := GetFieldNodeData(ListItem);
if ShowAddFieldForm(Value, True) then
begin
FieldListView.Items.BeginUpdate;
FreeFieldNodeData(ListItem);
ListItem.Delete;
InsertFieldToListView(Value.FieldInfo, Idx);
FieldListView.Items[Idx].Selected := True;
FieldListView.Items.EndUpdate;
end;
end;
procedure TNewTableForm.IndexListViewDblClick(Sender: TObject);
var
ListItem: TListItem;
Idx: Integer;
Value: TAddIndexFormData;
begin
ListItem := IndexListView.Selected;
if ListItem = nil then Exit;
Idx := ListItem.Index;
Value.NewTableForm := Self;
Value.AvailableFields := GetCanIndexedFields;
Value.IndexInfo := GetIndexNodeData(ListItem);
if ShowAddIndexForm(Value, True) then
begin
FreeIndexNodeData(ListItem);
ListItem.Delete;
InsertIndexToListView(Value.IndexInfo, Idx);
IndexListView.Items[Idx].Selected := True;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -