📄 fmmain.pas
字号:
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 + -