![]() |
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; |
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.
|
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. |
AW: in Tag Integer oOder TObject schreiben
Hallo,
danke an Euch zwei, dass mit dem 0-65535 rettet mich ;) Danke Heiko |
AW: in Tag Integer oOder TObject schreiben
*Pfh* und ich hatte Dir extra eine PM mit "Super Duper Code" geschrieben.
|
AW: in Tag Integer oOder TObject schreiben
"Ordentlich" wäre z.B. eine Lösung mit entsprechenden Daten-Objekten. :stupid:
|
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:
Die TagObject-Referenzen selber speichert man in einem Dictionary ab.
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; Freundlicherweise kann man sich von einem
Delphi-Quellcode:
informieren lassen, wenn dieses aus dem Speicher fliegt, um das Dictionary auch entsprechend zu bereinigen.
TComponent
|
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 22:58 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