Debuger und Eigenschaften der Komponenten

Für Fragen rund um die Ide und zum Debugger
Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Debuger und Eigenschaften der Komponenten

Beitrag von m.fuchs »

six1 hat geschrieben:
Fr 12. Nov 2021, 11:56
Warum brauche ich überhaupt einen Debuggerzugriff auf eine Property?
Ich benötige beim Debuggen manchmal Informationen über Eigenschaften von Objekten.
Hm, auch wenn die Dinger Properties heißen, so stellen sie doch nicht die Eigenschaften eine Objektes dar. Sondern sind nur ein gekapselter Zugriff.
Die eigentlichen Eigenschaften sind ja in den Feldern enthalten.

Kannst du mir mal ein Real-Life-Beispiel geben? Vielleicht sehe ich ja auch irgendwas nicht.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Debuger und Eigenschaften der Komponenten

Beitrag von wp_xyz »

m.fuchs hat geschrieben:
Fr 12. Nov 2021, 11:26
Die Daten sind ja in irgendwelchen Feldern abgelegt, also muss ich auch nur diese Felder auswerten.
Nicht immer. Der Getter könnte ja wirklich eine Berechnung anstellen. Die Eigenschaft "RecordCount" für einen Dataset könnte zum Beispiel im Getter eine Abfrage "SELECT UNIQUE COUNT(feld) AS n FROM tabelle" an die Datenbank schicken und n als Ergebnis übermitteln. Aber ich denke mir, das ist einer der Fälle, in denen auch Delphi nicht weiterkommt.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Debuger und Eigenschaften der Komponenten

Beitrag von m.fuchs »

wp_xyz hat geschrieben:
Fr 12. Nov 2021, 12:15
m.fuchs hat geschrieben:
Fr 12. Nov 2021, 11:26
Die Daten sind ja in irgendwelchen Feldern abgelegt, also muss ich auch nur diese Felder auswerten.
Nicht immer. Der Getter könnte ja wirklich eine Berechnung anstellen. Die Eigenschaft "RecordCount" für einen Dataset könnte zum Beispiel im Getter eine Abfrage "SELECT UNIQUE COUNT(feld) AS n FROM tabelle" an die Datenbank schicken und n als Ergebnis übermitteln. Aber ich denke mir, das ist einer der Fälle, in denen auch Delphi nicht weiterkommt.
Das wäre dann aber auch der Fall, dass es nicht mehr um den Zustand eines Objektes geht sondern tatsächlich eine Methode ausgeführt und das Ergebnis ausgewertet wird. Das ist nicht mehr Aufgabe eines Debuggers.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Debuger und Eigenschaften der Komponenten

Beitrag von six1 »

Ich habe doch im ersten Beitrag dieses Thread dargestellt, was nicht funktioniert.
Gruß, Michael

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Debuger und Eigenschaften der Komponenten

Beitrag von af0815 »

Wenn ich mir den ersten Beitrag ansehe, dann suchst du nach FCaption. Weil Caption könnte dann ja ein Getter sein, der etwas verändert. richtig wäre folglich, das man die internen Variablen sich ansehen kann, nicht aber die Getter.

Edit: Nur FCaption gibt es beim Label so nicht. Der Getter ist in TControl.GetText

Code: Alles auswählen

function TControl.GetText: TCaption;
var
  len: Integer;
  GetTextMethod: TMethod;
