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

📄 newtablefrm.pas

📁 delphi本地数据库引擎
💻 PAS
📖 第 1 页 / 共 2 页
字号:
unit NewTableFrm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics,
  Controls, Forms, Dialogs, ComCtrls, StdCtrls,
  Db, ImgList, TinyDB, BaseFrm;

type
  PFieldItemInfo = ^TFieldItemInfo;
  TFieldItemInfo = record
    Idx: Integer;
    FieldName: string;
    FieldType: TFieldType;
    DataSize: Integer;
    DPMode: TFieldDataProcessMode;
    Comments: string;
  end;

  PIndexItemInfo = ^TIndexItemInfo;
  TIndexItemInfo = record
    IndexName: string;
    IndexOptions: TTDIndexOptions;
    IndexFields: string;
  end;

  TNewTableForm = class(TBaseForm)
    TableNameLabel: TLabel;
    TableNameEdit: TEdit;
    FieldGroupBox: TGroupBox;
    FieldListView: TListView;
    AddFieldButton: TButton;
    DeleteFieldButton: TButton;
    IndexGroupBox: TGroupBox;
    IndexListView: TListView;
    AddIndexButton: TButton;
    DeleteIndexButton: TButton;
    MoveDownFieldButton: TButton;
    ClearIndexButton: TButton;
    CreateTableButton: TButton;
    CancelButton: TButton;
    HelpButton: TButton;
    MoveUpFieldButton: TButton;
    ImageList: TImageList;
    procedure AddFieldButtonClick(Sender: TObject);
    procedure DeleteFieldButtonClick(Sender: TObject);
    procedure MoveDownFieldButtonClick(Sender: TObject);
    procedure AddIndexButtonClick(Sender: TObject);
    procedure DeleteIndexButtonClick(Sender: TObject);
    procedure ClearIndexButtonClick(Sender: TObject);
    procedure CreateTableButtonClick(Sender: TObject);
    procedure CancelButtonClick(Sender: TObject);
    procedure HelpButtonClick(Sender: TObject);
    procedure MoveUpFieldButtonClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FieldListViewDblClick(Sender: TObject);
    procedure IndexListViewDblClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    FModifyMode: Boolean;
    FTinyDB: TTinyDatabase;
    FTableName: string;

    procedure AddFieldNodeData(ListItem: TListItem; FieldItemInfo: TFieldItemInfo);
    procedure FreeFieldNodeData(ListItem: TListItem);
    procedure ClearFieldNodeData;
    function GetFieldNodeData(ListItem: TListItem): TFieldItemInfo;

    procedure AddIndexNodeData(ListItem: TListItem; IndexItemInfo: TIndexItemInfo);
    procedure FreeIndexNodeData(ListItem: TListItem);
    procedure ClearIndexNodeData;
    function GetIndexNodeData(ListItem: TListItem): TIndexItemInfo;

    procedure AdjustFieldIdxList;
    procedure AdjustIndexIdxList;
    function GetCanIndexedFields: string;
    function GetStrByIndexFieldIdxes(TinyTable: TTinyTable; FieldIdxes: array of Integer): string;
    function GetTempFileName: string;

    function CheckValid: Boolean;
    function CreateTableFromUI(ATinyDB: TTinyDatabase; TableName: string): Boolean;
    function CreateTable: Boolean;
    function ModifyTable: Boolean;

  public
    { Public declarations }
    procedure TransLanguage; override;
    procedure SetData(TinyDB: TTinyDatabase; TableName: string);

    procedure InsertFieldToListView(Item: TFieldItemInfo; Index: Integer);
    procedure AddFieldToListView(Item: TFieldItemInfo);

    procedure InsertIndexToListView(Item: TIndexItemInfo; Index: Integer);
    procedure AddIndexToListView(Item: TIndexItemInfo);

    property ModifyMode: Boolean read FModifyMode write FModifyMode;
  end;

var
  NewTableForm: TNewTableForm;

function ShowNewTableForm: Boolean;
function ShowDesignTableForm(TinyDB: TTinyDatabase; TableName: string): Boolean;

implementation

uses MainFrm, Misc, AddFieldFrm, AddIndexFrm, LangMgr;

{$R *.DFM}

function ShowNewTableForm: Boolean;
var
  Frm: TNewTableForm;
begin
  Frm := TNewTableForm.Create(Application);
  Result := Frm.ShowModal = mrOk;
  Frm.Free;
end;

function ShowDesignTableForm(TinyDB: TTinyDatabase; TableName: string): Boolean;
var
  Frm: TNewTableForm;
