📄 newtablefrm.pas
字号:
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 + -