AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Überwachte Ausdrücke optimieren?

Ein Thema von stahli · begonnen am 30. Jul 2016 · letzter Beitrag vom 26. Feb 2021
Antwort Antwort
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.042 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

AW: Überwachte Ausdrücke optimieren?

  Alt 2. Aug 2016, 18:19
Mir ist allerdings grundsätzlich unklar, ob man diese überhaupt für Interfaces realisieren kann.
Was müsste man denn als Typ angeben, damit der passende Visualizer benutzt wird?
"TMyGuid($2F31204) as IMyGuid" geht ja nicht.

Weiß jemand zufällig, ob/wie man das für Interfaces/Klassen lösen kann?
Wenn du dir den von dir selber verlinkten Artikel, die Kommentare in der ToolsAPI.pas zu IOTADebuggerVisualizer und eventuell mal
die mitgelieferten Visualizer angeschaut hättest, wüsstest du, dass die unterstützten Types über ihren TypeName angegeben werden.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.352 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Überwachte Ausdrücke optimieren?

  Alt 3. Aug 2016, 00:37
Da habe ich (mit wenig Zeit) natürlich versucht, aber mir fällt das etwas schwerer als Dir und die mitgelieferten Beispiele hatte ich nicht gefunden.

Ich bin jetzt aber etwas weiter.
Aus dem String "TsoGuid($2F21204) as IsoGuid" extrahiere ich zunächst den Pointer um dort das Interface abzuholen.
Ich weiß nicht, ob der Pointer auf das Objekt oder das Interface verweist. Beide versuchten Casts funktionieren jedoch nicht.
Debugging ist etwas schwierig, da das ja zur Designtime läuft.


Hier mal ein Auszug (auf Grund der Versuche etwas chaotisch).

Delphi-Quellcode:
var
  P: Integer;
  S, SR: string;
  Adr: Integer;
  lGuid: IsoGuid;
  tmpGuid: TsoGuid;
  O: TObject;

    CodeSite.Send(Expression + ' - ' + TypeName + ' - ' + EvalResult);
    // AUSGABE: Guid - IsoGuid - TsoGuid($2F21204) as IsoGuid
    if (TypeName = 'IsoGuid') then
    begin
      Result := 'IsoGuid! => ' + EvalResult;
      SR := EvalResult;
      P := Pos('(', SR);
      S := Copy(SR, 1, P - 1);
      SR := Copy(SR, P + 1);
      if (S = 'TsoGuid') then
      begin
        P := Pos(')', SR);
        S := Copy(SR, 1, P - 1);
        SR := Copy(SR, P + 1);
        Adr := StrToInt(S);
        if (SR = ' as IsoGuid') then
        begin
// O := TObject(Adr);
// tmpGuid := TsoGuid(Adr);
// if Supports(tmpGuid, IsoGuid, lGuid) then
// Result := '---> IsoGuid'
// else
// Result := ':-( ' + IntToHex(Adr, 8) + ' - ' + EvalResult;
// Result := ':-( ' + O.ClassName;
           Result := IsoGuid(Adr).AsString;
        end;
      end;
      Exit;
    end;
Kann mir jemand nochmal einen Tipp zu dem korrekten Cast geben?
Falls ich zum Ziel komme fasse ich das dann gern für Interessenten hier zusammen.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.042 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#3

AW: Überwachte Ausdrücke optimieren?

  Alt 3. Aug 2016, 09:50
