AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Wie erstelle ich einen Zeiger auf die Klasseninstanz
Thema durchsuchen
Ansicht
Themen-Optionen

Wie erstelle ich einen Zeiger auf die Klasseninstanz

Ein Thema von FriendOfDelphi · begonnen am 13. Jan 2011 · letzter Beitrag vom 13. Jan 2011
Antwort Antwort
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
2.061 Beiträge
 
Delphi 12 Athens
 
#1

AW: Wie erstelle ich einen Zeiger auf die Klasseninstanz

  Alt 13. Jan 2011, 09:08
innerhalb von
Object Methoden referenziert sich jedes Objekt über self !
Wenn du von einer Prozedur aus, aus dem Hauptprogramm heraus (dpr Datei) oder aus einer Methode heraus ein anderes Object referenzieren willst musst du schon den Variablen Namen angeben.

Es kann auch mal vorkommen das self = nil ist...oder noch schlimmer das das Object sich selbst zerstört hat (kann bei formularen passieren) aber du immer noch in einer der Methoden des bereits zerstörten Objektes bist...dann verweißt self nirgendwo hin wo es soll...
Andreas
Nobody goes there anymore. It's too crowded!

Geändert von QuickAndDirty (13. Jan 2011 um 09:12 Uhr)
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
672 Beiträge
 
Delphi 12 Athens
 
#2

AW: Wie erstelle ich einen Zeiger auf die Klasseninstanz

  Alt 13. Jan 2011, 09:12
Mein erster Gedanke war auch: Doch, genau so funktioniert es. Zeig uns doch mal etwas mehr Code und die Fehlermeldung.
  Mit Zitat antworten Zitat
FriendOfDelphi

Registriert seit: 21. Mai 2010
163 Beiträge
 
Delphi 5 Professional
 
#3

AW: Wie erstelle ich einen Zeiger auf die Klasseninstanz

  Alt 13. Jan 2011, 10:23
Mein erster Gedanke war auch: Doch, genau so funktioniert es. Zeig uns doch mal etwas mehr Code und die Fehlermeldung.
Delphi-Quellcode:
[...schnipp...]

Procedure Callback(pAddr:PAmsAddr; pNotification:PAdsNotificationHeader; hUser:Longword); stdcall;
begin
  //mache irgendwas
  //beim Aufruf der Prozedur soll in hUser der Zeiger der Klasseninstanz stehen
end;

[...schnipp...]
Das ist die Methode, die ich aus der Library aufrufe:
Delphi-Quellcode:
[...schnipp...]

result := AdsSyncAddDeviceNotificationReq( @serverAddr, ADSIGRP_DEVICE_DATA,
                                           ADSIOFFS_DEVDATA_ADSSTATE,
                                           @adsNotificationAttrib,
                                           @Callback, //hier steht die Adresse der Callback-Routine
                                           Longword(@???), //an dieser Stelle will ich den Zeiger der Klasseninstanz übergeben
                                           @hDevNotification );
[...schnipp...]
Hier steht das Beispiel, an dem ich mich orientiert habe: http://infosys.beckhoff.com/index.ph...4.htm&id=10260
Herzlichen Gruß
FriendOfDelphi
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Wie erstelle ich einen Zeiger auf die Klasseninstanz

  Alt 13. Jan 2011, 10:33
Beim Aufruf:
DieFunktion(Longword(Self));

Beim Callback:
Delphi-Quellcode:
var
  LInstanz: TMeinObjekt;
begin
  LInstanz := TMeinObjekt(hUser);
end;
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Wie erstelle ich einen Zeiger auf die Klasseninstanz

  Alt 13. Jan 2011, 10:52
Man könnte zwar auch eine externe Prozedur nehmen, aber so isses bestimmt schöner aufgeräumt.

PS: Das "static" nicht vergessen.
Delphi-Quellcode:
type
  TMeinObjekt = class(...)
    class procedure Callback(Addr: PAmsAddr; Notification: PAdsNotificationHeader; User: LongWord); stdcall; static;
    procedure InnerCallback(Addr: PAmsAddr; Notification: PAdsNotificationHeader);
  end;

procedure TMeinObjekt.Callback(Addr: PAmsAddr;
  Notification: PAdsNotificationHeader; User:Longword);
begin
  TMeinObjekt(hUser).InnerCallback(Addr, Notification);
end;

var MeinObjekt: TMeinObjekt;

AdsSyncAddDeviceNotificationReq(..., @MeinObjekt.Callback, LongWord(MeinObjekt), ...);
[edit]
da war ja nochwer fast genauso schnell
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (13. Jan 2011 um 10:55 Uhr)
  Mit Zitat antworten Zitat
FriendOfDelphi

Registriert seit: 21. Mai 2010
163 Beiträge
 
Delphi 5 Professional
 
#6

AW: Wie erstelle ich einen Zeiger auf die Klasseninstanz

  Alt 13. Jan 2011, 11:45
Ich bin ja begeistert, was ihr da so hinzaubert...

Aber könnt ihr mir mal erklären, warum ihr das so macht?

Bitte
Herzlichen Gruß
FriendOfDelphi
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Wie erstelle ich einen Zeiger auf die Klasseninstanz

  Alt 13. Jan 2011, 11:58
Wir übergeben als User-Parameter die Objektinstanz und als Zeiger eine Prozedur, statische Klassenmethode (welche quasi auch nur eine Prozedur darstellt)

Davor haben wir uns eine Prozedur gebastelt, deren Signazur derer entspricht, welchge von als Callback verlangt wird
und darin wird dann einfach nur über den übergebenen Methodenzeiger auf eine Methode dieses Objektes zugeriffen/umgeleitet.

Als Ergebnis wird somit also eine Methode eines Objekts aufgerufen.



PS: Ein "Zeiger" auf eine Methode enthält intern auch zwei Zeiger > einmal auf das Objekt und dann noch auf die Methode.
"Zeiger" ... ach, schau dir einfach mal an, was die .OnIrgendwas Events deiner VCL haben, also nahezu alles was du im IO deinen VCL-Komponenten als Ereignisse zuweisen kannst, bzw. der Typ der zugehörigen Event-Property.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Wie erstelle ich einen Zeiger auf die Klasseninstanz

  Alt 13. Jan 2011, 09:12
Achso, jetzt hab ich dich auch verstanden. (nach QAD)

Jupp, Self ist ein "versteckter" Parameter, welcher an jede Methode mit übergeben wird und darin steht die Referenz zu dem Objekt, in welchem die Methode grade ausgeführt wird.

Warum steht sowas eigentlich in der OH?
Delphi-Referenz durchsuchenSelf Delphi-Referenz durchsuchenTObject.Self
Ein Therapeut entspricht 1024 Gigapeut.
  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 14:49 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-2025 by Thomas Breitkreuz