📄 editortable.pas
字号:
ColumnGrid.Options:=ColumnGrid.Options-[goRangeSelect];
//Activate Windows like edit of cell > DISABLED
//MouseEditTmr.Enabled:=True;
end;
end;
end;
procedure TEditorTableForm.TableNameEdExit(Sender: TObject);
var i, j: integer;
begin
if(EERTable.ObjName<>TableNameEd.Text)and
(TableNameEd.Text<>'')then
begin
//Check Reserved Words
if(EERModel.CheckReservedWord(TableNameEd.Text))then
TableNameEd.Text:=TableNameEd.Text+'_2';
//Check other Tables for same name
j:=0;
while(j=0)do
begin
j:=1;
for i:=0 to EERModel.ComponentCount-1 do
if(EERModel.Components[i].ClassnameIs('TEERTable'))then
begin
if(TEERTable(EERModel.Components[i]).ObjName=TableNameEd.Text)and
(TEERTable(EERModel.Components[i])<>EERTable)then
begin
try
TableNameEd.Text:=LeftStr(TableNameEd.Text, Length(TableNameEd.Text)-1)+IntToStr(StrToInt(RightStr(TableNameEd.Text, 1))+1)
except
TableNameEd.Text:=TableNameEd.Text+'_2';
end;
j:=0;
break;
end;
end;
end;
EERTable.ObjName:=TableNameEd.Text;
EERTable.Invalidate;
end;
end;
procedure TEditorTableForm.TablePageCBoxCloseUp(Sender: TObject);
begin
//TablePageControl.ActivePageIndex:=TablePageCBox.ItemIndex;
end;
procedure TEditorTableForm.ColumnGridMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var ACol, ARow: Longint;
i, xpos, xpos2: integer;
theRect: TRect;
theSize: TSize;
theDatatype: TEERDatatype;
selRect: TGridRect;
SetAutoInc: Boolean;
begin
if(Not(goRangeSelect in ColumnGrid.Options))then
ColumnGrid.Options:=ColumnGrid.Options+[goRangeSelect];
ColumnGrid.MouseToCell(X, Y, ACol, ARow);
if(ARow>0)and(ARow<=EERTable.Columns.Count)and(Button=mbLeft)then
begin
//Only select Colnames (except when cursor is over DefVal)
if(ACol<>3)and(ACol<>7)and(ACol<>8)then
begin
selRect.Left := 1;
selRect.Right := 1;
//When Shift is not pressed, select only on row
if(not(ssShift in Shift))then
begin
selRect.Top := ARow;
selRect.Bottom := ARow;
end
else
begin
selRect.Top := ColumnGrid.Selection.Top;
selRect.Bottom := ColumnGrid.Selection.Bottom;
end;
ColumnGrid.Selection:=selRect;
end;
//Primary Key
if(ACol=0)then
begin
//Not with FK Column
if(Not(TEERColumn(EERTable.Columns[ARow-1]).IsForeignKey))then
begin
TEERColumn(EERTable.Columns[ARow-1]).PrimaryKey:=
Not(TEERColumn(EERTable.Columns[ARow-1]).PrimaryKey);
ColumnGrid.Invalidate;
CheckPrimaryIndex;
end;
end;
//NotNull
if(ACol=4)then
begin
if(TEERColumn(EERTable.Columns[ARow-1]).PrimaryKey)then
MessageDlg(DMMain.GetTranslatedMessage('Columns of a primary key must not be NULL.', 95),
mtError, [mbOK], 0)
else
TEERColumn(EERTable.Columns[ARow-1]).NotNull:=
Not(TEERColumn(EERTable.Columns[ARow-1]).NotNull);
ColumnGrid.Invalidate;
end;
//Auto Inc
if(ACol=5)then
begin
//There can only be one AutoInc column
SetAutoInc:=Not(TEERColumn(EERTable.Columns[ARow-1]).AutoInc);
for i:=0 to EERTable.Columns.Count-1 do
TEERColumn(EERTable.Columns[i]).AutoInc:=False;
TEERColumn(EERTable.Columns[ARow-1]).AutoInc:=SetAutoInc;
ColumnGrid.Invalidate;
end;
//Options
if(ACol=6)then
begin
//Not with FK Column
if(Not(TEERColumn(EERTable.Columns[ARow-1]).IsForeignKey))then
begin
theDatatype:=TEERDatatype(EERModel.GetDataType(TEERColumn(EERTable.Columns[ARow-1]).idDatatype));
theRect:=ColumnGrid.CellRect(ACol, ARow);
xpos:=0;
for i:=0 to theDatatype.OptionCount-1 do
begin
theSize:=ColumnGrid.Canvas.TextExtent(theDatatype.Options[i]);
xpos2:=xpos;
xpos:=xpos+theSize.cx+16+5;
if(X-theRect.Left>=xpos2)and
(X-theRect.Left<xpos)then
TEERColumn(EERTable.Columns[ARow-1]).OptionSelected[i]:=
Not(TEERColumn(EERTable.Columns[ARow-1]).OptionSelected[i]);
end;
ColumnGrid.Invalidate;
end;
end;
end;
end;
procedure TEditorTableForm.DeleteColumnMIClick(Sender: TObject);
var theCol: TEERColumn;
i: integer;
begin
for i:=ColumnGrid.Selection.Top to ColumnGrid.Selection.Bottom do
begin
//Always take the first selected column, not i
//because each DeleteColumn will remove one column from
//the list
if(ColumnGrid.Selection.Top-1>=EERTable.Columns.Count)then
break;
theCol:=TEERColumn(EERTable.GetColumnByIndex(ColumnGrid.Selection.Top-1));
if(theCol=nil)then
continue;
if(theCol.IsForeignKey)then
if(MessageDlg(DMMain.GetTranslatedMessage('%s is a Foreign Key Column and '+
'was created automatically by a Relation. When this Editor is closed '+
'the Column will be added again.'+#13#10#13#10+
'To delete this Column permanently you have to remove the appropriate '+
'Relation.'+#13#10#13#10+
'Are you shure you want to delete the Column?', 2, theCol.ColName), mtConfirmation,
[mbYes, mbNo], 0)<>mrYes)then
continue;
EERTable.DeleteColumn(ColumnGrid.Selection.Top-1);
end;
ColumnGrid.RowCount:=EERTable.Columns.Count+2;
ColumnGrid.Repaint;
ShowIndex(EERTable.CheckPrimaryIndex);
end;
procedure TEditorTableForm.NewIndexBtnClick(Sender: TObject);
var theName: string;
theIndex: TEERIndex;
theID: integer;
begin
theID:=DMMain.GetNextGlobalID;
theName:=EERTable.ObjName+'_index'+IntToStr(theID);
if(DMMain.ShowStringEditor(DMMain.GetTranslatedMessage('Please enter the Index Name:', 96),
DMMain.GetTranslatedMessage('Name of Index:', 97),
theName, Length(EERTable.ObjName)+1))then
begin
//new(theIndex);
theIndex:=TEERIndex.Create(EERTable);
theIndex.Obj_id:=theID;
theIndex.IndexName:=theName;
theIndex.IndexKind:=ik_INDEX;
EERTable.Indices.Add(theIndex);
theIndex.Pos:=EERTable.Indices.Count-1;
ShowIndex(theIndex.Obj_id);
end;
end;
procedure TEditorTableForm.CheckPrimaryIndex;
begin
ShowIndex(EERTable.CheckPrimaryIndex);
end;
procedure TEditorTableForm.ShowIndex(index_id: integer);
var i, j: integer;
s: string;
theEERColumn: TEERColumn;
begin
//Reset Fields
IndexListBox.Items.Clear;
IndexNameEd.Text:='';
IndexTypeCBox.ItemIndex:=-1;
IndexColListBox.Clear;
//Display the Index
for i:=0 to EERTable.Indices.Count-1 do
begin
IndexListBox.Items.Add(TEERIndex(EERTable.Indices[i]).IndexName);
if(TEERIndex(EERTable.Indices[i]).Obj_id=index_id)then
begin
IndexListBox.ItemIndex:=i;
IndexNameEd.Text:=TEERIndex(EERTable.Indices[i]).IndexName;
IndexTypeCBox.ItemIndex:=TEERIndex(EERTable.Indices[i]).IndexKind;
j:=0;
while(j<TEERIndex(EERTable.Indices[i]).Columns.Count)do
begin
s:=TEERIndex(EERTable.Indices[i]).ColumnParams.Values[TEERIndex(EERTable.Indices[i]).Columns[j]];
//Check if column still exists
theEERColumn:=EERTable.GetColumnByID(StrToInt(TEERIndex(EERTable.Indices[i]).Columns[j]));
if(theEERColumn<>nil)then
begin
if(s<>'')then
s:=TEERColumn(theEERColumn).ColName+'('+s+')'
else
s:=TEERColumn(theEERColumn).ColName;
IndexColListBox.Items.Add(s);
inc(j);
end
//if not, delete it
else
TEERIndex(EERTable.Indices[i]).Columns.Delete(j);
end;
if(CompareText(TEERIndex(EERTable.Indices[i]).IndexName, 'PRIMARY')=0)then
begin
IndexNameEd.Enabled:=False;
IndexTypeCBox.Enabled:=False;
end
else
begin
IndexNameEd.Enabled:=True;
IndexTypeCBox.Enabled:=True;
end;
if(TEERIndex(EERTable.Indices[i]).FKRefDef_Obj_id>-1)then
begin
IndexColListBox.Enabled:=False;
IndexColListBox.Color:=clBackground;
end
else
begin
IndexColListBox.Enabled:=True;
IndexColListBox.Color:=clBase;
end;
end;
end;
if(index_id=-1)and(IndexTypeCBox.Items.Count>0)then
IndexTypeCBox.ItemIndex:=0;
if(IndexColListBox.Items.Count>0)then
IndexColListBox.ItemIndex:=0;
end;
procedure TEditorTableForm.IndexColListBoxDragOver(Sender, Source: TObject;
X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
Accept:=False;
if(Source<>nil)then
begin
if(Source.ClassNameIs('TDrawGrid'))then
if(TDrawGrid(Source).Name='ColumnGrid')then
Accept:=True;
if(Sender=Source)then
Accept:=True;
end;
end;
procedure TEditorTableForm.IndexColListBoxDragDrop(Sender, Source: TObject;
X, Y: Integer);
var theIndex: TEERIndex;
newPos: integer;
s: string;
begin
if(Source.ClassNameIs('TDrawGrid'))then
if(TDrawGrid(Source).Name='ColumnGrid')and
(IndexListBox.ItemIndex>-1)and
(IndexListBox.ItemIndex<=EERTable.Indices.Count-1)then
begin
theIndex:=TEERIndex(EERTable.Indices[IndexListBox.ItemIndex]);
//Every Column only once in index
if(ColumnGrid.Row>=0)and
(ColumnGrid.Row-1<EERTable.Columns.Count)then
begin
if(theIndex.Columns.IndexOf(IntToStr(TEERColumn(EERTable.Columns[ColumnGrid.Row-1]).Obj_id))=-1)then
begin
theIndex.Columns.Add(IntToStr(TEERColumn(EERTable.Columns[ColumnGrid.Row-1]).Obj_id));
if(CompareText(theIndex.IndexName, 'PRIMARY')=0)then
begin
TEERColumn(EERTable.Columns[ColumnGrid.Row-1]).PrimaryKey:=True;
ColumnGrid.Invalidate;
end;
ShowIndex(theIndex.Obj_id);
end;
end;
end;
if(Source.ClassNameIs('TListBox'))then
if(TDrawGrid(Source).Name='IndexColListBox')then
begin
with IndexColListBox do
begin
newPos:=ItemAtPos(Point(X, Y), True);
if(newPos>-1)and(newPos<>DragStartRow)then
begin
s:=Items[DragStartRow];
Items.Delete(DragStartRow);
Items.Insert(newPos, s);
s:=TEERIndex(EERTable.Indices[IndexListBox.ItemIndex]).Columns[DragStartRow];
TEERIndex(EERTable.Indices[IndexListBox.ItemIndex]).Columns.Delete(DragStartRow);
TEERIndex(EERTable.Indices[IndexListBox.ItemIndex]).Columns.Insert(newPos, s);
end;
end;
end;
end;
procedure TEditorTableForm.DeleteColFromIndexBtnClick(Sender: TObject);
var theIndex: TEERIndex;
begin
if(IndexColListBox.ItemIndex>-1)and(IndexColListBox.Enabled)then
begin
theIndex:=TEERIndex(EERTable.Indices[IndexListBox.ItemIndex]);
if(CompareText(theIndex.IndexName, 'PRIMARY')=0)then
begin
TEERColumn(EERTable.GetColumnByID(StrToInt(theIndex.Columns[IndexColListBox.ItemIndex]))).PrimaryKey:=False;
ColumnGrid.Invalidate;
end;
theIndex.Columns.Delete(theIndex.Columns.IndexOf(theIndex.Columns[IndexColListBox.ItemIndex]));
ShowIndex(theIndex.Obj_id);
end;
end;
procedure TEditorTableForm.RefreshCurrentIndex;
begin
if(IndexListBox.ItemIndex>-1)then
ShowIndex(TEERIndex(EERTable.Indices[IndexListBox.ItemIndex]).Obj_id);
end;
procedure TEditorTableForm.IndexListBoxClick(Sender: TObject);
begin
RefreshCurrentIndex;
end;
procedure TEditorTableForm.IndexListBoxDblClick(Sender: TObject);
var theName: string;
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -