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.