📄 editortable.pas
字号:
Pen.Color:=clWhite;
MoveTo(Rect.Left, Rect.Top+1);
LineTo(Rect.Right, Rect.Top+1);
Pen.Color:=clGray;
MoveTo(Rect.Left, Rect.Bottom-2);
LineTo(Rect.Right-1{$IFDEF LINUX}+1{$ENDIF}, Rect.Bottom-2);
if(ACol<>0)and(ACol<>2)then
begin
MoveTo(Rect.Right-2, Rect.Bottom-2);
LineTo(Rect.Right-2, Rect.Top+1);
end;
Pen.Color:=clShadow;
MoveTo(Rect.Left, Rect.Bottom-1);
LineTo(Rect.Right-1{$IFDEF LINUX}+1{$ENDIF}, Rect.Bottom-1);
if(ACol<>0)and(ACol<>2)then
LineTo(Rect.Right-1{$IFDEF LINUX}+1{$ENDIF}, Rect.Top);
if(ColumnGridColumnCaptions.Count=7)then
begin
Case ACol of
1:
TextOut(Rect.Left+1-18, Rect.Top+2, ColumnGridColumnCaptions[0]);
3:
TextOut(Rect.Left+1-18, Rect.Top+2, ColumnGridColumnCaptions[1]);
4:
TextOut(Rect.Left+1, Rect.Top+2, ColumnGridColumnCaptions[2]);
5:
TextOut(Rect.Left+4, Rect.Top+2, ColumnGridColumnCaptions[3]);
6:
TextOut(Rect.Left+3, Rect.Top+2, ColumnGridColumnCaptions[4]);
7:
TextOut(Rect.Left+3, Rect.Top+2, ColumnGridColumnCaptions[5]);
8:
TextOut(Rect.Left+3, Rect.Top+2, ColumnGridColumnCaptions[6]);
end;
end;
end;
end;
end;
procedure TEditorTableForm.ColumnGridSelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
if(ARow=0)or(ACol=0)or(ACol=2)or(ACol=4)or(ACol=5)or(ACol=6)then
CanSelect:=False
else
CanSelect:=True;
end;
procedure TEditorTableForm.ColumnGridDragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
begin
Accept:=False;
if(Source<>nil)then
begin
if(Source.Classname='TListView')then
begin
if(TListView(Source).Name='CommonDataTypesListView')then
Accept:=True;
end;
if(Source.Classname='TTreeView')then
begin
if(TTreeView(Source).Name='AllDataTypesTV')then
Accept:=True;
end;
if(Source=Sender)then
Accept:=True;
end;
end;
procedure TEditorTableForm.ColumnGridDragDrop(Sender, Source: TObject; X,
Y: Integer);
var ACol, ARow: Longint;
i, j: integer;
DropedDataType: TEERDatatype;
theCol: TEERColumn;
begin
DropedDataType:=nil;
ColumnGrid.MouseToCell(X, Y, ACol, ARow);
if(ARow>0)and(ARow<=EERTable.Columns.Count)then
begin
if(Source.Classname='TListView')then
begin
if(TListView(Source).Name='CommonDataTypesListView')then
begin
if(TListView(Source).Selected<>nil)then
if(TListView(Source).Selected.Data<>nil)then
DropedDataType:=TEERDatatype(TListView(Source).Selected.Data);
end
end;
if(Source.Classname='TTreeView')then
begin
if(TTreeView(Source).Name='AllDataTypesTV')then
begin
if(TTreeView(Source).Selected<>nil)then
if(TTreeView(Source).Selected.Data<>nil)then
DropedDataType:=TEERDatatype(TTreeView(Source).Selected.Data);
end;
end;
if(Assigned(DropedDataType))then
begin
//If not ParamRequired, assign datatype to all selected
if(DropedDataType.ParamRequired)or
(ColumnGrid.Selection.Top=ColumnGrid.Selection.Bottom)then
begin
//Assign Datatype to the Column
TEERColumn(EERTable.Columns[ARow-1]).idDatatype:=
DropedDataType.id;
//Clear DatatypeParams
TEERColumn(EERTable.Columns[ARow-1]).DatatypeParams:='';
//Get Option Defaults
for i:=0 to DropedDataType.OptionCount-1 do
TEERColumn(EERTable.Columns[ARow-1]).OptionSelected[i]:=
DropedDataType.OptionDefaults[i];
end
else
begin
for i:=ColumnGrid.Selection.Top-1 to ColumnGrid.Selection.Bottom-1 do
begin
if(i>=EERTable.Columns.Count)then
break;
theCol:=TEERColumn(EERTable.GetColumnByIndex(i));
if(theCol=nil)then
continue;
if(theCol.IsForeignKey)then
continue;
theCol.idDatatype:=DropedDataType.id;
theCol.DatatypeParams:='';
for j:=0 to DropedDataType.OptionCount-1 do
theCol.OptionSelected[j]:=
DropedDataType.OptionDefaults[j];
end;
end;
ColumnGrid.Col:=3;
ColumnGrid.Row:=ARow;
ColumnGrid.Invalidate;
if(DropedDataType.ParamRequired)then
EditDatatype;
end
else if(Source=Sender)then
begin
if(ARow<>DragStartRow)then
begin
//if(ssShift in DragShiftState)and(ssCtrl in DragShiftState)then
if(ssShift in Application.KeyState)and
(ssCtrl in Application.KeyState)then
begin
//when Ctrl+Shift is pressed assign same datatype
theCol:=TEERColumn(EERTable.Columns[ARow-1]);
theCol.idDatatype:=TEERColumn(EERTable.Columns[DragStartRow-1]).idDatatype;
theCol.DatatypeParams:=TEERColumn(EERTable.Columns[DragStartRow-1]).DatatypeParams;
end
else
begin
//Switch both columns in position
EERTable.Columns.Move(DragStartRow-1, ARow-1);
end;
ColumnGrid.Invalidate;
end;
end;
end;
end;
procedure TEditorTableForm.TableNameEdKeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
if(Key=Key_Return)then
begin
ColumnGrid.SetFocus;
EditCellStr;
end;
end;
procedure TEditorTableForm.ColumnGridKeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
if(Key=Key_Tab)or(Key=Key_Right)then
begin
if(ColumnGrid.Col=8)and(Key=Key_Right)then
ColumnGrid.Col:=1
else if(ColumnGrid.Col=8)and(Key=Key_Tab)then
begin
ColumnGrid.Col:=1;
//Go down one row
if(ColumnGrid.Row<ColumnGrid.RowCount-1)then
ColumnGrid.Row:=ColumnGrid.Row+1;
//When in last row, cursor one down and edit, to create new
if(ColumnGrid.Row=ColumnGrid.RowCount-1)then
Key:=Key_Return;
end
else if(ColumnGrid.Col=3)then
begin
ColumnGrid.Col:=7;
Key:=0;
end
else if(ColumnGrid.Col=1)then
ColumnGrid.Col:=3;
end;
if(Key=Key_Left)then
begin
if(ColumnGrid.Col=3)then
ColumnGrid.Col:=1
else if(ColumnGrid.Col=7)then
ColumnGrid.Col:=3
else if(ColumnGrid.Col=1)then
begin
ColumnGrid.Col:=8;
Key:=0;
end;
end;
//Use StringEditor
if(Key=Key_Return)or(Key=Key_Enter)then
begin
if(ColumnGrid.Col=1)or(ColumnGrid.Col=7)or(ColumnGrid.Col=8)then
EditCellStr;
if(ColumnGrid.Col=3)then
EditDatatype;
end;
if((Not(DoCellEdit))and
((Key>=Ord('a'))and(Key<=Ord('z')))or
((Key>=Ord('A'))and(Key<=Ord('Z'))))then
begin
if(ColumnGrid.Col=1)or(ColumnGrid.Col=7)or(ColumnGrid.Col=8)then
if(Shift=[ssShift])then
EditCellStr(Chr(Key))
else
EditCellStr(Chr(Key-Ord('A')+Ord('a')));
end;
if(Key=Key_Delete)then
begin
DeleteColumnMIClick(self);
end;
if(Key=Key_Insert)then
begin
InsertColumn;
end;
end;
procedure TEditorTableForm.InsertColumn;
var theColumn: TEERColumn;
i: integer;
begin
//Insert new column
theColumn:=TEERColumn.Create(EERTable);
try
theColumn.ColName:='';
theColumn.PrevColName:='';
theColumn.Obj_id:=DMMain.GetNextGlobalID;
theColumn.Pos:=ColumnGrid.Row-1;
theColumn.idDatatype:=TEERModel(EERModel).DefaultDataType;
theColumn.DatatypeParams:='';
theColumn.Width:=-1;
theColumn.Prec:=-1;
theColumn.PrimaryKey:=(ColumnGrid.Row=0);
theColumn.NotNull:=(ColumnGrid.Row=0);
theColumn.AutoInc:=False;
theColumn.IsForeignKey:=False;
if(TEERModel(EERModel).GetDataType(theColumn.idDatatype)=nil)then
raise EInOutError.Create('The Datatype of the column cannot be found. '#13#10+
'idDatatype: '+IntToStr(theColumn.idDatatype));
//Get Option Defaults
for i:=0 to TEERDatatype(TEERModel(EERModel).GetDataType(theColumn.idDatatype)).OptionCount-1 do
theColumn.OptionSelected[i]:=
TEERDatatype(TEERModel(EERModel).GetDataType(theColumn.idDatatype)).OptionDefaults[i];
theColumn.DefaultValue:='';
EERTable.Columns.Insert(ColumnGrid.Row-1, theColumn);
//Add an empty row an go down there
ColumnGrid.RowCount:=ColumnGrid.RowCount+1;
except
theColumn.Free;
end;
ColumnGrid.Refresh;
EditCellStr('');
end;
procedure TEditorTableForm.EditDatatype;
begin
if(ColumnGrid.Row<=EERTable.Columns.Count)then
begin
//User must not edit datatype of FK Column
if(Not(TEERColumn(EERTable.Columns[ColumnGrid.Row-1]).IsForeignKey))or
(Not(DMEER.SyncDatatypesOfForeignKeys))then
begin
DoCellEdit:=False;
EditorTableFieldDatatypeInplaceEditor.SetData(EERModel, self,
TEERColumn(EERTable.Columns[ColumnGrid.Row-1]),
EERModel.GetDataType(TEERColumn(EERTable.Columns[ColumnGrid.Row-1]).idDatatype),
TEERColumn(EERTable.Columns[ColumnGrid.Row-1]).DatatypeParams,
MidLeftPnl.Width+ColumnGrid.ColWidths[0]+ColumnGrid.ColWidths[1]+ColumnGrid.ColWidths[2]+1,
MidPnl.Top+19*(ColumnGrid.Row-ColumnGrid.TopRow+1)+2);
DoCellEdit:=True;
end;
end;
end;
procedure TEditorTableForm.EditCellStr(NewName: string = '');
var doIt: Boolean;
begin
DoCellEdit:=False;
if(ColumnGrid.Row<=EERTable.Columns.Count)or
((ColumnGrid.Row>EERTable.Columns.Count)and(ColumnGrid.Col=1))then
begin
doIt:=True;
//User must not edit name of FK Column
if(ColumnGrid.Row<=EERTable.Columns.Count)and(ColumnGrid.Col=1)then
if(TEERColumn(EERTable.Columns[ColumnGrid.Row-1]).IsForeignKey)then
doIt:=False;
if(doIt)then
begin
TEditorTableFieldEdit(EditorTableFieldEdit).SetData(self, ColumnGrid.Col, ColumnGrid.Row-1, NewName);
EditorTableFieldEdit.Show;
EditorTableFieldEdit.BringToFront;
EditorTableFieldEdit.SetFocus;
if(NewName<>'')then
begin
EditorTableFieldEdit.SelStart:=Length(NewName);
EditorTableFieldEdit.SelLength:=0;
end;
DoCellEdit:=True;
end;
end;
end;
procedure TEditorTableForm.ColumnGridMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var ACol, ARow: Longint;
theRect: TGridRect;
tmpCol: integer;
begin
ColumnGrid.MouseToCell(X, Y, ACol, ARow);
if(DoCellEdit=False)and(Button=mbLeft)then
TEditorTableFieldEdit(EditorTableFieldEdit).ApplyChanges;
{if(ACol=3)then
begin
EditDatatype;
Exit;
end;}
//Activate Windows like edit of cell
if(Button=mbLeft)then
begin
if(MouseEditTmr.Enabled=True)and(DragStartRow=ARow)and(LastClickedCol=ACol)then
begin
DoCellEdit:=True;
end
else
begin
if(Not(ssShift in Shift))then
begin
tmpCol:=ACol;
if(tmpCol=0)or(tmpCol=2)or(tmpCol=4)or(tmpCol=5)or(tmpCol=6)then
tmpCol:=1;
theRect.Left := tmpCol;
theRect.Top := ARow;
theRect.Right := tmpCol;
theRect.Bottom := ARow;
ColumnGrid.Selection:=theRect;
end;
DragStartRow:=ARow;
LastClickedCol:=ACol;
//DragShiftState:=Shift;
ColumnGrid.BeginDrag(False, 5);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -