AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Aufrufer feststellen

Ein Thema von Mokus · begonnen am 8. Okt 2014 · letzter Beitrag vom 6. Nov 2014
Antwort Antwort
Benutzerbild von Mokus
Mokus

Registriert seit: 24. Sep 2013
165 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Aufrufer feststellen

  Alt 8. Okt 2014, 15:31
Delphi-Version: XE2
Mahlzeit,

ich habe noch einmal eine frage.

ich habe i verschiedene Paintboxen, welche dynamisch im Quellcode erstellt werden, also keine festen Komponenten.
Diese sollen aber alle das gleiche Zeichnen.

Delphi-Quellcode:
var
  Form: TTFormWithSave;
  SBPaintBox: TPaintBox;
begin
  Form := TTFormWithSave.CreateNew(Self);
  SBPaintBox := TPaintBox.Create(Form);
  SBPaintBox.Parent := Form;
  SBPaintBox.Align := alClient;
  SBPaintBox.OnPaint := pbSBILDPaint;

  Form.Show;

end;

DIe Methode pbSBILDPaint

Delphi-Quellcode:
begin
  Self.SBILDPaint(Sender,PaintBox);
end;

so der 2 Parameter ist ein Pseudocode Parameter. Ich würde den Aufrufer mit übergeben.
Kann ich daher herrausfinden welches OBJEKT mich aufgerufen hat ?

Im Debuger stand Sender.Classname = NIcht verfügbarer wert
daher weiß ich nicht was es genau für ein Objekt ist.


Kann wer mir weiter helfen ?


Danke im VOrraus
Markus
es gibt nur 10 arten von menschen !
die die binär verstehen und die die nicht. !
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Aufrufer feststellen

  Alt 8. Okt 2014, 15:42
Der Debugger hat manchmal Probleme Variablen zu finden/lesen.
Versuch mal die CodeOptimierung in den Projektoptionen zu deaktivieren. Wenn du danach (aktuelle Code-Position des Debuggers) nicht nochmal auf diese Variable zugreifst, dann könnte sie wegoptimiert sein.

Du kannst dir aber auch per ShowMessage den Wert anzeigen lassen oder über OutputDebugStrings die Werte in das DebugLog vom Delphi schreiben.



PS: Sender.ClassName bringt natürlich nicht sehr viel, da es bei allen PaintBoxen "TPaintBox" sein wird.

Zum Vergleichen: if Sender.Name = 'PaintBox1then oder besser doch if Sender = PaintBox1 then
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 8. Okt 2014 um 15:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.934 Beiträge
 
Delphi 12 Athens
 
#3

AW: Aufrufer feststellen

  Alt 8. Okt 2014, 15:48
Der Debugger hat manchmal Probleme Variablen zu finden/lesen.
Die Liste der überwachten Ausdrücke kann offenbar keine class function verarbeiten.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Mokus
Mokus

Registriert seit: 24. Sep 2013
165 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Aufrufer feststellen

  Alt 8. Okt 2014, 16:14
Hi Himitsu,


Schau dir einmal bitte meine Methode an, wo ich diese erstelle.

mit if Sender = PaintBox1 komm ich leider nicht weit, denn alle Paintboxen heißen ja gleich & es könnten theoretisch unendlich sein.
( kommt drauf an wie schlau der anwender ist ,) )

d.h.
Delphi-Quellcode:
IF Sender.ClassName = 'TPaintboxthen
begin
// DInge tun mit dem Pointer des Objektes
end

Also ich bräuchte den Pointer dieses Objektes und keine Abfrage ob es dies ist

da ich dinge tun möchte wie
 Variable := APaintBox.PopupMenu.Items[i].Tag; // APaitnbox ist mein Object was übergeben werden sollte
Markus
es gibt nur 10 arten von menschen !
die die binär verstehen und die die nicht. !

Geändert von Mokus ( 8. Okt 2014 um 16:16 Uhr) Grund: was vergessen
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Aufrufer feststellen

  Alt 8. Okt 2014, 16:24
Delphi-Quellcode:
var
  Box: TPaintBox;
begin
  if Sender is TPaintBox then
    begin
      Box := TPaintBox(Sender);
      MachWasMitDerPaintBox(Box);
    end;
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
Benutzerbild von himitsu
himitsu

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

AW: Aufrufer feststellen

  Alt 8. Okt 2014, 16:24
Entweder du merkst dir irgendwo die Referenzen auf deine PaintBoxen oder die Form und kannst dann damit vergleichen

oder du speicherst in der Form/PaintBox die nötige Info.
> PaintBox ableiten und ein neues Feld/Property einbauen
> oder die Info in Delphi-Referenz durchsuchenTComponent.Tag speichern, welches für die freie Nutzung des Programmiers vorgesehen ist
> oder du vergibst eben einen eindeutigen Namen

Delphi-Quellcode:
SBPaintBox := TPaintBox.Create(Form);
SBPaintBox.Name := 'SBPaintBox' + IntToStr(Zähler);
//SBPaintBox.Tag := Zähler;
//SBPaintBox.DeinProperty := ZählerOderSonstigeUnterscheidungsinformation;
Inc(Zähler);
Zitat:
mit if Sender = PaintBox1 komm ich leider nicht weit, denn alle Paintboxen heißen ja gleich & es könnten theoretisch unendlich sein.
( kommt drauf an wie schlau der anwender ist ,) )
Wenn man Referenzen vergleicht (die Variable kann natürlich auch anders heißen) dann ist der Name egal, da jede Instanz natürlich einen eigenen eindeutigen Instanzzeiger (Referenz) besitzt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 8. Okt 2014 um 16:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mokus
Mokus

Registriert seit: 24. Sep 2013
165 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: Aufrufer feststellen

  Alt 8. Okt 2014, 16:41
Hallo zusammen...

ich hatte in der Falschen richtung geforscht. hab nun die Lösung.

Es lag nicht an der TPAitnbox(Sender) ; das hatte nämlich funktioniert.

Bei mir war folgendes Problem.
Der Sender war ein TMenuItem . . .

  if TPopupMenu(TMenuItem(Sender).Owner).Owner is TPaintBox then ShowMessage( ''); So würde ich auf meine Ursprüngliche Paintbox kommen...

Aber trotzdem danke für eure Hilfe.
Markus
es gibt nur 10 arten von menschen !
die die binär verstehen und die die nicht. !
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Aufrufer feststellen

  Alt 8. Okt 2014, 16:44
Bist Du sicher, dass Du den Owner suchst und nicht PopupComponent?
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
Benutzerbild von Mokus
Mokus

Registriert seit: 24. Sep 2013
165 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: Aufrufer feststellen

  Alt 6. Nov 2014, 14:20
ja, ich musste nämlich mit der Paintbox auf das eigentlich event reagieren.
Markus
es gibt nur 10 arten von menschen !
die die binär verstehen und die die nicht. !
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Aufrufer feststellen

  Alt 6. Nov 2014, 14:46
ja, ich musste nämlich mit der Paintbox auf das eigentlich event reagieren.
Nein. Hast du überhaupt nachgelesen was er verlinkt hat?

Sender ist der, von dem das Event kommt, also das Popup.
Owner hat hiermit überhaupt nichts zu tun. (Warum verwechseln eigentlich alle Parent und Owner?) Und die PaintBox ist garantiert nicht der Owner deines Popups.
Und die Lösung wurde bereits genannt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 6. Nov 2014 um 14:49 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 02:49 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