Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   IDE von "außen" steuern (https://www.delphipraxis.net/192229-ide-von-aussen-steuern.html)

Hobbycoder 31. Mär 2017 10:13

IDE von "außen" steuern
 
Hi,

ich arbeite gerade an einem Projekt, welches mir Fehlernachrichten, die mir von MadExcept per Mail zugeschickt werden, automatisch einliest, verdichtet und katalogisiert.
Mit den daraus gewonnenen Informationen möchte ich gerne direkt in die IDE springen und netterweise gleich an die passende Zeile, die betreffende Unit laden oder wenn noch nicht offen auch gleich das dazugehörige Projekt.
Kenn mir jemand sagen, wie die IDE diesbezüglich anspricht, oder wo so etwas dokumentiert ist? Auch Links auf Beispiel wären willkommen.

Danke.

Gruß Hobbycoder

jaenicke 31. Mär 2017 10:21

AW: IDE von "außen" steuern
 
Dafür kannst du dir die Unit ToolsAPI anschauen.

http://docwiki.embarcadero.com/RADSt..._der_Tools-API

uligerhardt 31. Mär 2017 10:25

AW: IDE von "außen" steuern
 
Du könntest es mit einem IDE-Experten probieren und dann fleißig mit der ToiolsAPI hantieren.
Hier mal ein paar einschlägige Code-Schnipsel:
Delphi-Quellcode:
procedure TDMSParserWizMainForm.ShowUnitSource(const FileName: string);
begin
  (BorlandIDEServices as IOTAActionServices).OpenFile(FileName);
end;

procedure ShowMessageView;
var
  h: HWND;
  c: TComponent;
begin
  // The GetFocus/SetFocus is necessary in my case the IDE is popped up some
  // other message ("the contents of a.txt have changed: reload?") -- without
  // doing SetFocus, the technique would result in the messageview being in the
  // foreground, but the messagebox still waiting for an answer.
  h := Windows.GetFocus;
  try
    c := Application.FindComponent('EditorActionLists');
    if c = nil then
      Exit;
    c := c.FindComponent('ecMessageView');
    if (c = nil) or not (c is TAction) then
      Exit;
    TAction(c).Execute;
  finally
    Windows.SetFocus(h);
  end;
end;

procedure TDMSParserWizMainForm.ShowInMessageView(const FileName, MessageStr: string;
  LineNumber, ColumnNumber: Integer);
var
  MessageServices: IOTAMessageServices40;
begin
  MessageServices := BorlandIDEServices as IOTAMessageServices40;
  MessageServices.ClearCompilerMessages;
  MessageServices.ClearToolMessages;
  MessageServices.AddToolMessage(FileName, MessageStr, 'DMS-Parser', LineNumber, ColumnNumber);
  ShowMessageView;
end;

procedure TDMSParserWizMainForm.ShowParseError(e: EParseError);
var
  EditorServices: IOTAEditorServices;
  TopView: IOTAEditView;
  EditActions: IOTAEditActions;
begin
  ShowInMessageView(CurrUnit, e.Message, e.LineNo, e.ColumnNo);
  EditorServices := BorlandIDEServices as IOTAEditorServices;
  TopView := EditorServices.TopView;
  if TopView = nil then
  begin
    ShowUnitSource(CurrUnit);
    TopView := EditorServices.TopView;
  end;
  if TopView <> nil then
  begin
    EditActions := TopView as IOTAEditActions;
    EditActions.NextError;
  end;

  Close;
  Beep;
end;

Uwe Raabe 31. Mär 2017 11:08

AW: IDE von "außen" steuern
 
madExcept bietet sowas bereits von Haus aus. Wenn du z.B. im madExceptViewer einen Doppelclick im Callstack machst, dann springt er ja auch in der IDE an die betreffende Codezeile.

Du kannst diesen Mechanismus ebenfalls nutzen, indem du die komplette Zeile aus dem Stacktrace nimmst, alle Tabs (#9) durch Blanks ersetzt und damit die Methode HyperJumpCallStack aus madExcept.pas aufrufst. Kann allerdings zu Problemen führen, wenn meherere IDEs gleichzeitig offen sind.

Vielleicht wäre es auch eine Idee, den Viewer komplett in deine Applikation zu integrieren. Die Sourcen liegen ja vor.

Hobbycoder 31. Mär 2017 11:14

AW: IDE von "außen" steuern
 
Wenn ich das richtig verstanden habe, dann geht der Weg also immer über eine IDE-Erweiterung, die dann ihrerseits die Tools-API aufruft.
Und die IDE-Erweiterung kann ich dann so steuerbar machen, wie ich es will (http, Filebasieren, oder was mir grad so einfällt).

Hobbycoder 31. Mär 2017 11:16

AW: IDE von "außen" steuern
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1366050)
madExcept bietet sowas bereits von Haus aus. Wenn du z.B. im madExceptViewer einen Doppelclick im Callstack machst, dann springt er ja auch in der IDE an die betreffende Codezeile.

Du kannst diesen Mechanismus ebenfalls nutzen, indem du die komplette Zeile aus dem Stacktrace nimmst, alle Tabs (#9) durch Blanks ersetzt und damit die Methode HyperJumpCallStack aus madExcept.pas aufrufst. Kann allerdings zu Problemen führen, wenn meherere IDEs gleichzeitig offen sind.

Vielleicht wäre es auch eine Idee, den Viewer komplett in deine Applikation zu integrieren. Die Sourcen liegen ja vor.

Aus madExcept heraus, das war mir bekannt.
Das der Viewer als Source vorliegt nicht. Schaue ich mir mal an.
Danke :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz