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

📄 fmmain.pas

📁 Delphi脚本控件
💻 PAS
📖 第 1 页 / 共 4 页
字号:
        ImgIndex := -1;
    end;
    if ImgIndex >= 0 then
      imglGutterGlyphs.Draw(ACanvas, X, Y, ImgIndex);
    Inc(FirstLine);
    Inc(Y, LH);
  end;
end;

procedure TFormMain.Trace(RunMode: Integer; const ModuleName: String = ''; ALine: integer = 0);
begin
  if ScriptHasBeenChanged then
    PaxScripter1.ResetScripter;

  PaxScripter1.Run(runMode, ModuleName, ALine);

  if not PaxScripter1.IsError then
    SetTraceLine(PaxScripter1.CurrentModuleName, PaxScripter1.CurrentSourceLine + 1);
end;

procedure TFormMain.RemoveTraceLine;
var
  I: Integer;
  Editor: TEditor;
begin
  for I:=0 to PageControl1.PageCount - 1 do
  begin
    Editor := FindEditor(PageControl1.Pages[I]);
    if Editor <> nil then
    begin
      Editor.TraceLine := -1;
      Editor.Invalidate;
    end;
  end;
end;

procedure TFormMain.ProcessWatches;
var
  I: Integer;
  Res: Variant;
begin
  for I:=0 to WatchList.Count - 1 do
    if PaxScripter1.ScripterState = ssPaused then
    begin
      if PaxScripter1.Eval(WatchList[I], LanguageName, Res) then
        ListBoxWatches.Items[I] := WatchList[I] + ':' + PaxScripter1.ToString(Res)
      else
        ListBoxWatches.Items[I] := WatchList[I] + ':[not accessible]';
    end
    else
      ListBoxWatches.Items[I] := WatchList[I] + ':[not accessible]';
end;

procedure TFormMain.ProcessCallStack;
var
  I, J: Integer;
  S: String;
begin
  ListBoxCallStack.Clear;

  for I:=0 to PaxScripter1.CallStack.Count - 1 do
  begin
    with PaxScripter1.CallStack.Records[I] do
    begin
      S := ProcName + '(';
      for J:=0 to Parameters.Count - 1 do
      begin
        S := S + Parameters[J];
        if J < Parameters.Count - 1 then
          S := S + ',';
      end;
      S := S + ')';
    end;
    ListBoxCallStack.Items.Add(S);
  end;
end;

procedure TFormMain.ListBoxCallStackDblClick(Sender: TObject);
var
  I, LineNumber: Integer;
  ModuleName: String;
  Editor: TEditor;
begin
  I := ListBoxCallStack.ItemIndex;
  if I >= 0 then
  begin
    LineNumber := PaxScripter1.CallStack.Records[I].LineNumber;
    ModuleName := PaxScripter1.CallStack.Records[I].ModuleName;
    Editor := GoToLine(ModuleName, LineNumber + 1);
    Editor.SetFocus;
  end;
end;

procedure TFormMain.mProgramResetClick(Sender: TObject);
begin
  BringToFront;
  RemoveTraceLine;
  RemoveError;

  PaxScripter1.ScripterState := ssReadyToCompile;

  SetIDEState(ideInit);
end;

function TFormMain.LanguageName: String;
begin
  result := PaxScripter1.FileExtToLanguageName(CurrentModuleName);
end;

procedure TFormMain.ListBoxWatchesKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  S: String;
  Index: Integer;
begin
{$IFDEF LINUX}
  if Key = Key_Insert then
{$ELSE}
  if Key = vk_Insert then
{$ENDIF}
  begin
    S := InputBox('Input expression', '', '');
    if S <> '' then
    begin
      WatchList.Add(S);
      ListBoxWatches.Items.Add(S);
      ProcessWatches;
    end;
  end
{$IFDEF LINUX}
  else if Key = Key_Delete then
{$ELSE}
  else if Key = vk_Delete then
{$ENDIF}
  begin
    Index := ListBoxWatches.ItemIndex;
    if Index <> - 1 then
    begin
      WatchList.Delete(Index);
      ListBoxWatches.Items.Delete(Index);
    end;
  end;
end;

function TFormMain.GotoLine(const ModuleName: String; LineNumber: Integer): TEditor;
var
  TabSheet: TTabSheet;
begin
  result := nil;

  TabSheet := FindPage(ModuleName);
  if TabSheet = nil then
    Exit;

  PageControl1.ActivePage := TabSheet;

  result := FindEditor(TabSheet);
  if result = nil then
    Exit;

  result.CaretXY := Point(1, LineNumber);
  result.InvalidateLine(LineNumber);
end;

procedure TFormMain.AddToProject(const ModuleName, FileName, LanguageName: String);
var
  TabSheet: TTabSheet;
  Editor: TEditor;
