पॉइंटर्स का उपयोग एलएलवीएम-आधारित डेल्फी कंपाइलर्स द्वारा समर्थित नहीं है।
यह दस्तावेज़ में एक त्रुटि होना है। बस आरटीएल पर एक नज़र डालें। यह पॉइंटर्स के उपयोग के साथ मोटी है।
उदाहरण के लिए, CompareMem
के बारे में कैसे। यह इस तरह से परिभाषित किया गया है:
function CompareMem(P1, P2: Pointer; Length: Integer): Boolean;
और कार्यान्वयन इस तरह से चलाता है:
function CompareMem(P1, P2: Pointer; Length: Integer): Boolean;
{$IF defined(POSIX)}
begin
if Length <= 0 then
Result := True
else
Result := memcmp(P1^, P2^, Length) = 0;
end;
{$ELSEIF defined(PUREPASCAL)}
....
{$ENDIF !PUREPASCAL}
POSIX
कोड मोबाइल लक्ष्यों द्वारा प्रयोग किया जाता है।
या कैसे के बारे में TObject
जो इस तरह दिखता है:
type
TObject = class
public
constructor Create;
procedure Free;
procedure DisposeOf; {$IFNDEF AUTOREFCOUNT} inline; {$ENDIF}
class function InitInstance(Instance: Pointer): TObject {$IFDEF AUTOREFCOUNT} unsafe {$ENDIF};
procedure CleanupInstance;
function ClassType: TClass; inline;
class function ClassName: string;
class function ClassNameIs(const Name: string): Boolean;
class function ClassParent: TClass;
class function ClassInfo: Pointer; inline;
class function InstanceSize: Integer; inline;
class function InheritsFrom(AClass: TClass): Boolean;
class function MethodAddress(const Name: _ShortStr): Pointer; overload;
class function MethodAddress(const Name: string): Pointer; overload;
class function MethodName(Address: Pointer): string;
class function QualifiedClassName: string;
function FieldAddress(const Name: _ShortStr): Pointer; overload;
function FieldAddress(const Name: string): Pointer; overload;
function GetInterface(const IID: TGUID; out Obj): Boolean;
class function GetInterfaceEntry(const IID: TGUID): PInterfaceEntry;
class function GetInterfaceTable: PInterfaceTable;
class function UnitName: string;
class function UnitScope: string;
{$IFDEF AUTOREFCOUNT}
function __ObjAddRef: Integer; virtual;
function __ObjRelease: Integer; virtual;
{$ENDIF}
function Equals(Obj: TObject): Boolean; virtual;
function GetHashCode: Integer; virtual;
function ToString: string; virtual;
function SafeCallException(ExceptObject: TObject;
ExceptAddr: Pointer): HResult; virtual;
procedure AfterConstruction; virtual;
procedure BeforeDestruction; virtual;
procedure Dispatch(var Message); virtual;
procedure DefaultHandler(var Message); virtual;
class function NewInstance: TObject {$IFDEF AUTOREFCOUNT} unsafe {$ENDIF}; virtual;
procedure FreeInstance; virtual;
{$IFDEF AUTOREFCOUNT}
protected
{$ENDIF}
destructor Destroy; virtual;
{$IFDEF CPP_ABI_SUPPORT}
procedure CPP_ABI_1; virtual;
procedure CPP_ABI_2; virtual;
procedure CPP_ABI_3; virtual;
{$ENDIF !CPP_ABI_SUPPORT}
protected
function GetDisposed: Boolean; inline;
procedure CheckDisposed; {$IFNDEF AUTOREFCOUNT} inline; {$ENDIF}
{$IFDEF AUTOREFCOUNT}
private const
objDestroyingFlag = Integer($80000000);
objDisposedFlag = Integer($40000000);
protected
[Volatile] FRefCount: Integer;
class procedure __MarkDestroying(const Obj); static; inline;
class function __SetDisposed(const Obj): Boolean; static; inline;
public
property RefCount: Integer read FRefCount;
{$ENDIF}
property Disposed: Boolean read GetDisposed;
end;
यह बहुत स्पष्ट है कि संकेत दिए गए मोबाइल प्लेटफार्मों पर यहां इस्तेमाल कर रहे हैं।
विषय पर एम्बरकेडेरो व्हाइटपेपर का एक पठन है: The Delphi Language for Mobile Development। फिर यह कई अवसरों पर पॉइंटर्स के उपयोग को शामिल करता है और यह स्पष्ट है कि वे समर्थित हैं। अब, यह भी सच है कि पॉइंटर्स का उपयोग निराश हो जाता है और यदि पॉइंटर्स आसानी से टाला जा सकता है तो आपको ऐसा करने के लिए प्रोत्साहित किया जाता है। लेकिन यह बताते हुए काफी अलग है कि पॉइंटर्स को कंपाइलर्स द्वारा समर्थित नहीं किया जाता है।
ऐसा लगता है कि कम से कम हल्के से विडंबनापूर्ण है कि एम्बरकेडेरो अपने उत्पादों के एफयूडी फैल रहे हैं।
स्रोत
2015-06-29 12:00:24
मुझे पता चला है कि आप 'टैग' संपत्ति में पॉइंटर्स को स्टोर नहीं कर सकते हैं, या सामान्य रूप से' मूल 'में। कम से कम आईओएस और शायद एंड्रॉइड पर भी नहीं। मैं इस के लिए एक पूरी तरह से फिर से डिजाइन धन्यवाद के बीच में हूं, और तथ्य यह है कि सब कुछ * विंडोज के तहत बस ठीक काम कर रहा था। मूर्खतापूर्ण सूची सूचीओं पर संदर्भों को संग्रहीत करने के रूप में सरल कुछ कैसे मुझे एक पूरी तरह से अलग सूची प्रबंधक (एक 'TListView'/'TListViewItem' के लिए) लिखने की आवश्यकता है। –
@ जेरी आप निश्चित रूप से 'टैग' में पॉइंटर्स स्टोर कर सकते हैं। और एक 'मूल' में। आप क्या नहीं कर सकते हैं प्रबंधित प्रबंधित प्रकार अप्रबंधित 'सूचक' या 'मूल INT' चर में हैं। क्योंकि प्रबंधित प्रकार, अच्छी तरह से प्रबंधित हैं। विंडोज़ पर यह अलग नहीं है जब आप एक गैर-प्रबंधित पॉइंटर चर में तार, इंटरफेस, गतिशील सरणी आदि को भरने का प्रयास करेंगे। आपको खुद से पूछना चाहिए कि आप बिना टाइप किए गए पॉइंटर्स का उपयोग क्यों कर रहे हैं? एक अच्छा जेनेरिक कंटेनर के साथ क्या गलत है? –
@ डेविड यह मेरा मुद्दा है, 'TListViewItem.Tag' प्रॉपर्टी मुझे पॉइंटर्स को ऑब्जेक्ट्स रखने के लिए इसका उपयोग करने की अनुमति नहीं दे रही है, जैसा वीसीएल में संभव था। खैर कम से कम मैं इसमें से एक स्टोर कर सकता हूं, लेकिन मुझे इसे वापस करने की अनुमति नहीं देगा। मैंने देखा है कि कई अन्य लोगों को सटीक मुद्दे का सामना करना पड़ता है। उदाहरण के लिए देखें: http://codeverge.com/embarcadero.delphi।फायरमोनकी/अटैचिंग-यूजर-डेटा-टू-टिस्कीवी/1 9 88307 –