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:
Ansgar Becker
2010-01-08 00:30:51 +00:00
parent 35aa9c4dbf
commit 25ac096554
5 changed files with 109 additions and 141 deletions

View File

@ -3,7 +3,8 @@ unit column_selection;
interface
uses
Windows, Classes, Controls, Forms, StdCtrls, CheckLst, ExtCtrls, WideStrings, Contnrs;
Windows, Classes, Controls, Forms, StdCtrls, CheckLst, ExtCtrls, WideStrings, Contnrs,
helpers;
type
TColumnSelectionForm = class(TForm)
@ -24,7 +25,7 @@ type
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
Columns: TObjectList;
FColumns: TTableColumnList;
public
{ Public declarations }
end;
@ -34,7 +35,7 @@ var
implementation
uses main, helpers;
uses main;
{$R *.dfm}
@ -44,7 +45,7 @@ uses main, helpers;
procedure TColumnSelectionForm.FormCreate(Sender: TObject);
begin
InheritFont(Font);
Columns := TObjectList.Create;
FColumns := TTableColumnList.Create;
end;
@ -54,13 +55,14 @@ end;
procedure TColumnSelectionForm.FormShow(Sender: TObject);
var
i: Integer;
Col: TTableColumn;
KeysDummy: TTableKeyList;
ForeignKeysDummy: TForeignKeyList;
begin
ParseTableStructure(Mainform.SelectedTableCreateStatement, Columns);
for i:=0 to Columns.Count-1 do begin
Col := TTableColumn(Columns[i]);
chklistColumns.Items.Add(Col.Name);
end;
KeysDummy := nil;
ForeignKeysDummy := nil;
ParseTableStructure(Mainform.SelectedTableCreateStatement, FColumns, KeysDummy, ForeignKeysDummy);
for i:=0 to FColumns.Count-1 do
chklistColumns.Items.Add(FColumns[i].Name);
// Check items!
if Mainform.FDataGridSelect.Count = 0 then // Simply check all items
@ -154,7 +156,6 @@ procedure TColumnSelectionForm.chkSortClick(Sender: TObject);
var
checkedfields : TStringList;
i: Integer;
Col: TTableColumn;
begin
// Memorize checked items in a list
checkedfields := TStringList.Create;
@ -171,10 +172,8 @@ begin
// Add all fieldnames again
chklistColumns.Items.BeginUpdate;
chklistColumns.Clear;
for i:=0 to Columns.Count-1 do begin
Col := TTableColumn(Columns[i]);
chklistColumns.Items.Add(Col.Name);
end;
for i:=0 to FColumns.Count-1 do
chklistColumns.Items.Add(FColumns[i].Name);
chklistColumns.Items.EndUpdate;
end;

View File

@ -35,7 +35,7 @@ type
procedure Modified;
public
{ Public declarations }
Columns: TObjectList;
FColumns: TTableColumnList;
end;
@ -55,7 +55,7 @@ procedure TDataSortingForm.FormCreate(Sender: TObject);
begin
InheritFont(Font);
ColumnNames := TWideStringlist.Create;
Columns := TObjectList.Create;
FColumns := TTableColumnList.Create;
end;
@ -64,16 +64,17 @@ end;
}
procedure TDataSortingForm.FormShow(Sender: TObject);
var
Col: TTableColumn;
i: Integer;
KeysDummy: TTableKeyList;
ForeignKeysDummy: TForeignKeyList;
begin
// Take column names from listColumns and add here
ParseTableStructure(Mainform.SelectedTableCreateStatement, Columns);
KeysDummy := nil;
ForeignKeysDummy := nil;
ParseTableStructure(Mainform.SelectedTableCreateStatement, FColumns, KeysDummy, ForeignKeysDummy);
ColumnNames.Clear;
for i:=0 to Columns.Count-1 do begin
Col := TTableColumn(Columns[i]);
ColumnNames.Add(Col.Name);
end;
for i:=0 to FColumns.Count-1 do
ColumnNames.Add(FColumns[i].Name);
OrderColumns := Mainform.FDataGridSort;
OldOrderClause := ComposeOrderClause(OrderColumns);