begin
  TabSheet := TTabSheet.Create(PageControl1);
  TabSheet.PageControl := PageControl1;
  TabSheet.Caption := ModuleName;

  Editor := TEditor.Create(TabSheet);
  Editor.Name := 'Editor';
  Editor.Parent := TabSheet;
  Editor.Align := alClient;

  Editor.OnGutterClick := EditorGutterClick;
  Editor.OnSpecialLineColors := EditorSpecialLineColors;
  Editor.OnKeyUp := EditorKeyUp;
  Editor.OnMouseUp := EditorMouseUp;
  Editor.OnMouseDown := EditorMouseDown;

  if LanguageName = 'paxBasic' then
    Editor.Highlighter := SynPaxBasicSyn1
  else if LanguageName = 'paxC' then
    Editor.Highlighter :=  SynPaxCSyn1
  else if LanguageName = 'paxPascal' then
    Editor.Highlighter := SynPaxPascalSyn1
  else
    Editor.Highlighter := SynPaxJavaScriptSyn1;

  FormDelete.ListBox1.Items.Add(ModuleName);

  if FileExists(FileName) then
  begin
    Editor.Lines.LoadFromFile(FileName);
    Editor.Modified := false;
  end;

  TDebugSupportPlugin.Create(Editor);
end;

procedure TFormMain.OpenNewProject(const FileName: String);
var
  L: TStringList;
  I: Integer;
  ModuleName, LanguageName, FullName: String;
begin
  if IDEState <> ideNoProject then
    HeightOpenProject := Height;

  ScriptWasAssigned := false;

  CloseProject;

  ProjectName := FileName;
  if FileExists(FileName) then
  begin
    L := TStringList.Create;
    try
      L.LoadFromFile(FileName);
      for I:=0 to L.Count - 1 do
      if Pos('#', L[I]) = 0 then
      begin
        ModuleName := L[I];
        LanguageName := PaxScripter1.FileExtToLanguageName(L[I]);

        FullName := PaxScripter1.FindFullFileName(L[I]);

        if FileExists(FullName) then
          AddToProject(ModuleName, FullName, LanguageName)
        else
        begin
          ErrMessageBox('File %s not found !', L[I]);
          CloseProject;
          Exit;
        end;
      end;

      SignSyntaxCheck := true;
      PaxScripter1.Compile(true);
      SignSyntaxCheck := false;
      RebuildCodeExplorerTree;

      PaxScripter1.ScripterState := ssInit;
    finally
      L.Free;
    end;
  end;
  SetIDEState(ideInit);
end;

procedure TFormMain.CreateNewProject(const FileName: String);
begin
  ProjectName := FileName;
  if Pos(UpperCase(paxProject_Ext), UpperCase(ProjectName)) = 0 then
    ProjectName := ProjectName + paxProject_Ext;

  if FileExists(ProjectName) then
{$IFDEF LINUX}
    if Application.MessageBox(PChar('Project ' + ProjectName + ' already exists. Recreate?'),
            'Confirm', [smbYES, smbNO]) = smbNO then
{$ELSE}
    if Application.MessageBox(PChar('Project ' + ProjectName + ' already exists. Recreate?'),
            'Confirm', MB_ICONQUESTION or MB_YESNO) = IDNO then
{$ENDIF}
    begin
      OpenNewProject(ProjectName);
      Exit;
    end;

  CloseProject;

  SetIDEState(ideInit);

  with TreeView1.Items do
  begin
    Clear; { remove any existing nodes }
  end;

  FormNew.Edit1.Text := ProjectName;

  mAddToProjectClick(nil);
end;

procedure TFormMain.CloseProject;
var
  I: Integer;
begin
  RemoveError;

  with PageControl1 do
  for I:=PageCount - 1 downto 0 do
  begin
    RemoveComponent(Pages[I]);
    Pages[I].Free;
  end;

  if FormDelete <> nil then
    FormDelete.ListBox1.Items.Clear; 

  PaxScripter1.ResetScripter;
  SetIDEState(ideNoProject);
end;

procedure TFormMain.SetIDEState(IDEState: TIDEState);
var
  Temp: Integer;
