AGB  ·  Datenschutz  ·  Impressum  







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

Adresse eines Objektes

Ein Thema von uuulf · begonnen am 2. Jul 2009 · letzter Beitrag vom 2. Jul 2009
Antwort Antwort
uuulf

Registriert seit: 2. Jul 2009
4 Beiträge
 
#1

Adresse eines Objektes

  Alt 2. Jul 2009, 12:12
Delphi-Quellcode:
unit A;
interface
uses
 unit B;
var
  ppSystem: array of ^TSystem;
  res: Integer;
begin
 [ppSystem wird von Hardware mit Adressen gefüllt]
  //Die Adressen sollen auf die Instanzen von TSystem zeigen, hier als Beispiel nur eine Instanz
  ppSystem[0]^ := TSystem.Create();
  //Methode der Instanz wird aufgerufen, möchte vermeiden hier den Zeiger auf die Instanz mitzugeben
  res:= ppSystem[0]^.open;
end;
Delphi-Quellcode:
unit B;
type TSystem = class(TObject)
  private
    function open(): Integer;

implementation
function TSystem.open: Integer;
begin
  //Hier benötige ich den Zeiger auf die Instanz
  //Self ist hier wohl der falsche Ansatz.
  result := System_open(self); //self <> ppSystem[0]
end;
Ich benötige in der Instanz von TSystem einen Zeiger auf sich selbst. Ich gehe davon aus, dass self eben genau auf seine Instanz zeigt, sowie in ppSystem[0] ebenso der Zeiger auf diese Instanz enthalten ist.
Aber self ist <> ppSystem[0]. Könnt ihr mir helfen?
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Adresse eines Objektes

  Alt 2. Jul 2009, 12:20
Klassenvariablen sind schon direkt Zeiger. Deshalb brauchst du da gar keine expliziten Pointer.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Desmulator
Desmulator

Registriert seit: 3. Mai 2007
Ort: Bonn
169 Beiträge
 
#3

Re: Adresse eines Objektes

  Alt 2. Jul 2009, 12:26
Hallo

also Objekte sind bereits Pointer. Ein Objektpointer zeigt auf Daten im Arbeitsspeicher die dieses beschreiben. Vielleicht hilft die folgendes Beispiel das zu verstehen:
Delphi-Quellcode:
var
  MyObject : TMyObject;
  YourObject : TMyObject;
begin
  MyObject := TMyObject.Create; // Erzeugen einer neuen Instanz
  YourObject := MyObject; // Nun gebe ich YourObject den selben Wert wir MyObject

  MyObject.XYZ := 12; // Ich setze die fikive Eigenschaft XYZ einfach mal auf 12

  if YourObject.XYZ = 12 then ShowMessage('So siehts aus!');
  // Ja auch YourObject ist jetzt XYZ = 12

end;
Wie gesagt Objekte sind nur Pointer da MyObject ein Pointer ist, der auf Informationen einen Objektes zeigt, verschiede ich nun den Pointer auch in YourObject. Jetzt zeigen beide auf das gleiche Objekt. Wenn man ein Objekt kopieren will, dann muss man es klonen.

Zitat:
Aber self ist <> ppSystem[0]. Könnt ihr mir helfen?
Das ist ja logisch self ist ein Pointer der auf die Informationen zeigt. Nun ist nach deinem Code ppSystem[0] ein Zeiger auf self. Heißt eine Variable die auf einen Bereich im Speicher zeigt, der den Wert von self hat. Also alles ziemlich doppelt gemoppelt.

Okay jetzt aber zu deinem Problem:

Delphi-Quellcode:
unit A;

interface
uses
  B;

var
  ppSystem: array of TSystem; // Wieso einen Pointer auf einen Pointer, unnötige Rechenaufwand ( ^TSystem, TSystem ist ein Objekt -> auch ein Pointer )
  res: Integer;

begin
  [ppSystem wird von Hardware mit Adressen gefüllt]
  //Die Adressen sollen auf die Instanzen von TSystem zeigen, hier als Beispiel nur eine Instanz
  ppSystem[0] := TSystem.Create(); // <<-- brauchen wir nicht mehr weil
  //Methode der Instanz wird aufgerufen, möchte vermeiden hier den Zeiger auf die Instanz mitzugeben
  res := ppSystem[0].open; // Hier brauchen wir auch kein ^
end;
Aber eine Frage habe ich noch, welche Hardware gibt valide Pascal-Objekte zurück, sowas wär mir neu

Delphi-Quellcode:
unit B;
type
  TSystem = class(TObject)
  public
    function open(): Integer;
  end;

implementation
 
function TSystem.open: Integer;
begin
  //Hier benötige ich den Zeiger auf die Instanz
  //Self ist hier wohl der falsche Ansatz.
  result := Integer(self); //self <> ppSystem[0]
end;
Keine Ahnung ob das jetzt das ist was du willst. Aber es ist irgendwie komisch das Hardware hier was mit Objekten zu tun hat. Allerhöchsten wenn du mit DirectX oder sowas arbeitest, allerdings sind es dort COM-Interfaces.
Lars
There are 10 kinds of people in the world:
those who get binary, and those who don’t.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Adresse eines Objektes

  Alt 2. Jul 2009, 12:32
.. warum willst Du ein dynamisches Array zum Speichern der
Objecte nutzen, dazu gibt es doch TObjectList.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
uuulf

Registriert seit: 2. Jul 2009
4 Beiträge
 
#5

Re: Adresse eines Objektes

  Alt 2. Jul 2009, 13:55
Danke für die schnellen und hilfreichen Antworten.

Zitat:
Aber eine Frage habe ich noch, welche Hardware gibt valide Pascal-Objekte zurück, sowas wär mir neu Confused
Ich habe bei der Übergabe stets auf Pointer gecastet und teils als var-Parameter übergeben.

Zitat:
.. warum willst Du ein dynamisches Array zum Speichern der
Objecte nutzen, dazu gibt es doch TObjectList.
Danke. Langsam komme ich mit der Delphihilfe zurecht, fand ich die JAVA API übersichtlicher.

Zur Erklärung meines Problems. Ich habe den C-Code ersetzt, da waren es Doppelpointer auf structs, daher ging ich davon aus, dass ich hier auch einen Doppelpointer auf eine Klasse benötige....bin nun um einiges schlauer.
  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 05:21 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