View File

@ -11,7 +11,7 @@ interface
uses
Classes, SysUtils, Graphics, GraphUtil, ClipBrd, Dialogs, Forms, Controls, ShellApi, CheckLst,
Windows, Contnrs, ShlObj, ActiveX, WideStrUtils, VirtualTrees, SynRegExpr, Messages, WideStrings,
Registry, SynEditHighlighter, DateUtils,
Registry, SynEditHighlighter, DateUtils, Generics.Collections,
mysql_connection, mysql_structures;
type
@ -109,6 +109,7 @@ type
property Status: TEditingStatus read FStatus write SetStatus;
end;
PTableColumn = ^TTableColumn;
TTableColumnList = TObjectList<TTableColumn>;
TTableKey = class(TObject)
Name, OldName: String;
@ -119,6 +120,7 @@ type
destructor Destroy; override;
procedure Modification(Sender: TObject);
end;
TTableKeyList = TObjectList<TTableKey>;
// Helper object to manage foreign keys in a TObjectList
TForeignKey = class(TObject)
@ -128,6 +130,7 @@ type
constructor Create;
destructor Destroy; override;
end;
TForeignKeyList = TObjectList<TForeignKey>;
TDBObjectEditor = class(TFrame)
private
@ -227,8 +230,8 @@ type
function DateBackFriendlyCaption(d: TDateTime): String;
procedure InheritFont(AFont: TFont);
function GetLightness(AColor: TColor): Byte;
procedure ParseTableStructure(CreateTable: String; Columns: TObjectList=nil; Keys: TObjectList=nil; ForeignKeys: TObjectList=nil);
procedure ParseViewStructure(ViewName: String; Columns: TObjectList);
procedure ParseTableStructure(CreateTable: String; Columns: TTableColumnList; Keys: TTableKeyList; ForeignKeys: TForeignKeyList);
procedure ParseViewStructure(ViewName: String; Columns: TTableColumnList);
function ReformatSQL(SQL: String): String;
var
@ -2774,7 +2777,7 @@ begin
end;
procedure ParseTableStructure(CreateTable: String; Columns: TObjectList=nil; Keys: TObjectList=nil; ForeignKeys: TObjectList=nil);
procedure ParseTableStructure(CreateTable: String; Columns: TTableColumnList; Keys: TTableKeyList; ForeignKeys: TForeignKeyList);
var
ColSpec: String;
rx, rxCol: TRegExpr;
@ -2964,7 +2967,7 @@ begin
end;
procedure ParseViewStructure(ViewName: String; Columns: TObjectList);
procedure ParseViewStructure(ViewName: String; Columns: TTableColumnList);
var
rx: TRegExpr;
Col: TTableColumn;

View File

@ -720,9 +720,9 @@ type
EditVariableForm : TfrmEditVariable;
FileNameSessionLog : String;
FileHandleSessionLog : Textfile;
SelectedTableColumns,
SelectedTableKeys,
SelectedTableForeignKeys : TObjectList;
SelectedTableColumns : TTableColumnList;
SelectedTableKeys : TTableKeyList;
SelectedTableForeignKeys : TForeignKeyList;
FilterPanelManuallyOpened : Boolean;
DataGridDB, DataGridTable : String;
PrevTableColWidths : TWideStringList;
@ -1343,9 +1343,9 @@ begin
actFilterPanelExecute(nil);
lblFilterVTInfo.Caption := '';
SelectedTableColumns := TObjectList.Create;
SelectedTableKeys := TObjectList.Create;
SelectedTableForeignKeys := TObjectList.Create;
SelectedTableColumns := TTableColumnList.Create;
SelectedTableKeys := TTableKeyList.Create;
SelectedTableForeignKeys := TForeignKeyList.Create;
end;

View File

@ -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