2017-08-24 5 views
8

मैं एक रिकॉर्ड प्रकार में टूटडेल्फी: रिकॉर्ड पैरामीटर फ़ील्ड

tLine = record 
    X, Y, Count : integer; 
    V : boolean; 
end; 

मैं एक

function fRotate(zLine: tLine; zAngle: double): tLine; 

मैं zLine पास करना चाहते हैं, लेकिन 1. द्वारा कम अपनी Y क्षेत्र के साथ है वहाँ है एक प्रक्रिया या समारोह में अपने विशिष्ट क्षेत्रों में एक रिकॉर्ड तोड़ने का एक तरीका? मैंने

NewLine:=fRotate((zLine.X, zLine.Y-1, zLine.Count, zLine.V), zAngle); 

जो काम नहीं करता है।

dec(zLine.Y); 
NewLine:=fRotate(zLine, zAngle); 
inc(zLine.Y); 

TIA

उत्तर

9

आप आमतौर पर इस के लिए एक समारोह होगा: या मैं क्या करने के लिए इस प्रकार है। बढ़ाया रिकॉर्ड के साथ आधुनिक डेल्फी में, मैं इस तरह एक स्थिर वर्ग समारोह का उपयोग करना चाहते:

type 
    TLine = record 
    public 
    X: Integer; 
    Y: Integer; 
    Count: Integer; 
    V: Boolean; 
    public 
    class function New(X, Y, Count: Integer; V: Boolean): TLine; static; 
    end; 

class function TLine.New(X, Y, Count: Integer; V: Boolean): TLine; 
begin 
    Result.X := X; 
    Result.Y := Y; 
    Result.Count := Count; 
    Result.V := V; 
end; 

फिर अपने समारोह कॉल हो जाता है:

NewLine := fRotate(TLine.New(zLine.X, zLine.Y-1, zLine.Count, zLine.V), zAngle); 

डेल्फी के पुराने संस्करणों में आप एक का उपयोग करना होगा वैश्विक दायरे पर कार्य।

3

पठनीयता के लिए मैं इस तरह, रिकॉर्ड ऑपरेटरों के साथ कोई वैकल्पिक समाधान का उपयोग करना चाहते: ध्यान दें कि यह Kobik के सुझाव के साथ लाइन में अद्यतन किया जाता है

tLine = record 
    X, Y, Count : integer; 
    V : boolean; 
    class operator Subtract(a : tLine; b : TPoint) : tLine; 
    end; 

class operator tLine.Subtract(a: tLine; b : TPoint): tLine; 
begin 
    Result.X := a.X - b.X; 
    Result.Y := a.Y - b.Y; 
    Result.Count := a.Count; 
    Result.V := a.V; 
end; 

इस निर्माण के इस प्रकार की अनुमति देता है:

fRotate(fLine - Point(0,1), fAngle); 

जो मुझे लगता है कि समझ में आता है। यदि आप कभी भी करना चाहते थे तो आप सरणी के बजाय एक साधारण पूर्णांक का उपयोग कर सकते थे, लेकिन यह X और/या Y को एक बार में कम करने की अनुमति देता है।

+1

शायद सरणी के बजाय 'TPoint' का उपयोग करें। जैसे 'fRotate (fline - प्वाइंट (0, 1), fAngle) ' – kobik

+0

हाय @ कोबिक मैंने पहले उस बारे में सोचा लेकिन मैं प्वाइंट फ़ंक्शन से परिचित नहीं था, इसलिए हाँ, आपका समाधान बहुत बेहतर है। मैं तदनुसार अपना जवाब अपडेट करूंगा। – Dsm

+0

आप दोनों के लिए धन्यवाद। मुझे मुख्य रूप से यह जानने में दिलचस्पी थी कि रिकॉर्ड पैरामीटर को इसके घटक फ़ील्ड में विभाजित किया जा सकता है या नहीं; स्पष्ट रूप से नहीं, और यह उपयोगी ज्ञान है। यह मुझे कुछ ऐसी चीज के लिए उच्च और निम्न खोज करने का प्रयास बचाता है जो वहां नहीं है। – JRBleau

संबंधित मुद्दे