begin
  Self.IDEState := IDEState;
  case IDEState of
    ideNoProject:
    begin
      Height := HeightNoProject;

      mFile.Enabled := true;
      mOpenProject.Enabled := true;
      mNewProject.Enabled := true;
      mSave.Enabled := false;

      mEdit.Enabled := false;

      mRun.Enabled := false;
      mProject.Enabled := false;
      mClose.Enabled := false;

      SpeedButtonNew.Enabled := true;
      SpeedButtonOpen.Enabled := true;
      SpeedButtonSave.Enabled := false;
      SpeedButtonAdd.Enabled := false;
      SpeedButtonRemove.Enabled := false;
      SpeedButtonRun.Enabled := false;
      SpeedButtonTraceInto.Enabled := false;
      SpeedButtonStepOver.Enabled := false;
    end;
    ideInit:
    begin
{$IFNDEF LINUX}
      FormConsole.ManualDock(nil);
{$ENDIF}

      Height := HeightOpenProject;
      PageControl2.Height := 0;

      mEdit.Enabled := true;

      mRun.Enabled := true;
      mProject.Enabled := true;
      mClose.Enabled := true;
      mSave.Enabled := true;

      SpeedButtonNew.Enabled := true;
      SpeedButtonOpen.Enabled := true;
      SpeedButtonSave.Enabled := true;
      SpeedButtonAdd.Enabled := true;
      SpeedButtonRemove.Enabled := true;
      SpeedButtonRun.Enabled := true;
      SpeedButtonTraceInto.Enabled := true;
      SpeedButtonStepOver.Enabled := true;
    end;
    idePaused:
    begin
      HeightOpenProject := Height;

      Temp := PanelBottom.Height;
      PanelBottom.Height := 0;
      PageControl2.Align := alNone;
      PageControl2.Height := PageControl2Height;
      PanelBottom.Height := Temp;
      PageControl2.Align := alBottom;

      mOpenProject.Enabled := false;
      mNewProject.Enabled := false;
      mSave.Enabled := false;

      mProject.Enabled := false;

      mRun.Enabled := true;

      SpeedButtonNew.Enabled := false;
      SpeedButtonOpen.Enabled := false;
      SpeedButtonSave.Enabled := false;
      SpeedButtonAdd.Enabled := false;
      SpeedButtonRemove.Enabled := false;
      SpeedButtonRun.Enabled := true;
      SpeedButtonTraceInto.Enabled := true;
      SpeedButtonStepOver.Enabled := true;
    end;
  end;
  Self.IDEState := IDEState;
end;

procedure TFormMain.mCloseClick(Sender: TObject);
begin
  CloseProject;
end;

procedure TFormMain.mSaveClick(Sender: TObject);
begin
  SaveProject;
end;

procedure TFormMain.SpeedButtonNewClick(Sender: TObject);
begin
  mNewProjectClick(Sender);
end;

procedure TFormMain.SpeedButtonOpenClick(Sender: TObject);
begin
  mOpenProjectClick(Sender);
end;

procedure TFormMain.SpeedButtonSaveClick(Sender: TObject);
begin
  mSaveClick(Sender);
end;

procedure TFormMain.SpeedButtonAddClick(Sender: TObject);
begin
  mAddToProjectClick(Sender);
end;

procedure TFormMain.SpeedButtonRemoveClick(Sender: TObject);
begin
  mRemoveFromProjectClick(Sender);
end;

procedure TFormMain.SpeedButtonRunClick(Sender: TObject);
begin
  Trace(rmRun);
end;

procedure TFormMain.SpeedButtonTraceIntoClick(Sender: TObject);
begin
  Trace(rmTraceInto);
end;

procedure TFormMain.SpeedButtonStepOverClick(Sender: TObject);
begin
  Trace(rmStepOver);
end;

procedure TFormMain.SpeedButtonHelpClick(Sender: TObject);
begin
  OnlineHelp1Click(Sender);
end;

procedure TFormMain.mAboutClick(Sender: TObject);
begin
  FormAbout.ShowModal;
end;

procedure TFormMain.mRemoveAllBreakpointsClick(Sender: TObject);
begin
  RemoveAllBreakpoints;
  ListBoxBreakpoints.Clear;
end;

procedure TFormMain.RemoveFromProject(const ModuleName: String);
var
  I: Integer;
  L: TStringList;
begin
  with PageControl1 do
  for I:=0 to PageCount - 1 do
    if Pages[I].Caption = ModuleName then
    begin
      RemoveComponent(Pages[I]);
      Pages[I].Free;
      Break;
    end;

  if FileExists(ProjectName) then
  begin
    L := TStringList.Create;
    try
      L.LoadFromFile(ProjectName);
      for I:=0 to L.Count - 1 do
        if L[I] = ModuleName then
        begin
          L.Delete(I);
          L.SaveToFile(ProjectName);
          Break;
        end;
    finally
      L.Free;
    end;
  end;
end;

procedure TFormMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if ScriptHasBeenChanged then
  begin
{$IFDEF LINUX}
     if Application.MessageBox(PChar('Save changes to ' + ProjectName + '?'),
           'Confirm', [smbYES, smbNO] ) = smbYES then
{$ELSE}
     if Application.MessageBox(PChar('Save changes to ' + ProjectName + '?'),
           'Confirm', MB_ICONQUESTION or MB_YESNO ) = IDYES then
{$ENDIF}
     SaveProject;
  end;
  IniFile['top'] := IntToStr(Top);
  IniFile['left'] := IntToStr(Left);
  IniFile['height'] := IntToStr(HeightOpenProject);
  IniFile['width'] := IntToStr(Width);
  IniFile.Free;
end;

procedure TFormMain.SaveProject;
var
  T: TextFile;
  I: Integer;
  Editor: TEditor;
  S: String;
begin
  S := '';
  if FileExists(ProjectName) then
  begin
    AssignFile(T, ProjectName);
    Reset(T);
    try
      readln(T, S);
      if Pos('#', S) = 0 then
        S := '';
    finally
      CloseFile(T);

⌨️ 快捷键说明

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