begin
  Frm := TNewTableForm.Create(Application);
  Frm.Caption := AppLangMgr.Trans('Design Table');
  Frm.CreateTableButton.Caption := AppLangMgr.Trans('OK');
  Frm.ModifyMode := True;
  Frm.SetData(TinyDB, TableName);
  Result := Frm.ShowModal = mrOk;
  Frm.Free;
end;


procedure TNewTableForm.FormCreate(Sender: TObject);
begin
  AppLangMgr.Trans(Self);
end;

procedure TNewTableForm.FormDestroy(Sender: TObject);
begin
  ClearFieldNodeData;
end;

procedure TNewTableForm.TransLanguage;
begin
  inherited;
  FieldListView.Columns[0].Caption := AppLangMgr.Trans('NO.');
  FieldListView.Columns[1].Caption := AppLangMgr.Trans('Field Name');
  FieldListView.Columns[2].Caption := AppLangMgr.Trans('Field Type');
  FieldListView.Columns[3].Caption := AppLangMgr.Trans('Field Size');
  FieldListView.Columns[4].Caption := AppLangMgr.Trans('Data Processing');
  FieldListView.Columns[5].Caption := AppLangMgr.Trans('Note');

  IndexListView.Columns[0].Caption := AppLangMgr.Trans('NO.');
  IndexListView.Columns[1].Caption := AppLangMgr.Trans('Index Name');
  IndexListView.Columns[2].Caption := AppLangMgr.Trans('Index Field');
  IndexListView.Columns[3].Caption := AppLangMgr.Trans('Primary');
  IndexListView.Columns[4].Caption := AppLangMgr.Trans('Unique');
  IndexListView.Columns[5].Caption := AppLangMgr.Trans('Case Sensitive');
  IndexListView.Columns[6].Caption := AppLangMgr.Trans('Sort Mode');

  TableNameEdit.BoundsRect := Rect(TableNameLabel.BoundsRect.Right + 4,
    TableNameEdit.Top, TableNameEdit.BoundsRect.Right, TableNameEdit.BoundsRect.Bottom);
end;

procedure TNewTableForm.SetData(TinyDB: TTinyDatabase; TableName: string);
var
  FieldItem: TFieldItemInfo;
  IndexItem: TIndexItemInfo;
  TinyTable: TTinyTable;
  I, AutoIncNum: Integer;
begin
  FTinyDB := TinyDB;
  FTableName := TableName;
  TableNameEdit.Text := TableName;

  FieldListView.Items.BeginUpdate;
  FieldListView.Items.Clear;
  IndexListView.Items.BeginUpdate;
  IndexListView.Items.Clear;
  TinyTable := TTinyTable.Create(nil);
  try
    TinyTable.DatabaseName := TinyDB.DatabaseName;
    TinyTable.TableName := FTableName;
    TinyTable.Open;
    AutoIncNum := 0;
    for I := 0 to TinyTable.FieldDefs.Count - 1 do
    begin
      FieldItem.Idx := I;
      FieldItem.FieldName := TinyTable.TableIO.FieldDefs[I].Name;
      FieldItem.FieldType := TinyTable.TableIO.FieldDefs[I].FieldType;
      FieldItem.DataSize := TinyTable.TableIO.FieldDefs[I].FieldSize;
      FieldItem.DPMode := TinyTable.TableIO.FieldDefs[I].DPMode;
      FieldItem.Comments := MainForm.GetFieldCommentsByType(FieldItem.FieldType);
      AddFieldToListView(FieldItem);
      if FieldItem.FieldType = ftAutoInc then Inc(AutoIncNum);
    end;
    for I := 0 to TinyTable.IndexDefs.Count - 1 do
    begin
      IndexItem.IndexName := TinyTable.IndexDefs[I].Name;
      IndexItem.IndexOptions := TinyTable.TableIO.IndexDefs[I].Options;
      IndexItem.IndexFields := GetStrByIndexFieldIdxes(TinyTable, TinyTable.TableIO.IndexDefs[I].FieldIdxes);
      if (AutoIncNum = 0) or not (tiPrimary in IndexItem.IndexOptions) then
        AddIndexToListView(IndexItem);
    end;
  finally
    FieldListView.Items.EndUpdate;
    IndexListView.Items.EndUpdate;
    TinyTable.Close;
    TinyTable.Free;
  end;
end;

procedure TNewTableForm.AddFieldNodeData(ListItem: TListItem; FieldItemInfo: TFieldItemInfo);
var
  ItemPtr: PFieldItemInfo;
begin
  New(ItemPtr);
  ItemPtr^ := FieldItemInfo;
  ListItem.Data := ItemPtr;
end;

procedure TNewTableForm.FreeFieldNodeData(ListItem: TListItem);
begin
  Dispose(PFieldItemInfo(ListItem.Data));
end;

procedure TNewTableForm.ClearFieldNodeData;
var
  I: Integer;