Du brauchst nix casten. Benutz die OTA. Wie das geht kannst du in den mitgelieferten Visualizers für z.B. TStrings sehen.
Kann man fast 1 zu 1 kopieren.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie ( 3. Aug 2016 um 09:55 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.071 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Überwachte Ausdrücke optimieren?

  Alt 3. Aug 2016, 09:52
Warum nicht einfach in den überwachten Ausdrücken das schreiben:
TsoGuid(Guid), wobei Guid deine Interface-Instanz ist.
Ist zwar so hart hingecastet, aber zum schnellen Debuggen, um die Werte der Member-Variablen zu prüfen reicht es doch?!?
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.352 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Überwachte Ausdrücke optimieren?

  Alt 3. Aug 2016, 10:02
@Stevie
Vielen Dank. Schaue ich mir heute Abend an.

@TiGü
Die Guid verwende ich andauernd in meinem Projekt.
Da ist es hilfreich, wenn die IDE den Inhalt automatisch korrekt anzeigt.
Scheint ja auch so, dass es lösbar ist.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.352 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Überwachte Ausdrücke optimieren?

  Alt 3. Aug 2016, 23:42
Ich komme so leider auch nicht weiter.

Den Formularvisualizer möchte ich nicht nutzen. Nur den StringReplacer.

Über OTA ermittle ich den aktuellen Thread.
Über CurThread.Evaluate(Expression...) wird der Ausgabetext ermittelt.
Das ergibt aber den ungewollten "TsoGuid($2FB1204) as IsoGuid".

Im folgenden Code wird der Text erfolgreich abgerufen, nur, dass ich den eben nicht ändern kann:
Gewünscht wäre: IsoGuid.AsString
Zitat:
Guid - IsoGuid - TsoGuid($2FB1204) as IsoGuid
-1
-2
-3
-4a "TsoGuid($2FB1204) as IsoGuid"
-5
--
Delphi-Quellcode:
    CodeSite.Send(Expression + ' - ' + TypeName + ' - ' + EvalResult);
    // Guid - IsoGuid - TsoGuid($2F21204) as IsoGuid
    if (TypeName = 'IsoGuid') then
    begin
      Result := 'IsoGuid! => ' + EvalResult;
      CodeSite.Send('-1');
      if Supports(BorlandIDEServices, IOTADebuggerServices, DebugSvcs) then
        CurProcess := DebugSvcs.CurrentProcess;
      if CurProcess <> nil then
      begin
        CodeSite.Send('-2');
        CurThread := CurProcess.CurrentThread;
        if CurThread <> nil then
        begin
          CodeSite.Send('-3');
          repeat
          begin
            Done := True;
            EvalRes := CurThread.Evaluate(Expression, @ResultStr, Length(ResultStr), CanModify, eseAll, '', ResultAddr,
              ResultSize, ResultVal, '', 0);
            case EvalRes of
              erOK:
                begin
                  Result := ResultStr;
                  CodeSite.Send('-4a "' + Result + '"');
                end;
              erDeferred:
                begin
                  CodeSite.Send('-4b');
                  FCompleted := False;
                  FDeferredResult := '';
                  FDeferredError := False;
                  FNotifierIndex := CurThread.AddNotifier(Self);
                  while not FCompleted do
                    DebugSvcs.ProcessDebugEvents;
                  CurThread.RemoveNotifier(FNotifierIndex);
                  FNotifierIndex := -1;
                  if not FDeferredError then
                  begin
                    if FDeferredResult <> 'then
                      Result := FDeferredResult
                    else
                      Result := ResultStr;
                  end;
                end;
              erBusy:
                begin
                  CodeSite.Send('-4c');
                  DebugSvcs.ProcessDebugEvents;
                  Done := False;
                end;
            end;
            CodeSite.Send('-5');
          end
          until Done = True;
        end;
      end;
      CodeSite.Send('--');

Also müsste CurThread.Evaluate irgendwie überschrieben werden. Aber dann müsste die als einziges bekannte Adresse ja auch in das Interface-Object gecastet werden.
Dann könnte ich das aber doch auch gleich (wie im vorigen Beitrag) in Visualizer direkt tun - nur dass das dort (noch) nicht funktionierte.

Sorry, ist etwas schwierig für mich.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.042 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#7

AW: Überwachte Ausdrücke optimieren?

  Alt 4. Aug 2016, 10:35
CurThread.Evaluate(Expression+'.AsString', ...
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.352 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Überwachte Ausdrücke optimieren?

  Alt 4. Aug 2016, 12:15
Oha, so einfach. Also funktioniert das über die RTTI.
Jetzt erschließt sich mir auch, was ich gestern an eigenartigen Beispielen gefunden hatte.

Muss dann heute Abend nur noch funktionieren.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli ( 4. Aug 2016 um 12:36 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:31 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 by Thomas Breitkreuz