diff --git a/source/column_selection.pas b/source/column_selection.pas index 1e99b6bd..aca04be7 100644 --- a/source/column_selection.pas +++ b/source/column_selection.pas @@ -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; diff --git a/source/data_sorting.pas b/source/data_sorting.pas index 0a2014b8..21d7e8f9 100644 --- a/source/data_sorting.pas +++ b/source/data_sorting.pas @@ -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); diff --git a/source/helpers.pas b/source/helpers.pas index 9563ff23..bd90331f 100644 --- a/source/helpers.pas +++ b/source/helpers.pas @@ -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; TTableKey = class(TObject) Name, OldName: String; @@ -119,6 +120,7 @@ type destructor Destroy; override; procedure Modification(Sender: TObject); end; + TTableKeyList = TObjectList; // 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; 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; diff --git a/source/main.pas b/source/main.pas index ade76d17..d2610f9c 100644 --- a/source/main.pas +++ b/source/main.pas @@ -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; diff --git a/source/table_editor.pas b/source/table_editor.pas index 7a1f5a0b..45f57fef 100644 --- a/source/table_editor.pas +++ b/source/table_editor.pas @@ -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