⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 editortable.pas

📁 DBDesigner 4 is a database design system that integrates database design, modelling, creation and ma
💻 PAS
📖 第 1 页 / 共 5 页
字号:

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