unit uIdeMenuRunExeProject; interface uses Classes, SysUtils, Dialogs, Forms, Windows, ToolsApi, uIdeMenuObject; type TIdeMenuRunExeProject = class(TIdeMenuObject) function ItemName: String; override; function Caption: String; override; function ShortCut: String; override; function Order: Integer; override; procedure Execute(Sender: TObject); override; end; implementation function TIdeMenuRunExeProject.ItemName: String; begin Result := 'RunExeProject'; end; function TIdeMenuRunExeProject.Caption: String; begin Result := 'Run project group executable'; end; function TIdeMenuRunExeProject.ShortCut: String; begin Result := 'Alt+F9'; end; function TIdeMenuRunExeProject.Order: Integer; begin Result := 0; end; procedure TIdeMenuRunExeProject.Execute(Sender: TObject); var ProjectGroup : IOTAProjectGroup; TopView : IOTAEditView; ExeProjectIndex : Integer; p : Integer; function GetProjectGroup: IOTAProjectGroup; var ModuleServices : IOTAModuleServices; i : Integer; begin // Standaard resultaat Result := nil; // Verkrijg een referentie naar de moduloe services ModuleServices := (BorlandIDEServices as IOTAModuleServices); // Loop door de modules for i := 0 to ModuleServices.ModuleCount - 1 do begin // Als een van de modules het IOTAProjectGroup interface implementeert, // dan is er een project group gevonden if (ModuleServices.Modules[i].QueryInterface(IOTAProjectGroup, Result) = S_OK) then Break; end; // Laat referentie naar het interface los ModuleServices := nil; end; function GetTopView: IOTAEditView; var EditorServices: IOTAEditorServices; begin if Supports(BorlandIDEServices, IOTAEditorServices, EditorServices) then Result := EditorServices.TopView else Result := nil; end; begin // Verkrijg een referentie naar de huidige project group en editors topview ProjectGroup := GetProjectGroup; TopView := GetTopView; // Alleen als er een referenties gevonden zijn dan moet er actie worden ondernomen if Assigned(ProjectGroup) and Assigned(TopView) then begin // Tot dusverre is er geen project gevonden waarin de huidige module // zich bevindt ExeProjectIndex := -1; // Loop door alle projecten van de projectgroup for p := 0 to ProjectGroup.ProjectCount - 1 do begin // Kijk of de extentie van de project filename .dpr is if SameText(ExtractFileExt(ProjectGroup.Projects[p].FileName), '.dpr') then begin // Als het geen dll betreft, dan is het de exe en kan de loop doorbroken worden if not ProjectGroup.Projects[p].ProjectOptions.Values['GenDll'] then begin ExeProjectIndex := p; Break; end; end; end; // Als er een project gevonden is, selecteer dit dan als actief project en // run het project if ExeProjectIndex <> -1 then begin // Maak exe project actief ProjectGroup.ActiveProject := ProjectGroup.Projects[ExeProjectIndex]; // Run (TopView as IOTAEditActions).RunProgram; end; end; end; end.