Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Haltepunkte sortieren (https://www.delphipraxis.net/213800-haltepunkte-sortieren.html)

Kratos 27. Sep 2023 08:30

Haltepunkte sortieren
 
Moin,

Ich weise meinen Haltepunkten oft Gruppen zu.
Wenn man dann irgendwann einige Haltepunkte mit verschiedenen Gruppen im Haltepunkte-Fenster gesammelt hat, wird es für mich ein wenig unübersichtlich.
Natürlich könnte ich nach jedem Commit die dazugehörigen Haltepunkte aus der Liste löschen.
Das ist natürlich viel zu langweilig.
Gibt es eine Möglichkeit die Haltepunkte zu sortieren?
In meinem Fall würde ich gern nach Gruppen sortieren.
(Ich hab schon wild im Haltepunkte-Fenster herumgeklickt. Das gewünschte Ergebnis konnte ich nicht erzielen.)

Viele Grüße
Kratos

himitsu 27. Sep 2023 08:36

AW: Haltepunkte sortieren
 
Nicht, dass ich wüsste, aber

* du kannst einen Feature-Request beim Hersteller einreichen

* und du kommst via OpenToolsAPI an die Haltepunkte dran
Alle auslesen -> löschen -> und in der gewünschten reihenfolge neu erstellen

* oder manuell in der *.dsk rumfummeln

Kratos 27. Sep 2023 08:54

AW: Haltepunkte sortieren
 
Danke für die Tipps und die sehr schnelle Antwort!

Ich werde mir OpenToolsAPI und die jeweilige .dsk mal anschauen.
Vielleicht kann ich mir für meine Zwecke sogar ein kleines Tool zusammenbauen.

Kratos 28. Sep 2023 12:01

AW: Haltepunkte sortieren
 
Zitat:

* oder manuell in der *.dsk rumfummeln
Das habe ich spaßeshalber mal gemacht.
Und es ist ein kleines Tool dabei heraus gekommen, mit dem man nun entweder nach Dateiname oder Gruppe die Haltepunkte sortieren kann.
Das klappt eigentlich ziemlich gut.
Einziger Nachteil, ich kann die Haltepunkte nicht zur Laufzeit der IDE sortiert anzeigen.
Es scheint so, als ob die Haltepunkte einmal beim Öffnen des Projekts aus der .dsk geladen und einmal weggespeichert werden beim Schließen des Projekts.

Derzeitiger Vorgehensweise:
- Projekt/IDE schließen
- Haltepunkte über externes Programm sortieren
- IDE mit jeweiligem Projekt starten

Ich hab leider so gar keine Idee, wie man es schaffen könnte, die Haltepunkte zur Laufzeit der IDE zu sortieren und sofort anzuzeigen.
Oder müsste ich dann doch über OpenToolsAPI gehen?

stahli 28. Sep 2023 12:29

AW: Haltepunkte sortieren
 
Ich habe etwas ähnliches umgesetzt.
Wenn Du grundsätzlich mit den OTAPI zurecht kommst, sollte es dann mit folgendem Ansatz klappen:

Ich habe einen Containerliste gebaut, in der ich die Breakpoints der aktuellen Unit sammle und dann die Container nach meiner Logik umsortiere.
Dann lösche ich die Breakpoints und lege sie neu an.
Funktioniert für mich vollständig so.
Parnassis-Breakpoints werden damit nicht unterstützt.


Delphi-Quellcode:
  class procedure TXXX.GetBreakpoints(const aSL: TStringList; const aBreakPointList: TList<IOTASourceBreakpoint>; const aUnitFileName: String);
  var
    DebugSvcs : IOTADebuggerServices;
    i        : Integer;
    BreakPoint: IOTASourceBreakpoint;
  begin
    if not Supports(BorlandIDEServices, IOTADebuggerServices, DebugSvcs) then
      Exit;
    aBreakPointList.Clear;
    for i := 0 to DebugSvcs.GetSourceBkptCount - 1 do
      begin
        BreakPoint := DebugSvcs.SourceBkpts[i];
        if (BreakPoint.FileName = aUnitFileName) then
          begin
            aBreakPointList.Add(BreakPoint);
            xxTags.RegisterTag(BreakPoint.LineNumber - 1, 0, '!' + IntToStr(aBreakPointList.Count - 1));
          end;
      end;
  end;

  class procedure TXXX.RestoreBreakpoints(const BreakpointPosList: TList<TBreakpointPos>);
  var
    DebugSvcs   : IOTADebuggerServices;
    i           : Integer;
    BreakpointPos: TBreakpointPos;
    BreakPoint_  : IOTABreakpoint;
  begin
    if not Supports(BorlandIDEServices, IOTADebuggerServices, DebugSvcs) then
      Exit;
    for i := 0 to BreakpointPosList.Count - 1 do
      begin
        BreakpointPos := BreakpointPosList[i];
        if (BreakpointPos.Y >= 0) then
          begin
            BreakPoint_                    := DebugSvcs.NewSourceBreakpoint(BreakpointPos.BreakPoint.FileName, BreakpointPos.Y, nil);
            BreakPoint_.ThreadCondition   := BreakpointPos.BreakPoint.ThreadCondition;
            BreakPoint_.StackFramesToLog  := BreakpointPos.BreakPoint.StackFramesToLog;
            BreakPoint_.DoHandleExceptions := BreakpointPos.BreakPoint.DoHandleExceptions;
            BreakPoint_.DoIgnoreExceptions := BreakpointPos.BreakPoint.DoIgnoreExceptions;
            BreakPoint_.GroupName         := BreakpointPos.BreakPoint.GroupName;
            BreakPoint_.DoBreak           := BreakpointPos.BreakPoint.DoBreak;
            BreakPoint_.LogMessage        := BreakpointPos.BreakPoint.LogMessage;
            BreakPoint_.EvalExpression    := BreakpointPos.BreakPoint.EvalExpression;
            BreakPoint_.LogResult         := BreakpointPos.BreakPoint.LogResult;
            BreakPoint_.EnableGroup       := BreakpointPos.BreakPoint.EnableGroup;
            BreakPoint_.DisableGroup      := BreakpointPos.BreakPoint.DisableGroup;
            BreakPoint_.Enabled           := BreakpointPos.BreakPoint.Enabled;
            BreakPoint_.Expression        := BreakpointPos.BreakPoint.Expression;
            BreakPoint_.PassCount         := BreakpointPos.BreakPoint.PassCount;
          end;
        BreakpointPos.Free;
      end;
  end;

  class procedure TXXX.ScanBreakpoints(const aBreakPointList: TList<IOTASourceBreakpoint>; const BreakpointPosList: TList<TBreakpointPos>);
  var
    i           : Integer;
    BreakPoint  : IOTASourceBreakpoint;
    LineNumber  : Integer;
    BreakpointPos: TBreakpointPos;

    function GetLineNumber(aNr: Integer): Integer;
    var
      i    : Integer;
      S    : string;
      sNr  : string;
      Nr   : Integer;
      lxxTag: TxxTag;
    begin
      Result := -1;
      i     := 0;
      while (i <= xxTags.Items.Count - 1) do
        begin
          lxxTag := xxTags.Items[i];
          S     := lxxTag.S;
          if (Copy(S, 1, 1) = '!') then
            begin
              sNr := Copy(S, 2);
              Nr := StrToInt(sNr);
              if (Nr = aNr) then
                begin
                  Result := lxxTag.Y;
                  xxTags.Items.Delete(i);
                  Exit;
                end;
            end;
          Inc(i);
        end;
    end;

  begin
    for i := 0 to aBreakPointList.Count - 1 do
      begin
        BreakPoint := aBreakPointList[i];
        LineNumber := GetLineNumber(i);
        if (LineNumber >= 0) then
          begin
            BreakpointPos           := TBreakpointPos.Create;
            BreakpointPos.Y         := LineNumber;
            BreakpointPos.BreakPoint := BreakPoint;
            BreakpointPosList.Add(BreakpointPos);
          end;
      end;
  end;

Kratos 28. Sep 2023 13:18

AW: Haltepunkte sortieren
 
@stahli
Vielen Dank für deinen Beitrag!
Ich hab mit OpenToolsAPI noch nie etwas gemacht.
Da muss ich mich erst einmal einarbeiten.
Falls Fragen bei mir auftauchen zu deinem Code, melde ich mich noch einmal.

himitsu 28. Sep 2023 13:40

AW: Haltepunkte sortieren
 
Gibt es viele Tutorials zu finden.

Muß man in ein Package reinmachen und ein paar "geheime" DesignTimePackages ins Requires rein. (falls du dich wundern solltest, dass es bei ein paar Design-Units heißt, sie gäbe es nicht, welche da in den Beispielen verwendet werden)

dummzeuch 28. Sep 2023 18:03

AW: Haltepunkte sortieren
 
Kann man das externe Tool nicht per Tools-Menü aufrufen? Da gibt es dann ein paar nette spezielle "Parameter", die sicherstellen, dass Dateien gespeichert und ggf. wieder geladen werden. Ich weiß aber nicht, ob das auch für .dsk-Dateien funktioniert.

himitsu 28. Sep 2023 18:05

AW: Haltepunkte sortieren
 
Menü > Tools > Tools konfigurieren


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:48 Uhr.

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