Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Kann ein Objekt seinen Namen ausgeben? (https://www.delphipraxis.net/179661-kann-ein-objekt-seinen-namen-ausgeben.html)

delfie 23. Mär 2014 17:14

AW: Kann ein Objekt seinen Namen ausgeben?
 
Und mit dem Code von Jänicke könnte ich dann zeigen, dass alle Variablen, die sich auf das selbe Objekt beziehen, die gleiche Speicheradresse angeben?

Popov 23. Mär 2014 17:14

AW: Kann ein Objekt seinen Namen ausgeben?
 
Zitat:

Zitat von delfie (Beitrag 1253129)
kam dann daher, dass ich der Meinung war, dass die Objekt-Variable eigentlich ein Zeiger ist.

Das ist es ja auch. Du hast dich vielleicht etwas kompliziert ausgedrückt, denn eigentlich war ich von anfang an dabei dir zu sagen, dass bei
Delphi-Quellcode:
var a: TObject;
a eigentlich nur ein Integerwert ist. Siehe:
Delphi-Quellcode:
var
  a: TObject;
begin
  a := TObject.Create;
  ShowMessage(IntToStr(Integer(a)));

  a.Free;
end;
Deshalb klappt das auch was Uwe Raabe geschieben hat:
Delphi-Quellcode:
var
  a: TObject;
  b: TObject;
begin
  a := TObject.Create;
  b := a;
end;
a und b zeigen auf das gleiche Objekt, weil a nur eine Adresse ist und b die Adresse kopiert hat. Die Instanz wurde erstellt und die Adresse a zugewiesen. Aber keiner verbietet es die an b weiter zu geben.

EDIT:

Deshalb klappt auch das:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Btn: TButton;
  Btn2: TButton;
begin
  if Sender is TButton then
  begin
    Btn := Sender as TButton;
    //oder
    //Btn := TButton(Sender);

    ShowMessage(Btn.ClassName);

    Btn2 := Btn;
    Btn2.Caption := Btn2.ClassName;
  end;
end;
EDIT2:

Um das ganze noch lustiger zu machen:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  Btn: TButton;
  Int: Integer;
begin
  if Sender is TButton then
  begin
    Btn := Sender as TButton;
    Int := Integer(Btn);
    ShowMessage('Wert von Int: ' + IntToStr(Int) + '; Name von Button: ' + TButton(Int).Name);
  end;
end;

jaenicke 24. Mär 2014 05:09

AW: Kann ein Objekt seinen Namen ausgeben?
 
Zitat:

Zitat von delfie (Beitrag 1253132)
Und mit dem Code von Jänicke könnte ich dann zeigen, dass alle Variablen, die sich auf das selbe Objekt beziehen, die gleiche Speicheradresse angeben?

Richtig.

himitsu 24. Mär 2014 09:35

AW: Kann ein Objekt seinen Namen ausgeben?
 
Delphi-Quellcode:
Format('%p = %p', [Pointer(VarA), Pointer(VarB)])
oder inkl. der Delphi-Signatur "$"
Delphi-Quellcode:
Format('$%p = $%p', [Pointer(VarA), Pointer(VarB)])


Delphi-Referenz durchsuchenSysUtils.Format


Zur Konvertierung in einen "Integer", sollte man vielleicht besser z.B. IntPtr für's Casten verwenden.
z.B. bei Win64 würde eingefrorene/kaputtgemachte Integer ja einen Fehler bringen und die Hälfte abschneiden, aber hoffentlich merkt der Compiler den Fehler und stoppt mit einem Compilerfehler, weil die Größe nicht passt.

Uwe Raabe 24. Mär 2014 09:46

AW: Kann ein Objekt seinen Namen ausgeben?
 
Zitat:

Zitat von himitsu (Beitrag 1253212)
eingefrorene/kaputtgemachte Integer

Versteh mich nicht falsch, aber deine durchaus qualifizierten Aussagen würden ohne diese subtil eingestreuten Rants gerade für Anfänger wesentlich besser zu verstehen sein.

himitsu 24. Mär 2014 11:16

AW: Kann ein Objekt seinen Namen ausgeben?
 
Ups.

Grund: Früher war der Integer mal ein "dynamischer" Type, welcher mit dem System mitgewachsen ist.
In Windows 3.1 (16 Bit) war er 16 Bit groß, also 2 Byte.
In den 32-Bit-Windows-Versionen ist er 32 Bit groß, also 4 Byte.
Und theoretisch hätte er dann im 64-Bit-Bindows dann 64 Bit sien müssen, aber die große Firmen (wie Intel) entschieden sich den Einzufrieren und erfanden dafür einen neuen Typen, welcher nun mitwächst, was im Delphi jetzt der NativeInt ist.

Allerdings wurden auch Typen erfunden, welche in ihrer Größe direkt an die Pointer gebunden ist, wie z.B. der IntPtr (Pointer zu Interger).

jaenicke 24. Mär 2014 12:51

AW: Kann ein Objekt seinen Namen ausgeben?
 
Zitat:

Zitat von himitsu (Beitrag 1253217)
Und theoretisch hätte er dann im 64-Bit-Bindows dann 64 Bit sien müssen, aber die große Firmen (wie Intel) entschieden sich den Einzufrieren und erfanden dafür einen neuen Typen, welcher nun mitwächst, was im Delphi jetzt der NativeInt ist.

Der wird dann vermutlich irgendwann beim Übergang zu 128 Bit eingefroren und dann gibt es RealNativeInt usw. :lol:

Popov 24. Mär 2014 13:39

AW: Kann ein Objekt seinen Namen ausgeben?
 
Nach der Logik müßte der 256 Bit Integer dann VeryRealNativeInt heißt. Und sollte bis dahin die Welt nicht untergehen und es irgendwann den 512 Bit Integer geben, wird er kurz einfach DirectorsCutInt heißen.

delfie 5. Apr 2014 21:43

[Gelöst] AW: Kann ein Objekt seinen Namen ausgeben?
 
Herzlichen Dank für die freundlichen Erklärungen!

Hab in der Zwischenzeit damit herumprobiert und ein wenig mehr verstanden.

Kann eure Community nur weiterempfehlen.

hg, Delfie


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:47 Uhr.
Seite 2 von 2     12   

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