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

📄 main.pas

📁 AbsDataBase5.16 最新版
💻 PAS
📖 第 1 页 / 共 5 页
字号:
    AddToLog;
    AddToLog('Executing Query: '#13#10 + q);
    StatusBar.SimpleText := ' Executing query, please wait...';
    Application.ProcessMessages;
    qQuery.SQL.Text := q;
    qQuery.ReadOnly := False;
    qQuery.RequestLive := cbRequestLive.Checked;
    dtStart := Time;
    try
     qQuery.Open;
     dtEnd := Time;
     lSQLRecordCount.Caption := IntToStr(qQuery.RecordCount);
     if qQuery.ReadOnly then
      lReadOnly.Caption := 'ReadOnly'
     else
      lReadOnly.Caption := 'LiveResult';
     AddToLog('Ok.');
     q := ' Execution time: '+FormatDateTime('hh:nn:ss.zzz', (dtEnd-dtStart));
		 AddToLog(q);
     SqlHistory.AddQuery(qQuery.SQL.Text);

     if ( qQuery.RowsAffected <> -1 ) then
      begin
       AddToLog(Format('%d rows affected.', [qQuery.RowsAffected]));
       q := Format(' %d rows affected,', [qQuery.RowsAffected])+q;
      end;
     StatusBar.SimpleText := q;
     Application.ProcessMessages;
     
     pcSQL.ActivePage := tsData;
     aExportToExcel.Enabled := True;
    except
     on e: EABSException do
      begin
       if (e.NativeError = 20001) then
        begin
         AddToLog('Ok.');
         if ( qQuery.RowsAffected <> -1 ) then
          begin
           AddToLog(Format(' %d rows affected.', [qQuery.RowsAffected]));
           ShowLog;
          end;
         SqlHistory.AddQuery(qQuery.SQL.Text);
        end
       else
        begin
         qQuery.Close;
         reSQL.CaretPos := Point(ExtractNumber(e.Message,'column')-1,
                                 ExtractNumber(e.Message,'line')-1);
         AddToLog(e.Message);
         ShowLog;
         reSQL.SetFocus;
        end;
      end;
     on e: Exception do
      begin
       qQuery.Close;
       AddToLog(e.Message);
       ShowLog;
      end;
    end;//try-except
  finally
    Screen.Cursor := crDefault;
    aRefreshTableList.Execute;
    if (tCurTable.Exists) then
      tCurTable.Open
    else
      SelectTable;
  end;
end;


procedure TfrmMain.reSQLKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if (ssCtrl in Shift) and (Key = 13) then
   begin
    aExecSQL.Execute;
    FSQLExec := True;
   end
  else if (ssCtrl in Shift) and (Key = ord('T')) then
   pmQueryClick(mCurrentTable)
  else if (ssCtrl in Shift) and (Key = ord('F')) then
   pmQueryClick(mFieldList)
end;

procedure TfrmMain.reSQLKeyPress(Sender: TObject; var Key: Char);
begin
  if FSQLExec and (Key in [#10,#13]) then
   begin
    FSQLExec := False;
    Key := #0;
   end;
end;


procedure TfrmMain.aCompactDatabaseExecute(Sender: TObject);
begin
  if not db.Connected then Exit;
  aCloseDatabase.Execute;
  try
    AddToLog('Compact Database...');
    try
     db.CompactDatabase;
     AddToLog('Ok');
    except
      on e: Exception do
       begin
        AddToLog(e.Message);
        ShowLog;
        raise;
       end;
    end
  finally
   OpenDatabaseFile(db.DatabaseFileName);
  end;
end;

procedure TfrmMain.aRenameTableExecute(Sender: TObject);
var
  OldName, NewName: String;
begin
  OldName := GetCurrentTableName;
  if OldName = '' then Exit;
  frmTableName.Caption := 'Rename table ' + OldName;
  frmTableName.eTableName.Text := OldName;
  if frmTableName.ShowModal = mrOk then
   begin
    NewName := frmTableName.eTableName.Text;
    if (NewName = OldName) then Exit;
    qQuery.Close;
    tCurTable.Close;
    try
      tCurTable.RenameTable(NewName);
    finally
      tCurTable.Open;
      aRefreshTableList.Execute;
    end;
    SelectTable(NewName);
   end;
end;


procedure TfrmMain.RefreshLastOpenedFiles;
var i: Integer;
    a: TAction;
begin
  // Unsafe code, but... :(
  with ActionManager.ActionBars[13].Items[0].Items[2] do
   begin
     for i:=0 to items.Count-1 do
      begin
       Action.Free;
      end;
     items.Clear;     
     if Settings.FileNamesCount = 0 then
       Visible := False
     else
      begin
       Visible := True;
       for i:=0 to Settings.FileNamesCount-1 do
        with items.Add do
         begin
          a:= TAction.Create(self);
          a.Caption := Settings.FileNames[i];
          a.OnExecute := aReopenFileExecute;
          Action := a;
         end;
      end;
   end;
end;


procedure TfrmMain.aReopenFileExecute(Sender: TObject);
begin
 if Sender is TAction then
  begin
   OpenDatabaseFile(TAction(Sender).Caption);
  end;
end;

procedure TfrmMain.OpenDatabaseFile(FileName: String);
begin
  if FileName='' then Exit;
  aCloseDatabase.Execute;
  db.DatabaseFileName := FileName;
  db.Open;

  SetAllDatabaseActionsEnabled(True);
  SetAllTableActionsEnabled(True);

  Settings.AddFileName(FileName);
  aRefreshTableList.Execute;
  RefreshLastOpenedFiles;
  frmMain.Caption := ShortFormCaption + ' {' + FileName + '}';
  aRefreshDatabaseParams.Execute;
  pMainPanel.Visible := True;
end;

procedure TfrmMain.tFieldsAfterPost(DataSet: TDataSet);
begin
  tIndexColumns.Refresh;
end;

procedure TfrmMain.tFieldsBeforeDelete(DataSet: TDataSet);
begin
  while tIndexColumns.Locate('columnid', DataSet.FieldByName('id').AsInteger,[]) do
   tIndexColumns.Delete;
end;


procedure TfrmMain.tIndexColumnsBeforeInsert(DataSet: TDataSet);
begin
  if (tIndexes.State in [dsEdit,dsInsert]) then tIndexes.Post;
end;

procedure TfrmMain.tIndexesBeforeInsert(DataSet: TDataSet);
begin
  if (tFields.State in [dsEdit,dsInsert]) then tFields.Post;
end;

procedure TfrmMain.FillFieldDefsAndIndexDefs(FieldDefs: TABSAdvFieldDefs;
                                             IndexDefs: TABSAdvIndexDefs);
var
  i: Integer;
  s: String;
  FieldList, DescFieldList, CaseInsFieldList, MaxIndexedSizeList: String;
begin

   // Fields
   FieldDefs.Clear;
   tFields.First;
   for i:=0 to tFields.RecordCount-1 do
    begin
     with FieldDefs.AddFieldDef do
      begin
       Name := tFields.FieldByName('Name').AsString;
       ObjectID := tFields.FieldByName('ObjectID').AsInteger;
       DataType := StrToAft(tFields.FieldByName('Type').AsString);
       Size := tFields.FieldByName('Size').AsInteger;
       Required := tFields.FieldByName('Required').AsBoolean;
       DefaultValue.AsString := tFields.FieldByName('Default').AsString;
       MinValue.AsString := tFields.FieldByName('MinValue').AsString;
       MaxValue.AsString := tFields.FieldByName('MaxValue').AsString;
       BLOBCompressionAlgorithm := TCompressionAlgorithm(
                                     GetCompressionAlgorithm(
                                       tFields.FieldByName(
                                         'BLOBCompressionAlgorithm').AsString));
       BLOBCompressionMode := tFields.FieldByName('BLOBCompressionMode').AsInteger;
       BLOBBlockSize := tFields.FieldByName('BLOBBlockSize').AsInteger;
      end;
     tFields.Next;
    end;

   // Indexes
   IndexDefs.Clear;
   tIndexes.First;
   for i:=0 to tIndexes.RecordCount-1 do
    begin
     with IndexDefs.AddIndexDef do
      begin
       Name := tIndexes.FieldByName('Name').AsString;
       
       if UpperCase(Trim(tIndexes.FieldByName('Type').AsString)) = 'PRIMARY' then
         Options := [ixPrimary]
       else
       if UpperCase(Trim(tIndexes.FieldByName('Type').AsString)) = 'UNIQUE' then
         Options := [ixUnique];

       FieldList := '';
       DescFieldList := '';
       CaseInsFieldList := '';
       MaxIndexedSizeList := '';
       tIndexColumns.Filter := 'indexid='+tIndexes.FieldByName('id').AsString;
       tIndexColumns.Filtered := True;
       try
        tIndexColumns.First;
        while not tIndexColumns.Eof do
         begin
          s := tIndexColumns.FieldByName('columnname').AsString;
          FieldList := FieldList + s + ';';
          if not tIndexColumns.FieldByName('Asc').AsBoolean then
            DescFieldList := DescFieldList + s + ';';
          if tIndexColumns.FieldByName('CaseInsensitive').AsBoolean then
            CaseInsFieldList := CaseInsFieldList + s + ';';
          MaxIndexedSizeList := MaxIndexedSizeList + tIndexColumns.FieldByName('MaxIndexedSize').AsString + ';';
          tIndexColumns.Next;
         end;
       finally
        tIndexColumns.Filtered := False;
       end;
       if FieldList <> '' then SetLength(FieldList, Length(FieldList)-1);
       if DescFieldList <> '' then SetLength(DescFieldList, Length(DescFieldList)-1);
       if CaseInsFieldList <> '' then SetLength(CaseInsFieldList, Length(CaseInsFieldList)-1);
       if MaxIndexedSizeList <> '' then SetLength(MaxIndexedSizeList, Length(MaxIndexedSizeList)-1);
       Fields := FieldList;
       CaseInsFields := CaseInsFieldList;
       DescFields := DescFieldList;
       MaxIndexedSizes := MaxIndexedSizeList;
      end;
     tIndexes.Next;
    end;
end;


procedure MoveRow(Dataset: TDataSet; MoveUp: Boolean);
var
  bmSelected, bmOther: TBookmark;
  iSelected, iOther: Integer;
begin
  bmSelected:= Dataset.GetBookmark;
  try
    iSelected:= Dataset.FieldByName('SortOrder').AsInteger;
    if MoveUp then Dataset.Prior
    else Dataset.Next;
    if Dataset.Eof then Exit;
    bmOther:= Dataset.GetBookmark;
    iOther:= Dataset.FieldByName('SortOrder').AsInteger;
    Dataset.GotoBookmark(bmSelected);
    Dataset.Edit;
    Dataset.FieldByName('SortOrder').AsInteger:= -1;
    Dataset.Post;
    Dataset.GotoBookmark(bmOther);
    Dataset.Edit;
    Dataset.FieldByName('SortOrder').AsInteger:= iSelected;
    Dataset.Post;
    Dataset.GotoBookmark(bmSelected);
    Dataset.Edit;
    Dataset.FieldByName('SortOrder').AsInteger:= iOther;
    Dataset.Post;
  finally
    Dataset.GotoBookmark(bmSelected);
  end;
end;

function TfrmMain.GetCurrentTableName: String;
var
  n: TTreeNode;
begin
 Result := '';
 n := tvDatabase.Selected;
 if n = nil then Exit;
 if n.IsFirstNode then Exit;
 Result := n.Text;
end;


procedure TfrmMain.GetSelectedTableNames(List: TStrings);
var
  i: Integer;
begin
  List.Clear;
  for i:=0 to tvDatabase.SelectionCount-1 do
   if not tvDatabase.Selections[i].IsFirstNode then List.Add(tvDatabase.Selections[i].Text);
end;


procedure TfrmMain.tvDatabaseKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 case Key of
   13:    aRestructureTable.Execute;
   VK_F2: aRenameTable.Execute;
 end;
end;

procedure TfrmMain.tvDatabaseCollapsing(Sender: TObject; Node: TTreeNode;
  var AllowCollapse: Boolean);
begin
 AllowCollapse := False;
end;


procedure TfrmMain.tvDatabaseChange(Sender: TObject; Node: TTreeNode);
begin
 if ((FOldActilePage <> nil) and
     (pcTables.ActivePage = tsDatabase) and
     (tvDatabase.Selected.IsFirstNode)) then Exit;

 if tvDatabase.Selected.IsFirstNode then
  begin
   FOldActilePage := pcTables.ActivePage;
   
   tsDatabase.TabVisible := True;
   tsStructure.TabVisible := False;
   tsExportToSql.TabVisible := False;
   tsTableData.TabVisible := False;
   pcTables.ActivePage := tsDatabase;

   aExportAsSqlToScreen.Enabled := False;
   aExportAsSqlToFile.Enabled := False;
   aEmptyTables.Enabled := False;
   aDeleteTables.Enabled := False;
   aRestructureTable.Enabled := False;
   aRenameTable.Enabled := False;
   aRefreshTableData.Enabled := False;
   aRefreshTableStructure.Enabled := False;
   aCopyTables.Enabled := False;
   aBorrowStructure.Enabled := False;
   aPrintStructure.Enabled := False;
   aExportToExcel.Enabled := False;
  end
 else
  begin
    if ((FOldActilePage = nil) or (tsDatabase.TabVisible)) then
      begin
       tsTableData.TabVisible := True;
       pcTables.ActivePage := tsTableData;

       tsDatabase.TabVisible := False;
       tsStructure.TabVisible := True;
       tsExportToSql.TabVisible := True;

       if ((FOldActilePage <> nil) and
           (pcTables.Pages[FOldActilePage.PageIndex].TabVisible)) then
         pcTables.ActivePage := FOldActilePage
       else
         pcTables.ActivePage := tsTableData;

       FOldActilePage := pcTables.ActivePage;
      end;

   SelectTable(tvDatabase.Selected.Text);

   aEmptyTables.Enabled := True;
   aDeleteTables.Enabled := True;
   aCopyTables.Enabled := True;
   aExportAsSqlToScreen.Enabled := True;
   aExportAsSqlToFile.Enabled := True;
   aExportToExcel.Enabled := True;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -