में परिवर्तन कुछ मैं पोर्ट को डेल्फी XE8 में डेल्फी 10 सिएटल में काम करने की कोशिश कर रहा हूं। यह कोड Winapi.Windows में GetPath फ़ंक्शन को कॉल करता है।डेल्फी 10 सिएटल Win32 GetPath और अनावश्यक टीपॉइंट और _POINTL रिकॉर्ड प्रकार
नई Win32 एपीआई समारोह हस्ताक्षर है:
function GetPath(DC: HDC; Points: PPointL; Types: PByte; nSize: Integer): Integer; stdcall;
XE8 में, पहले से समारोह "var अंक, प्रकार" जो एक "var untyped" पैरामीटर के रूप में आमतौर पर जाना जाता है था।
डेल्फी 10 सिएटल के साथ काम करने के लिए कोड को ठीक करने का मतलब है कि यूनिट में घोषित बिल्कुल प्रकारों का उपयोग करने के लिए एप्लिकेशन कोड में मनमानी प्रकारों को "एकीकृत" करना है। हालांकि मुझे भ्रमित करने वाला यह है कि दो प्रकार, पीपीओटीएल, और टीपॉइंट हैं, और जब मुझे गेटपाथ फ़ंक्शन काम कर रहा है, तो जो डेटा पॉप्युलेट करता है वह _POINTL रिकॉर्ड्स की एक सरणी में आबादी में आ जाता है, इस प्रकार Winapi में घोषित किया जाता है। विन्डोज़:
type
_POINTL = record { ptl }
x: Longint;
y: Longint;
end;
{$EXTERNALSYM _POINTL}
PPointL = ^TPointL;
TPointL = _POINTL;
हालांकि, वहाँ भी है एक और प्रकार TPoint, System.Types में घोषणा की:
TPoint = record
X: FixedInt;
Y: FixedInt;
public
कहीं और, FixedInt दोनों 32 बिट और 64 बिट Windows के लिए longint पर एलियास है, और इतने TPoint और _POINTL बराबर हैं, के रूप में जहां तक मैं कम से कम विंडोज प्लेटफॉर्म पर बता सकता हूं।
तो मौजूदा अनुप्रयोग घटक कोड सभी एक प्रकार TPoint नामित उपयोग करते हुए, इस तरह है:
procedure AddPoint(const P:TPoint);
... मैं डेल्फी 10 में RTL सूत्रों के अंदर जमीन पर स्थिति की क्या समझ बनाने के लिए कर रहा हूँ? इसे ठीक करने के लिए मेरा दृष्टिकोण क्या होना चाहिए? यूनिट TPoint इकाई स्तर पर _POINTL करने के लिए?
मैं इसे कैसे ठीक कर सकता हूं और आगे बढ़ सकता हूं? चूंकि यह कोड एक वाणिज्यिक घटक है, इसलिए मैं सोच रहा हूं कि विक्रेता तब तक प्रतीक्षा करेगा जब तक कि विक्रेता इसे ठीक नहीं करता है, लेकिन फिर, मुझे लगता है कि आरटीएल में _POINTL और TPoint को समझना, और इन संरचनाओं को परिभाषा में अनावश्यक/डुप्लिकेट क्यों किया जाता है, इससे मदद मिलेगी अन्य डेल्फी XE8 से डेल्फी 10 सिएटल से निम्न स्तर के Win32 कोड पोर्टिंग।
अद्यतन:
{$ifdef D23}
{$POINTERMATH ON}
// Delphi 10 Seattle: function GetPath(DC: HDC; Points: PPointL; Types: PByte; nSize: Integer): Integer; stdcall;
// previously had "var Points,Types" untyped,
const
gdi32 = 'gdi32.dll';
{$EXTERNALSYM GetPath}
function GetPath(DC: HDC; var Points, Types; nSize: Integer): Integer; stdcall; external gdi32 name 'GetPath';
{$endif}
प्रकार अनावश्यक नहीं हैं, क्योंकि दोनों कहीं कहीं उपयोग किए जाते हैं, लेकिन मैं मानता हूं कि गलत प्रकार का उपयोग किया जाता है। यह 'PPoint' होना चाहिए, न कि 'PPointL'। –
@RudyVelthuis कुछ Win32 एपीआई 'POINT' के बजाय' POINTL' का उपयोग करते हैं, जिन कारणों से मैं समझ नहीं पा रहा हूं। लेकिन हां, 'गेटपाथ' 'POINT' का उपयोग करता है। –
@ डेविड हेफरन: यही कारण है कि मैंने कहा कि 'POINTL' प्रकार डेल्फी में अनावश्यक नहीं है। एफडब्ल्यूआईडब्ल्यू, 'POINTL' और' RECTL' मेटाफाइल एपीआई में उपयोग किया जाता प्रतीत होता है। मुझे नहीं पता कि वे सामान्य 'POINT' और 'RECT' structs का उपयोग क्यों नहीं कर सकते हैं। शायद एमएस के अंदर एक प्रतिस्पर्धी विकास समूह, दूसरों के साथ संवाद नहीं कर रहा है। –