AGB  ·  Datenschutz  ·  Impressum  







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

Überwachen von Objekteigenschaften

Ein Thema von noisy_master · begonnen am 26. Nov 2010 · letzter Beitrag vom 29. Nov 2010
Antwort Antwort
Seite 1 von 3  1 23      
noisy_master

Registriert seit: 17. Jun 2009
Ort: Wolfenbüttel/Baddeckenstedt
260 Beiträge
 
Delphi XE5 Professional
 
#1

Überwachen von Objekteigenschaften

  Alt 26. Nov 2010, 11:45
Hallo Gemeinde,

gibt es in Delphi die Möglichkeit eine Art Breakpoint/TraceTrigger zu setzen wenn die Eigenschaft eines Objekts geändert wird?
Hintergrund der Frage: Ich erwarte z.B. dass ein Button disabled ist, er ist aber doch leider Enabled.
Nun würde ich gerne herausfinden welche der ~500 Stellen die den Button enablen können denn nun fälschlicherweise zuschlägt(ohne 500 breakpoints zu setzen zu müssen)

Danke im voraus für eure Hilfe.
Dirk
  Mit Zitat antworten Zitat
Benutzerbild von mleyen
mleyen

Registriert seit: 10. Aug 2007
609 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Überwachen von Objekteigenschaften

  Alt 26. Nov 2010, 11:58
Delphi-Quellcode:

/// Ganz oben
type
  TButton = class(StdCtrls.TButton)
    procedure SetEnabled(Value: Boolean); override;
  end;

/// ...
/// Die eigentliche Unit...
/// ...

/// Vor end. dann:
{ TButton }

procedure TButton.SetEnabled(Value: Boolean);
begin
  inherited;
  if Self.Name = 'btnMeinBtnDerEnabledWirdthen
    MessageDlg('Debugpoint hier setzen. :)', mtInformation, [mbOK], 0);
end;
tadaa
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#3

AW: Überwachen von Objekteigenschaften

  Alt 26. Nov 2010, 12:02
Was mir jetzt spontan einfällt: die Message CM_ENABLEDCHANGED abzufangen.
Delphi-Quellcode:
type
  TButton = class(StdCtrls.TButton)
  private
    FOnEnabledChanged: TNotifyEvent;
    procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
  public
    property OnEnabledChanged: TNotifyEvent read FOnEnabledChanged write FOnEnabledChanged;
  end;

  TFormTest = class(TForm)
  ...
  private
    { Private-Deklarationen }
    procedure DoOnChange(Sender: TObject);
  ...


procedure TButton.CMEnabledChanged(var Message: TMessage);
begin
  inherited;
  if Assigned(FOnEnabledChanged) then
    FOnEnabledChanged(Self);
end;

procedure TFormTest.DoOnChange(Sender: TObject);
begin
  if Sender is TButton then
    ShowMessage(TButton(Sender).Name + ' hat sich geändert');
end;

procedure TFormTest.FormCreate(Sender: TObject);
begin
  Button1.OnEnabledChanged := DoOnChange;
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
noisy_master

Registriert seit: 17. Jun 2009
Ort: Wolfenbüttel/Baddeckenstedt
260 Beiträge
 
Delphi XE5 Professional
 
#4

AW: Überwachen von Objekteigenschaften

  Alt 26. Nov 2010, 12:07
Danke, kling schon mal echt gut und dürfte für den Einzelfall das Mittel der Wahl sein.

Schön wäre es natürlich nun, wenn man nicht jede einzelne Eigenschaft für jede einzlen Klasse, die man überwachen möchte überschreiben müsste, sondern in der Art z.B. eines ExceptionHandlers einfach zu überwachende Eigenschaften auswählen könnte.
Kennt jemand dafür ein geeignetes Tooling/Expert/wizard?

Delphi-Quellcode:

/// Ganz oben
type
  TButton = class(StdCtrls.TButton)
    procedure SetEnabled(Value: Boolean); override;
  end;

/// ...
/// Die eigentliche Unit...
/// ...

/// Vor end. dann:
{ TButton }

procedure TButton.SetEnabled(Value: Boolean);
begin
  inherited;
  if Self.Name = 'btnMeinBtnDerEnabledWirdthen
    MessageDlg('Debugpoint hier setzen. :)', mtInformation, [mbOK], 0);
end;
tadaa
Dirk
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

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

AW: Überwachen von Objekteigenschaften

  Alt 26. Nov 2010, 12:13
Das stimmt, ich hätte mir einen solchen Breakpint auch schon oft gewünscht.
Das würde die Laufzeit natürlich sehr ausbremsen, aber in bestimmten Fällen würde ich das gern mal in Kauf nehmen - natürlich nicht auf Dauer.
Der Debuger müsste an jeder Stelle (die einen Breakpoint erhalten KÖNNTE), die Erfüllung einer Bedingung prüfen und dann ggf. anhalten.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: Überwachen von Objekteigenschaften

  Alt 26. Nov 2010, 12:18
