Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Aufrufer feststellen (https://www.delphipraxis.net/182194-aufrufer-feststellen.html)

Mokus 8. Okt 2014 14:31

Delphi-Version: XE2

Aufrufer feststellen
 
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

himitsu 8. Okt 2014 14:42

AW: Aufrufer feststellen
 
Der Debugger hat manchmal Probleme Variablen zu finden/lesen. :wall:
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. :zwinker:

Zum Vergleichen:
Delphi-Quellcode:
if Sender.Name = 'PaintBox1' then
oder besser doch
Delphi-Quellcode:
if Sender = PaintBox1 then

Uwe Raabe 8. Okt 2014 14:48

AW: Aufrufer feststellen
 
Zitat:

Zitat von himitsu (Beitrag 1275265)
Der Debugger hat manchmal Probleme Variablen zu finden/lesen. :wall:

Die Liste der überwachten Ausdrücke kann offenbar keine
Delphi-Quellcode:
class function
verarbeiten.

Mokus 8. Okt 2014 15:14

AW: Aufrufer feststellen
 
Hi Himitsu,


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

mit
Delphi-Quellcode:
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 = 'TPaintbox' then
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
Delphi-Quellcode:
 Variable := APaintBox.PopupMenu.Items[i].Tag; // APaitnbox ist mein Object was übergeben werden sollte

DeddyH 8. Okt 2014 15:24

AW: Aufrufer feststellen
 
Delphi-Quellcode:
var
  Box: TPaintBox;
begin
  if Sender is TPaintBox then
    begin
      Box := TPaintBox(Sender);
      MachWasMitDerPaintBox(Box);
    end;
end;

himitsu 8. Okt 2014 15:24

AW: Aufrufer feststellen
 
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 :roll:

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.

Mokus 8. Okt 2014 15:41

AW: Aufrufer feststellen
 
Hallo zusammen...

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

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

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

Delphi-Quellcode:
  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.

DeddyH 8. Okt 2014 15:44

AW: Aufrufer feststellen
 
Bist Du sicher, dass Du den Owner suchst und nicht PopupComponent?

Mokus 6. Nov 2014 13:20

AW: Aufrufer feststellen
 
ja, ich musste nämlich mit der Paintbox auf das eigentlich event reagieren.

himitsu 6. Nov 2014 13:46

AW: Aufrufer feststellen
 
Zitat:

Zitat von Mokus (Beitrag 1278923)
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:46 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