begin
  // Check if GetTextBuf is overridden, otherwise we can call RealGetText directly
  Assert(Assigned(@Self.GetTextBuf), 'TControl.GetText: GetTextBuf Method is Nil');
  GetTextMethod := TMethod(@Self.GetTextBuf);
  if GetTextMethod.Code = Pointer(@TControl.GetTextBuf) then begin
    Result := RealGetText;
  end
  else begin
    // Bummer, we have to do it the compatible way.
    DebugLn('Note: GetTextBuf is overridden for: ', Classname);
    len := GetTextLen;
    if len = 0 then begin
      Result := '';
    end
    else begin
      SetLength(Result, len+1); // make sure there is room for the extra #0
      FillChar(Result[1], len, #0);
      len := GetTextBuf(@Result[1], len+1); 
      SetLength(Result, len);
    end;
  end;
end;
Und was soll jetzt der Debugger machen ?! Eigentlich nichts, denn es könnte ja Schrödingers Katze munter werden und Murphy's Gesetze durchführen.
Nicht einfach die Situation.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

martin_frb
Beiträge: 572
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: Debuger und Eigenschaften der Komponenten

Beitrag von martin_frb »

Also mal grundsätzlich zu der Diskussion.

Warum auch immer der einzelne es braucht, ist nicht die Frage. Es gibt Situationen in denen es nützlich sein könnte. Genau so wie die Möglichkeit im Debugger:
- Eine Funktion des Programms aufzurufen. Auch wenn diese Veränderungen vornimmt.
- Variablen direkt zu verändern
Vielleicht will man etwas verändern, weil man erkannt hat das gerade ein Bug aufgetreten ist,
man aber trotzdem weiter Debuggen will.

Und sogar single stepping hat Seiteneffekte, da sich das Timing ändert.

Die einzelnen String in einer Stringliste kann man zwar über Umwege auch über Felder einsehen, aber das ist sehr aufwendig. (und gdb stürzt ggf ab).
Die Strings über die Property auszulesen, wär dann schon bequem.
Man muss halt wissen, ob das Seiten-effekte hat oder nicht.

Auch andere functionen/properties sind ggf ein Ergebnis, das aus vielen Feldern berechnet wird. IIRC Tcomponent.IsVisible ?

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Debuger und Eigenschaften der Komponenten

Beitrag von Socke »

martin_frb hat geschrieben:
Fr 12. Nov 2021, 13:53
Warum auch immer der einzelne es braucht, ist nicht die Frage. Es gibt Situationen in denen es nützlich sein könnte.
Mir fehlt immer wieder die Möglichkeit, komplexe Datenstrukturen auszuwerten. Mit komplex meine ich alles was über Records, Arrays und einzelne Objekte/Klassen hinausgeht.
  • XML/HTML DOM
  • JSON Objekte
  • Listen und im speziellen generische Listen/Maps etc.
Das ist immer ein Krampf in der Entwicklung. Zuerst baust du dir Code, der dir die Eigenschaften im Debug-Protokoll hinausschreibt, damit du nachschauen kannst, was wo in welcher Klasse wie abgerufen werden kann und beim nächsten Projekt hast du das wieder vergessen und fängst von vorne an.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Debuger und Eigenschaften der Komponenten

Beitrag von fliegermichl »

m.fuchs hat geschrieben:
Fr 12. Nov 2021, 12:24
Das wäre dann aber auch der Fall, dass es nicht mehr um den Zustand eines Objektes geht sondern tatsächlich eine Methode ausgeführt und das Ergebnis ausgewertet wird. Das ist nicht mehr Aufgabe eines Debuggers.
Beispielsweise hab ich in einer meiner Klassen ein Feld fAngle und eine Property AngleDeg die eine Gettermethode aufruft, welche fAngle via RadToDeg umwandelt und zurückgibt. Wenn mein Programm mit AngleDeg arbeitet, dann muss ich das immer erst manuell von Rad nach Grad umwandeln.

In Delphi halte ich die Maus auf AngleDeg und bekomme den aktuellen Winkel in Grad angezeigt.

Allerdings muss ich auch in Delphi dem Debugger erst erlauben, Funktionsaufrufe tätigen zu dürfen.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Debuger und Eigenschaften der Komponenten

Beitrag von m.fuchs »

six1 hat geschrieben:
Fr 12. Nov 2021, 12:36
Ich habe doch im ersten Beitrag dieses Thread dargestellt, was nicht funktioniert.
Naja, da möchtest du den Inhalt der Caption deines Labels auslesen. Da muss man mal kurz durch die Getter/Setter-Methoden gehen und sieht dann dass der Inhalt in TControl.FCaption gespeichert wird. Wenn man keinen Bock hat jedes Mal zu suchen, probiert man kurz Label1.FCaption in den überwachten Ausdrücken aus. Wenn dann nix geht, kann man immer noch suchen. Schon erspart man sich, dass der Debugger irgendwelche Funktionsaufrufe macht.
martin_frb hat geschrieben:
Fr 12. Nov 2021, 13:53
Also mal grundsätzlich zu der Diskussion.
Warum auch immer der einzelne es braucht, ist nicht die Frage.
Aber selbstverständlich ist das die Frage. "Warum?" wird heutzutage viel zu selten gefragt.
Wenn ich gefragt werde wie man eine Nuklearbombe baut und unterirdisch zündet, kann ich entweder eine einfach Anleitung geben. Oder ich frage nach dem Warum, bekomme die Info dass der Fragende ein großes Loch in seinen Garten machen möchte und rate dann dazu lieber einen Bagger zu benutzen.

Du hast ein paar Beispiele genannt, wo es sinnvoll sein könnte Properties auszuwerten. Für die Caption des OP würde ich immer den Weg über das zugehörige Feld empfehlen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Debuger und Eigenschaften der Komponenten

Beitrag von six1 »

m.fuchs hat geschrieben:
Sa 13. Nov 2021, 08:39
six1 hat geschrieben:
Fr 12. Nov 2021, 12:36
Ich habe doch im ersten Beitrag dieses Thread dargestellt, was nicht funktioniert.
Naja, da möchtest du den Inhalt der Caption deines Labels auslesen. Da muss man mal kurz durch die Getter/Setter-Methoden gehen und sieht dann dass der Inhalt in TControl.FCaption gespeichert wird. Wenn man keinen Bock hat jedes Mal zu suchen, probiert man kurz Label1.FCaption in den überwachten Ausdrücken aus. Wenn dann nix geht, kann man immer noch suchen. Schon erspart man sich, dass der Debugger irgendwelche Funktionsaufrufe macht.
Hi,
das ist mir soweit alles bekannt.
Auch gehe ich oft mal den Umweg über lokale Variablen, um Werte im Programmablauf zu sehen.
Ich erinnere mich daran, dass dies bei Delphi kein Problem darstellte.
Gruß, Michael

martin_frb
Beiträge: 572
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: Debuger und Eigenschaften der Komponenten

Beitrag von martin_frb »

m.fuchs hat geschrieben:
Sa 13. Nov 2021, 08:39
martin_frb hat geschrieben:
Fr 12. Nov 2021, 13:53
Also mal grundsätzlich zu der Diskussion.
Warum auch immer der einzelne es braucht, ist nicht die Frage.
Aber selbstverständlich ist das die Frage. "Warum?" wird heutzutage viel zu selten gefragt.
"Warum auch immer der einzelne ..."

Ich hab nicht gesagt das man nicht hinterfragen kann, ob/warum das nützlich ist. Im Gegenteil, ich habe diese Frage ja als wichtig eingestuft, wie sich aus der Tatsache das ich zu Ihrer Antwort beigetragen habe ergibt.

--- EDIT 14-11 8:30
Und nur um Klarheit zu schaffen.
Wenn jemand etwas potentiell gefährliches wissen will "Wie kann man (unbemerkt) den globalen KeyPress-Hook ...." => Dann frag ich auch wozu derjenige es speziell braucht.
Zuletzt geändert von martin_frb am So 14. Nov 2021, 08:35, insgesamt 1-mal geändert.

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Debuger und Eigenschaften der Komponenten

Beitrag von six1 »

Danke Martin! Ich habe dies auch so aufgefasst.
Gruß, Michael

Antworten