begin
  for I := 0 to FieldListView.Items.Count - 1 do
    Dispose(PFieldItemInfo(FieldListView.Items[I].Data));
end;

function TNewTableForm.GetFieldNodeData(ListItem: TListItem): TFieldItemInfo;
begin
  Result := PFieldItemInfo(ListItem.Data)^;
end;

procedure TNewTableForm.AddIndexNodeData(ListItem: TListItem; IndexItemInfo: TIndexItemInfo);
var
  ItemPtr: PIndexItemInfo;
begin
  New(ItemPtr);
  ItemPtr^ := IndexItemInfo;
  ListItem.Data := ItemPtr;
end;

procedure TNewTableForm.FreeIndexNodeData(ListItem: TListItem);
begin
  Dispose(PIndexItemInfo(ListItem.Data));
end;

procedure TNewTableForm.ClearIndexNodeData;
var
  I: Integer;
begin
  for I := 0 to IndexListView.Items.Count - 1 do
    Dispose(PIndexItemInfo(IndexListView.Items[I].Data));
end;

function TNewTableForm.GetIndexNodeData(ListItem: TListItem): TIndexItemInfo;
begin
  Result := PIndexItemInfo(ListItem.Data)^;
end;

procedure TNewTableForm.AdjustFieldIdxList;
var
  I: Integer;
begin
  for I := 0 to FieldListView.Items.Count - 1 do
    FieldListView.Items[I].Caption := IntToStr(I);
end;

procedure TNewTableForm.AdjustIndexIdxList;
var
  I: Integer;
begin
  for I := 0 to IndexListView.Items.Count - 1 do
    IndexListView.Items[I].Caption := IntToStr(I);
end;

function TNewTableForm.GetCanIndexedFields: string;
var
  I: Integer;
  List: TStrings;
begin
  List := TStringList.Create;
  for I := 0 to FieldListView.Items.Count - 1 do
    List.Add(GetFieldNodeData(FieldListView.Items[I]).FieldName);
  Result := List.CommaText;
  List.Free;
end;

function TNewTableForm.GetStrByIndexFieldIdxes(TinyTable: TTinyTable; FieldIdxes: array of Integer): string;
var
  I: Integer;
begin
  Result := '';
  for I := 0 to High(FieldIdxes) do
  begin
    if I <> 0 then Result := Result + ',';
    Result := Result + TinyTable.FieldDefs[FieldIdxes[I]].Name;
  end;
end;

function TNewTableForm.GetTempFileName: string;
var
  Buf: array[0..MAX_PATH] of Char;
begin
  GetTempPath(MAX_PATH, Buf);
  Windows.GetTempFileName(Buf, 'TDB', 0, Buf);
  Result := Buf;
end;

function TNewTableForm.CheckValid: Boolean;
var
  I, J, AutoIncNum: Integer;
begin
  Result := True;
  if not IsValidDBName(TableNameEdit.Text) then
  begin
    if TableNameEdit.Text <> '' then
      Application.MessageBox(PChar(AppLangMgr.Trans('Invalid identifier.')), PChar(Application.Title), 48)
    else
      Application.MessageBox(PChar(AppLangMgr.Trans('Please input table name.')), PChar(Application.Title), 48);
    TableNameEdit.SetFocus;
    Result := False;
    Exit;
  end;

  for I := 0 to FieldListView.Items.Count - 2 do
    for J := I + 1 to FieldListView.Items.Count - 1 do
    begin
      if CompareText(GetFieldNodeData(FieldListView.Items[I]).FieldName,
        GetFieldNodeData(FieldListView.Items[J]).FieldName) = 0 then
      begin
        Application.MessageBox(PChar(AppLangMgr.Trans('Duplicate field name.')), PChar(Application.Title), 48);
        FieldListView.SetFocus;
        FieldListView.Items[I].Selected := True;
        Result := False;
        Exit;
      end;
    end;

  for I := 0 to IndexListView.Items.Count - 2 do
    for J := I + 1 to IndexListView.Items.Count - 1 do
    begin
      if CompareText(GetIndexNodeData(IndexListView.Items[I]).IndexName,
        GetIndexNodeData(IndexListView.Items[J]).IndexName) = 0 then
      begin
        Application.MessageBox(PChar(AppLangMgr.Trans('Duplicate index name.')), PChar(Application.Title), 48);
        IndexListView.SetFocus;
        IndexListView.Items[I].Selected := True;
        Result := False;
        Exit;
      end;
    end;

  AutoIncNum := 0;
  for I := 0 to FieldListView.Items.Count - 1 do
    if GetFieldNodeData(FieldListView.Items[I]).FieldType = ftAutoInc then
      Inc(AutoIncNum);
  if AutoIncNum > 1 then
  begin

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -