Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   in Tag Integer oOder TObject schreiben (https://www.delphipraxis.net/187814-tag-integer-ooder-tobject-schreiben.html)

hoika 6. Jan 2016 12:33

in Tag Integer oOder TObject schreiben
 
Hallo,
ich versuche in ein Tag (also Integer) eine Zahl oder ein Objekt zu schreiben.
Hier meine Versuche (i ist dann mal das Tag).
Leider schmiert er mir immer ab.

Hintergrund:
Bisher standen im Tag wirklich nur Integer-Zahlen drin,
jetzt sollen es aber auch zusätzlich mal Objekte sein.

Der alte "Integer in Tag"-Code soll aber trotzdem noch laufen.

Wie mache ich das am Besten?


Danke
Heiko


Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
  O: TObject;
  P: Pointer;
begin
  O:= TObject.Create;

  i := 33;
  P := Pointer(i);
  if TObject(P) is TObject then
  begin
    O := TObject(P);
    if O is TObject then
    begin
      if O.ClassName='TObject' then  <<--  Puff
      begin

      end;
    end;
  end;


  i := Integer(O);
  P := Pointer(i);
  O := TObject(P);
  if O is TObject then
  begin
    if O.ClassName='TObject' then
    begin

    end;
  end;

end;

Uwe Raabe 6. Jan 2016 12:43

AW: in Tag Integer oOder TObject schreiben
 
Deine Abfragen, ob es sich um ein TObject handelt sind allesamt obsolet, da du im einen Fall einen HardCast durchführst und im anderen Fall O asl TOBject deklariert ist. Grundsätzlich ist es auch nicht möglich, einen beliebigen Integer von einer Objekt-Instanz zu unterscheiden. Einzig wenn die erlaubten Integer-Werte eine geeignete Obergrenze nicht überschreiten, kann das vielleicht was werden. Dann solltest du aber vor dem Cast auf TObject den Integer-Wert auf diese Grenze hin abprüfen.

himitsu 6. Jan 2016 12:58

AW: in Tag Integer oOder TObject schreiben
 
IS prüft, ob die Objektinstanz (das muß zwingend eine gültige Instanz oder NIL sein) dem angegebenen Typen (hier TObjekt) entspricht.

Man kann damit nicht prüfen ob es ein "Objekt" ist oder irgendwas Anderes.


Alles zwischen 0 und 65535 kann niemals ein Objekt sein, da UserMode-Anwendungen im Windows auf diesen Speicherbereich keinen Zugriff haben und somit dort auch nie eine Objektinstanz liegen kann.


PS: In NextGen kann/sollte man objekte garnicht von/nach Integer casten,
aber dafür hat FMX noch weitere Tag-Property und Einer ist sogar als TObjekt deklariert.

hoika 6. Jan 2016 13:10

AW: in Tag Integer oOder TObject schreiben
 
Hallo,
danke an Euch zwei, dass mit dem 0-65535 rettet mich ;)

Danke


Heiko

DeddyH 6. Jan 2016 13:11

AW: in Tag Integer oOder TObject schreiben
 
*Pfh* und ich hatte Dir extra eine PM mit "Super Duper Code" geschrieben.

himitsu 6. Jan 2016 13:14

AW: in Tag Integer oOder TObject schreiben
 
"Ordentlich" wäre z.B. eine Lösung mit entsprechenden Daten-Objekten. :stupid:

Sir Rufo 6. Jan 2016 13:45

AW: in Tag Integer oOder TObject schreiben
 
Wer XE4 sein Eigen nennt muss sich mit solchen Unarten doch nicht mehr herumschlagen. Da baut man sich einen class Helper und gut ist:
Delphi-Quellcode:
HelperForComponent = class helper for TComponent
private
  procedure SetTagObject( const Value: TObject );
  function GetTagObject: TObject;
public
  function TagObjectAs<T:class>: T;
  property TagObject: TObject read GetTagObject write SetTagObject;
end;

function HelperForComponent.TagObjectAs<T>:T;
begin
  if TagObject is T then
    Result := TagObject as T
  else
    Result := nil;
end;
Die TagObject-Referenzen selber speichert man in einem Dictionary ab.

Freundlicherweise kann man sich von einem
Delphi-Quellcode:
TComponent
informieren lassen, wenn dieses aus dem Speicher fliegt, um das Dictionary auch entsprechend zu bereinigen.

hoika 6. Jan 2016 18:48

AW: in Tag Integer oOder TObject schreiben
 
Hallo,
XE4 ist in Vorbereitung ... (wann? -> offen )

DeddyH:
den Code der PN habe ich überflogen aber einfach noch nicht verstanden ...
PS: Das passiert mit eigentlich fast nie ...
Morgen früh, 2. Versuch.

LG
Heiko


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