Zitat:
Hintergrund der Frage: Ich erwarte z.B. dass ein Button disabled ist, er ist aber doch leider Enabled.
Nun würde ich gerne herausfinden welche der ~500 Stellen die den Button enablen können denn nun fälschlicherweise zuschlägt(ohne 500 breakpoints zu setzen zu müssen)
arbeitest Du nicht mit Actions ??
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#7

AW: Überwachen von Objekteigenschaften

  Alt 26. Nov 2010, 12:26
Man könnte sich eine Klasse zusammenschreiben, welche die virtuellen Methoden, hier am Beispiel SetEnabled oder WndProc (die zentrale Nachrichtenbehandlung der Komponenten), zur Laufzeit "überschreibt", seinen eigenen Prüfcode einschleust und so leichter Debuggen kann.

Dieser Komponente wurde man dann sagen "Hooke mir die und die Methode jener Klasse".


evtl. gibt's sowas aber auch schon

(über die neue 2010er/XE-RTTI würde sowas bestimmt ein Leichtes sein
und davor nur einen Hauch umständlicher/aufwändiger)


[add]
- "mit Debug-DCUs" in den Projektoptionen aktivieren (neuere Delphiversionen)
- in SetEnabled einen Haltepunkt sezten (wirkt natürlich nur, wenn die Änderung direkt über .Enabled reinkommt)
- die Bedingung für den Haltepunkt auf "Name = 'name der komponente'"
- und nun nur noch warten

Nicht wundern, aber dieses könnte das Programm ein bissl ausbremsen, da dieses natürlich von jedem kleinen Komponentchen aufgerufen wird.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (26. Nov 2010 um 12:43 Uhr)
  Mit Zitat antworten Zitat
noisy_master

Registriert seit: 17. Jun 2009
Ort: Wolfenbüttel/Baddeckenstedt
260 Beiträge
 
Delphi XE5 Professional
 
#8

AW: Überwachen von Objekteigenschaften

  Alt 26. Nov 2010, 12:27
Jupp ist richtig, aber wenn man sich solche "Komponenten" wie z.B. Eureka anschaut ist eine solche Funktion ganz hilfreich.

Das stimmt, ich hätte mir einen solchen Breakpint auch schon oft gewünscht.
Das würde die Laufzeit natürlich sehr ausbremsen, aber in bestimmten Fällen würde ich das gern mal in Kauf nehmen - natürlich nicht auf Dauer.
Der Debuger müsste an jeder Stelle (die einen Breakpoint erhalten KÖNNTE), die Erfüllung einer Bedingung prüfen und dann ggf. anhalten.
Dirk
  Mit Zitat antworten Zitat
noisy_master

Registriert seit: 17. Jun 2009
Ort: Wolfenbüttel/Baddeckenstedt
260 Beiträge
 
Delphi XE5 Professional
 
#9

AW: Überwachen von Objekteigenschaften

  Alt 26. Nov 2010, 12:28
Ich muss zu meiner Schande gestehen: NEIN!
Aber wie sollte das bei diesen Probleme helfen?


Zitat:
Hintergrund der Frage: Ich erwarte z.B. dass ein Button disabled ist, er ist aber doch leider Enabled.
Nun würde ich gerne herausfinden welche der ~500 Stellen die den Button enablen können denn nun fälschlicherweise zuschlägt(ohne 500 breakpoints zu setzen zu müssen)
arbeitest Du nicht mit Actions ??
Dirk
  Mit Zitat antworten Zitat
noisy_master

Registriert seit: 17. Jun 2009
Ort: Wolfenbüttel/Baddeckenstedt
260 Beiträge
 
Delphi XE5 Professional
 
#10

AW: Überwachen von Objekteigenschaften

  Alt 26. Nov 2010, 12:30
Ja klingt plausibel.

Genau dieses "EVTL" suche ich



Man könnte sich eine Klasse zusammenschreiben, welche die virtuellen Methoden, hier am Beispiel SetEnabled oder WndProc (die zentrale Nachrichtenbehandlung der Komponenten), zur Laufzeit "überschreibt", seinen eigenen Prüfcode einschleust und so leichter Debuggen kann.

Dieser Komponente wurde man dann sagen "Hooke mir die und die Methode jener Klasse".


evtl. gibt's sowas aber auch schon

(über die neue 2010er/XE-RTTI würde sowas bestimmt ein Leichtes sein
und davor nur einen Hauch umständlicher/aufwändiger)
Dirk
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 01:40 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