mirror of
https://github.com/HeidiSQL/HeidiSQL.git
synced 2025-08-26 11:17:57 +08:00
Make more use of Generics, this time for columns, keys and foreigne keys lists, used by main unit and table editor. Frees code from annoying casting and makes it more type safe.
This commit is contained in:
@ -175,7 +175,9 @@ type
|
||||
{ Private declarations }
|
||||
FLoaded: Boolean;
|
||||
CreateCodeValid, AlterCodeValid: Boolean;
|
||||
FColumns, FKeys, FForeignKeys: TObjectList;
|
||||
FColumns: TTableColumnList;
|
||||
FKeys: TTableKeyList;
|
||||
FForeignKeys: TForeignKeyList;
|
||||
DeletedKeys, DeletedForeignKeys: TWideStringList;
|
||||
procedure ValidateColumnControls;
|
||||
procedure ValidateIndexControls;
|
||||
@ -226,9 +228,9 @@ begin
|
||||
Mainform.RestoreListSetup(listForeignKeys);
|
||||
comboRowFormat.Items.CommaText := 'DEFAULT,DYNAMIC,FIXED,COMPRESSED,REDUNDANT,COMPACT';
|
||||
comboInsertMethod.Items.CommaText := 'NO,FIRST,LAST';
|
||||
FColumns := TObjectList.Create;
|
||||
FKeys := TObjectList.Create;
|
||||
FForeignKeys := TObjectList.Create;
|
||||
FColumns := TTableColumnList.Create;
|
||||
FKeys := TTableKeyList.Create;
|
||||
FForeignKeys := TForeignKeyList.Create;
|
||||
DeletedKeys := TWideStringList.Create;
|
||||
DeletedForeignKeys := TWideStringList.Create;
|
||||
editName.MaxLength := NAME_LEN;
|
||||
@ -358,8 +360,6 @@ var
|
||||
sql: String;
|
||||
i: Integer;
|
||||
Specs: TWideStringlist;
|
||||
Key: TForeignKey;
|
||||
Col: TTableColumn;
|
||||
begin
|
||||
// Create or alter table
|
||||
Specs := TWideStringList.Create;
|
||||
@ -373,9 +373,8 @@ begin
|
||||
// "You cannot add a foreign key and drop a foreign key in separate clauses of a single
|
||||
// ALTER TABLE statement. Separate statements are required."
|
||||
for i:=0 to FForeignKeys.Count-1 do begin
|
||||
Key := FForeignKeys[i] as TForeignKey;
|
||||
if Key.Modified and (not Key.Added) then
|
||||
Specs.Add('DROP FOREIGN KEY '+Mainform.mask(Key.KeyName));
|
||||
if FForeignKeys[i].Modified and (not FForeignKeys[i].Added) then
|
||||
Specs.Add('DROP FOREIGN KEY '+Mainform.mask(FForeignKeys[i].KeyName));
|
||||
end;
|
||||
end;
|
||||
try
|
||||
@ -386,9 +385,8 @@ begin
|
||||
if chkCharsetConvert.Checked then begin
|
||||
// Autoadjust column collations
|
||||
for i:=0 to FColumns.Count-1 do begin
|
||||
Col := FColumns[i] as TTableColumn;
|
||||
if Col.Collation <> '' then
|
||||
Col.Collation := comboCollation.Text;
|
||||
if FColumns[i].Collation <> '' then
|
||||
FColumns[i].Collation := comboCollation.Text;
|
||||
end;
|
||||
end;
|
||||
// Set table name for altering if Apply was clicked
|
||||
@ -408,9 +406,6 @@ end;
|
||||
procedure TfrmTableEditor.ResetModificationFlags;
|
||||
var
|
||||
i: Integer;
|
||||
Col: TTableColumn;
|
||||
TblKey: TTableKey;
|
||||
ForeignKey: TForeignKey;
|
||||
begin
|
||||
// Enable converting data for an existing table
|
||||
chkCharsetConvertClick(comboCollation);
|
||||
@ -421,25 +416,22 @@ begin
|
||||
Components[i].Tag := NotModifiedFlag;
|
||||
// Reset column changes
|
||||
for i:=FColumns.Count-1 downto 0 do begin
|
||||
Col := FColumns[i] as TTableColumn;
|
||||
if Col.Status = esDeleted then
|
||||
if FColumns[i].Status = esDeleted then
|
||||
FColumns.Delete(i)
|
||||
else begin
|
||||
Col.Status := esUntouched;
|
||||
Col.OldName := '';
|
||||
FColumns[i].Status := esUntouched;
|
||||
FColumns[i].OldName := '';
|
||||
end;
|
||||
end;
|
||||
DeletedKeys.Clear;
|
||||
for i:=0 to FKeys.Count-1 do begin
|
||||
TblKey := FKeys[i] as TTableKey;
|
||||
TblKey.Added := False;
|
||||
TblKey.Modified := False;
|
||||
FKeys[i].Added := False;
|
||||
FKeys[i].Modified := False;
|
||||
end;
|
||||
DeletedForeignKeys.Clear;
|
||||
for i:=0 to FForeignKeys.Count-1 do begin
|
||||
ForeignKey := FForeignKeys[i] as TForeignKey;
|
||||
ForeignKey.Added := False;
|
||||
ForeignKey.Modified := False;
|
||||
FForeignKeys[i].Added := False;
|
||||
FForeignKeys[i].Modified := False;
|
||||
end;
|
||||
Modified := False;
|
||||
btnSave.Enabled := Modified;
|
||||
@ -453,10 +445,7 @@ var
|
||||
ColSpec, OldColName, IndexSQL: String;
|
||||
i: Integer;
|
||||
Results: TMySQLQuery;
|
||||
TblKey: TTableKey;
|
||||
ForeignKey: TForeignKey;
|
||||
Col, PreviousCol: PTableColumn;
|
||||
ColObj: TTableColumn;
|
||||
Node: PVirtualNode;
|
||||
begin
|
||||
// Compose ALTER query, called by buttons and for SQL code tab
|
||||
@ -551,11 +540,10 @@ begin
|
||||
|
||||
// Deleted columns, not available as Node in above loop
|
||||
for i:=0 to FColumns.Count-1 do begin
|
||||
ColObj := FColumns[i] as TTableColumn;
|
||||
if ColObj.Status = esDeleted then begin
|
||||
OldColName := ColObj.OldName;
|
||||
if FColumns[i].Status = esDeleted then begin
|
||||
OldColName := FColumns[i].OldName;
|
||||
if OldColName = '' then
|
||||
OldColName := ColObj.Name;
|
||||
OldColName := FColumns[i].Name;
|
||||
Specs.Add('DROP COLUMN '+Mainform.mask(OldColName));
|
||||
end;
|
||||
end;
|
||||
@ -572,23 +560,21 @@ begin
|
||||
// Add changed or added indexes
|
||||
for i:=0 to FKeys.Count-1 do begin
|
||||
Mainform.ProgressBarStatus.StepIt;
|
||||
TblKey := FKeys[i] as TTableKey;
|
||||
if TblKey.Modified and (not TblKey.Added) then begin
|
||||
if TblKey.IndexType = PKEY then
|
||||
if FKeys[i].Modified and (not FKeys[i].Added) then begin
|
||||
if FKeys[i].IndexType = PKEY then
|
||||
IndexSQL := 'PRIMARY KEY'
|
||||
else
|
||||
IndexSQL := 'INDEX ' + Mainform.Mask(TblKey.OldName);
|
||||
IndexSQL := 'INDEX ' + Mainform.Mask(FKeys[i].OldName);
|
||||
Specs.Add('DROP '+IndexSQL);
|
||||
end;
|
||||
if TblKey.Added or TblKey.Modified then
|
||||
if FKeys[i].Added or FKeys[i].Modified then
|
||||
Specs.Add('ADD '+GetIndexSQL(i));
|
||||
end;
|
||||
|
||||
for i:=0 to DeletedForeignKeys.Count-1 do
|
||||
Specs.Add('DROP FOREIGN KEY '+Mainform.mask(DeletedForeignKeys[i]));
|
||||
for i:=0 to FForeignKeys.Count-1 do begin
|
||||
ForeignKey := FForeignKeys[i] as TForeignKey;
|
||||
if ForeignKey.Added or ForeignKey.Modified then
|
||||
if FForeignKeys[i].Added or FForeignKeys[i].Modified then
|
||||
Specs.Add('ADD '+GetForeignKeySQL(i));
|
||||
end;
|
||||
|
||||
@ -679,29 +665,27 @@ end;
|
||||
|
||||
function TfrmTableEditor.GetIndexSQL(idx: Integer): String;
|
||||
var
|
||||
TblKey: TTableKey;
|
||||
i: Integer;
|
||||
begin
|
||||
Result := '';
|
||||
TblKey := FKeys[idx] as TTableKey;
|
||||
// Supress SQL error trying index creation with 0 column
|
||||
if TblKey.Columns.Count = 0 then
|
||||
if FKeys[idx].Columns.Count = 0 then
|
||||
Exit;
|
||||
if TblKey.IndexType = PKEY then
|
||||
if FKeys[idx].IndexType = PKEY then
|
||||
Result := Result + 'PRIMARY KEY '
|
||||
else begin
|
||||
if TblKey.IndexType <> KEY then
|
||||
Result := Result + TblKey.IndexType + ' ';
|
||||
Result := Result + 'INDEX ' + Mainform.Mask(TblKey.Name) + ' ';
|
||||
if FKeys[idx].IndexType <> KEY then
|
||||
Result := Result + FKeys[idx].IndexType + ' ';
|
||||
Result := Result + 'INDEX ' + Mainform.Mask(FKeys[idx].Name) + ' ';
|
||||
end;
|
||||
Result := Result + '(';
|
||||
for i:=0 to TblKey.Columns.Count-1 do begin
|
||||
Result := Result + Mainform.Mask(TblKey.Columns[i]);
|
||||
if TblKey.SubParts[i] <> '' then
|
||||
Result := Result + '(' + TblKey.SubParts[i] + ')';
|
||||
for i:=0 to FKeys[idx].Columns.Count-1 do begin
|
||||
Result := Result + Mainform.Mask(FKeys[idx].Columns[i]);
|
||||
if FKeys[idx].SubParts[i] <> '' then
|
||||
Result := Result + '(' + FKeys[idx].SubParts[i] + ')';
|
||||
Result := Result + ', ';
|
||||
end;
|
||||
if TblKey.Columns.Count > 0 then
|
||||
if FKeys[idx].Columns.Count > 0 then
|
||||
Delete(Result, Length(Result)-1, 2);
|
||||
|
||||
Result := Result + ')';
|
||||
@ -713,7 +697,7 @@ var
|
||||
Key: TForeignKey;
|
||||
i: Integer;
|
||||
begin
|
||||
Key := FForeignKeys[idx] as TForeignKey;
|
||||
Key := FForeignKeys[idx];
|
||||
Result := 'CONSTRAINT '+Mainform.mask(Key.KeyName)+' FOREIGN KEY (';
|
||||
for i:=0 to Key.Columns.Count-1 do
|
||||
Result := Result + Mainform.mask(Key.Columns[i]) + ', ';
|
||||
@ -1026,7 +1010,7 @@ var
|
||||
begin
|
||||
// Bind data to node
|
||||
Col := Sender.GetNodeData(Node);
|
||||
Col^ := FColumns[Node.Index] as TTableColumn;
|
||||
Col^ := FColumns[Node.Index];
|
||||
end;
|
||||
|
||||
|
||||
@ -1036,15 +1020,13 @@ procedure TfrmTableEditor.listColumnsGetImageIndex(Sender: TBaseVirtualTree;
|
||||
var
|
||||
i: Integer;
|
||||
Col: PTableColumn;
|
||||
TblKey: TTableKey;
|
||||
begin
|
||||
// Primary key icon
|
||||
if Column <> 0 then Exit;
|
||||
Col := Sender.GetNodeData(Node);
|
||||
|
||||
for i:=0 to FKeys.Count-1 do begin
|
||||
TblKey := FKeys[i] as TTableKey;
|
||||
if TblKey.Columns.IndexOf(Col.Name) > -1 then
|
||||
if FKeys[i].Columns.IndexOf(Col.Name) > -1 then
|
||||
ImageIndex := GetIndexIcon(i);
|
||||
// Priority for PK columns. We cannot display more than one icon anyway.
|
||||
if ImageIndex > -1 then
|
||||
@ -1066,13 +1048,11 @@ var
|
||||
TextColor: TColor;
|
||||
i: Integer;
|
||||
Col: PTableColumn;
|
||||
TblKey: TTableKey;
|
||||
begin
|
||||
Col := Sender.GetNodeData(Node);
|
||||
// Bold font for primary key columns
|
||||
for i:=0 to FKeys.Count-1 do begin
|
||||
TblKey := FKeys[i] as TTableKey;
|
||||
if (TblKey.IndexType = PKEY) and (TblKey.Columns.IndexOf(Col.Name) > -1) then begin
|
||||
if (FKeys[i].IndexType = PKEY) and (FKeys[i].Columns.IndexOf(Col.Name) > -1) then begin
|
||||
TargetCanvas.Font.Style := TargetCanvas.Font.Style + [fsBold];
|
||||
break;
|
||||
end;
|
||||
@ -1291,13 +1271,13 @@ begin
|
||||
Exit;
|
||||
if treeIndexes.GetNodeLevel(Node) = 1 then
|
||||
Node := Node.Parent;
|
||||
TblKey := FKeys[Node.Index] as TTableKey;
|
||||
TblKey := FKeys[Node.Index];
|
||||
// Find the first unused column for that index as default
|
||||
ColExists := False;
|
||||
NewCol := '';
|
||||
PartLength := '';
|
||||
for i:=0 to FColumns.Count-1 do begin
|
||||
Column := FColumns[i] as TTableColumn;
|
||||
Column := FColumns[i];
|
||||
if Column.Status = esDeleted then
|
||||
Continue;
|
||||
for j:=0 to TblKey.Columns.Count - 1 do begin
|
||||
@ -1325,22 +1305,19 @@ procedure TfrmTableEditor.btnRemoveIndexClick(Sender: TObject);
|
||||
var
|
||||
idx: Integer;
|
||||
NewSelectNode: PVirtualNode;
|
||||
TblKey: TTableKey;
|
||||
begin
|
||||
// Remove index or part
|
||||
case treeIndexes.GetNodeLevel(treeIndexes.FocusedNode) of
|
||||
0: begin
|
||||
idx := treeIndexes.FocusedNode.Index;
|
||||
TblKey := FKeys[idx] as TTableKey;
|
||||
if not TblKey.Added then
|
||||
DeletedKeys.Add(TblKey.OldName);
|
||||
if not FKeys[idx].Added then
|
||||
DeletedKeys.Add(FKeys[idx].OldName);
|
||||
FKeys.Delete(idx);
|
||||
end;
|
||||
1: begin
|
||||
idx := treeIndexes.FocusedNode.Parent.Index;
|
||||
TblKey := FKeys[idx] as TTableKey;
|
||||
TblKey.Columns.Delete(treeIndexes.FocusedNode.Index);
|
||||
TblKey.SubParts.Delete(treeIndexes.FocusedNode.Index);
|
||||
FKeys[idx].Columns.Delete(treeIndexes.FocusedNode.Index);
|
||||
FKeys[idx].SubParts.Delete(treeIndexes.FocusedNode.Index);
|
||||
treeIndexes.DeleteNode(treeIndexes.FocusedNode);
|
||||
end;
|
||||
end;
|
||||
@ -1402,7 +1379,7 @@ begin
|
||||
// Index tree showing cell text
|
||||
case Sender.GetNodeLevel(Node) of
|
||||
0: begin
|
||||
TblKey := FKeys[Node.Index] as TTableKey;
|
||||
TblKey := FKeys[Node.Index];
|
||||
case Column of
|
||||
0: if TblKey.IndexType = PKEY then
|
||||
CellText := TblKey.IndexType + ' KEY' // Fixed name "PRIMARY KEY", cannot be changed
|
||||
@ -1412,7 +1389,7 @@ begin
|
||||
end;
|
||||
end;
|
||||
1: begin
|
||||
TblKey := FKeys[Node.Parent.Index] as TTableKey;
|
||||
TblKey := FKeys[Node.Parent.Index];
|
||||
case Column of
|
||||
0: CellText := TblKey.Columns[Node.Index];
|
||||
1: CellText := TblKey.SubParts[Node.Index];
|
||||
@ -1424,12 +1401,9 @@ end;
|
||||
|
||||
procedure TfrmTableEditor.treeIndexesInitChildren(Sender: TBaseVirtualTree;
|
||||
Node: PVirtualNode; var ChildCount: Cardinal);
|
||||
var
|
||||
TblKey: TTableKey;
|
||||
begin
|
||||
// Tell number of columns contained in index
|
||||
TblKey := FKeys[Node.Index] as TTableKey;
|
||||
ChildCount := TblKey.Columns.Count;
|
||||
ChildCount := FKeys[Node.Index].Columns.Count;
|
||||
end;
|
||||
|
||||
|
||||
@ -1492,7 +1466,6 @@ procedure TfrmTableEditor.treeIndexesEditing(Sender: TBaseVirtualTree;
|
||||
var
|
||||
VT: TVirtualStringtree;
|
||||
IndexedColName: String;
|
||||
Col: TTableColumn;
|
||||
i: Integer;
|
||||
begin
|
||||
VT := Sender as TVirtualStringtree;
|
||||
@ -1505,9 +1478,8 @@ begin
|
||||
// Column length is allowed for (var)char/text types only, even mandantory for text and blobs
|
||||
IndexedColName := VT.Text[Node, 0];
|
||||
for i:=0 to FColumns.Count-1 do begin
|
||||
Col := FColumns[i] as TTableColumn;
|
||||
if Col.Name = IndexedColName then begin
|
||||
Allowed := Col.DataType.Category = dtcText;
|
||||
if FColumns[i].Name = IndexedColName then begin
|
||||
Allowed := FColumns[i].DataType.Category = dtcText;
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
@ -1560,7 +1532,7 @@ begin
|
||||
VT := Sender as TVirtualStringtree;
|
||||
case VT.GetNodeLevel(Node) of
|
||||
0: begin
|
||||
TblKey := FKeys[Node.Index] as TTableKey;
|
||||
TblKey := FKeys[Node.Index];
|
||||
case Column of
|
||||
0: TblKey.Name := NewText;
|
||||
1: TblKey.IndexType := NewText;
|
||||
@ -1569,7 +1541,7 @@ begin
|
||||
TblKey.Modification(Sender);
|
||||
end;
|
||||
1: begin
|
||||
TblKey := FKeys[Node.Parent.Index] as TTableKey;
|
||||
TblKey := FKeys[Node.Parent.Index];
|
||||
case Column of
|
||||
0: begin
|
||||
// Detect input of "col(123)" and move "123" into subpart
|
||||
@ -1646,7 +1618,7 @@ begin
|
||||
if Source = Sender then
|
||||
MoveFocusedIndexPart(ColPos)
|
||||
else begin
|
||||
TblKey := FKeys[Node.Index] as TTableKey;
|
||||
TblKey := FKeys[Node.Index];
|
||||
Col := SourceVT.GetNodeData(SourceVT.FocusedNode);
|
||||
ColName := Col.Name;
|
||||
if TblKey.Columns.IndexOf(ColName) > -1 then begin
|
||||
@ -1689,7 +1661,7 @@ begin
|
||||
// Move focused index or index part
|
||||
if treeIndexes.IsEditing then
|
||||
treeIndexes.EndEditNode;
|
||||
TblKey := FKeys[treeIndexes.FocusedNode.Parent.Index] as TTableKey;
|
||||
TblKey := FKeys[treeIndexes.FocusedNode.Parent.Index];
|
||||
TblKey.Columns.Move(treeIndexes.FocusedNode.Index, NewIdx);
|
||||
TblKey.SubParts.Move(treeIndexes.FocusedNode.Index, NewIdx);
|
||||
Modification(treeIndexes);
|
||||
@ -1766,7 +1738,6 @@ var
|
||||
IndexName: String;
|
||||
Node: PVirtualNode;
|
||||
Col: PTableColumn;
|
||||
TblKey: TTableKey;
|
||||
begin
|
||||
ColumnsSelected := ListColumns.SelectedCount > 0;
|
||||
menuAddToIndex.Clear;
|
||||
@ -1779,12 +1750,11 @@ begin
|
||||
// Auto create submenu items for "Add to index" ...
|
||||
PrimaryKeyExists := False;
|
||||
for i:=0 to FKeys.Count-1 do begin
|
||||
TblKey := FKeys[i] as TTableKey;
|
||||
if TblKey.IndexType = PKEY then begin
|
||||
if FKeys[i].IndexType = PKEY then begin
|
||||
PrimaryKeyExists := True;
|
||||
IndexName := TblKey.Name;
|
||||
IndexName := FKeys[i].Name;
|
||||
end else
|
||||
IndexName := TblKey.Name + ' ('+TblKey.IndexType+')';
|
||||
IndexName := FKeys[i].Name + ' ('+FKeys[i].IndexType+')';
|
||||
Item := AddItem(menuAddToIndex, IndexName, GetIndexIcon(i));
|
||||
// Disable menuitem if all selected columns are already part of this index,
|
||||
// enable it if one or more selected columns are not.
|
||||
@ -1792,7 +1762,7 @@ begin
|
||||
Node := listColumns.GetFirstSelected;
|
||||
while Assigned(Node) do begin
|
||||
Col := listColumns.GetNodeData(Node);
|
||||
if TblKey.Columns.IndexOf(Col.Name) = -1 then begin
|
||||
if FKeys[i].Columns.IndexOf(Col.Name) = -1 then begin
|
||||
Item.Enabled := True;
|
||||
Break;
|
||||
end;
|
||||
@ -1827,7 +1797,7 @@ begin
|
||||
NewType := StringReplace(Item.Caption, '&', '', [rfReplaceAll]);
|
||||
// Avoid creating a second key with the same columns
|
||||
for i:=0 to FKeys.Count-1 do begin
|
||||
TblKey := FKeys[i] as TTableKey;
|
||||
TblKey := FKeys[i];
|
||||
if (TblKey.IndexType = NewType) and (TblKey.Columns.Text = NewParts.Text) then begin
|
||||
if MessageDlg('Key already exists. Really create another identical one?'+CRLF+CRLF+
|
||||
'This will increase disk usage and probably slow down queries on this table.',
|
||||
@ -1850,7 +1820,7 @@ begin
|
||||
SelectNode(treeIndexes, 0, treeIndexes.FocusedNode);
|
||||
end else begin
|
||||
PageControlMain.ActivePage := tabIndexes;
|
||||
TblKey := FKeys[Item.MenuIndex] as TTableKey;
|
||||
TblKey := FKeys[Item.MenuIndex];
|
||||
for i:=0 to NewParts.Count-1 do begin
|
||||
if TblKey.Columns.IndexOf(NewParts[i]) = -1 then begin
|
||||
TblKey.Columns.Add(NewParts[i]);
|
||||
@ -1866,16 +1836,13 @@ end;
|
||||
|
||||
|
||||
function TfrmTableEditor.GetIndexIcon(idx: Integer): Integer;
|
||||
var
|
||||
TblKey: TTableKey;
|
||||
begin
|
||||
// Detect key icon index for specified index
|
||||
TblKey := FKeys[idx] as TTableKey;
|
||||
if TblKey.IndexType = PKEY then Result := ICONINDEX_PRIMARYKEY
|
||||
else if TblKey.IndexType = KEY then Result := ICONINDEX_INDEXKEY
|
||||
else if TblKey.IndexType = UKEY then Result := ICONINDEX_UNIQUEKEY
|
||||
else if TblKey.IndexType = FKEY then Result := ICONINDEX_FULLTEXTKEY
|
||||
else if TblKey.IndexType = SKEY then Result := ICONINDEX_SPATIALKEY
|
||||
if FKeys[idx].IndexType = PKEY then Result := ICONINDEX_PRIMARYKEY
|
||||
else if FKeys[idx].IndexType = KEY then Result := ICONINDEX_INDEXKEY
|
||||
else if FKeys[idx].IndexType = UKEY then Result := ICONINDEX_UNIQUEKEY
|
||||
else if FKeys[idx].IndexType = FKEY then Result := ICONINDEX_FULLTEXTKEY
|
||||
else if FKeys[idx].IndexType = SKEY then Result := ICONINDEX_SPATIALKEY
|
||||
else Result := -1;
|
||||
end;
|
||||
|
||||
@ -1904,7 +1871,7 @@ var
|
||||
Key: TForeignKey;
|
||||
begin
|
||||
// Remove a foreign key
|
||||
Key := FForeignKeys[listForeignKeys.FocusedNode.Index] as TForeignKey;
|
||||
Key := FForeignKeys[listForeignKeys.FocusedNode.Index];
|
||||
if not Key.Added then
|
||||
DeletedForeignKeys.Add(Key.KeyName);
|
||||
FForeignKeys.Delete(listForeignKeys.FocusedNode.Index);
|
||||
@ -1916,13 +1883,11 @@ end;
|
||||
procedure TfrmTableEditor.btnClearForeignKeysClick(Sender: TObject);
|
||||
var
|
||||
i: Integer;
|
||||
Key: TForeignKey;
|
||||
begin
|
||||
// Clear all foreign keys
|
||||
for i:=FForeignKeys.Count-1 downto 0 do begin
|
||||
Key := FForeignKeys[i] as TForeignKey;
|
||||
if not Key.Added then
|
||||
DeletedForeignKeys.Add(Key.KeyName);
|
||||
if not FForeignKeys[i].Added then
|
||||
DeletedForeignKeys.Add(FForeignKeys[i].KeyName);
|
||||
FForeignKeys.Delete(i);
|
||||
end;
|
||||
Modification(Sender);
|
||||
@ -1949,7 +1914,7 @@ begin
|
||||
// Disallow editing foreign columns when no reference table was selected.
|
||||
// Also, check for existance of reference table and warn if it's missing.
|
||||
if Column = 3 then begin
|
||||
Key := FForeignKeys[Node.Index] as TForeignKey;
|
||||
Key := FForeignKeys[Node.Index];
|
||||
Allowed := False;
|
||||
if Key.ReferenceTable = '' then
|
||||
MessageDlg('Please select a reference table before selecting foreign columns.', mtError, [mbOk], 0)
|
||||
@ -2003,7 +1968,7 @@ begin
|
||||
EditLink := EnumEditor;
|
||||
end;
|
||||
3: begin
|
||||
Key := FForeignKeys[Node.Index] as TForeignKey;
|
||||
Key := FForeignKeys[Node.Index];
|
||||
SetEditor := TSetEditorLink.Create(VT);
|
||||
SetEditor.ValueList := Mainform.Connection.GetCol('SHOW COLUMNS FROM '+Mainform.MaskMulti(Key.ReferenceTable));
|
||||
EditLink := SetEditor;
|
||||
@ -2044,7 +2009,7 @@ var
|
||||
Key: TForeignKey;
|
||||
begin
|
||||
// Return cell text in foreign key list
|
||||
Key := FForeignKeys[Node.Index] as TForeignKey;
|
||||
Key := FForeignKeys[Node.Index];
|
||||
case Column of
|
||||
0: CellText := Key.KeyName;
|
||||
1: CellText := ImplodeStr(',', Key.Columns);
|
||||
@ -2071,7 +2036,7 @@ var
|
||||
Key: TForeignKey;
|
||||
begin
|
||||
// Cell text in foreign key list edited
|
||||
Key := FForeignKeys[Node.Index] as TForeignKey;
|
||||
Key := FForeignKeys[Node.Index];
|
||||
Key.Modified := True;
|
||||
Modification(Sender);
|
||||
case Column of
|
||||
|
Reference in New Issue
Block a user