⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 newtablefrm.pas

📁 delphi本地数据库引擎
💻 PAS
📖 第 1 页 / 共 2 页
字号:
    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 + -