2016-11-19 10 views
7

मैं उपयोगकर्ता-पठनीय स्ट्रिंग में System.Classes.TShiftState को परिवर्तित करने के लिए एक सुविधाजनक फ़ंक्शन बनाने का प्रयास कर रहा हूं। इसे आसान बनाने के लिए, मैंने फ़ंक्शन को अधिक कॉम्पैक्ट बनाने के लिए, सामान्य कोड करने के लिए एक सबराउटिन बनाया है।एक अज्ञात गणना प्रकार को subroutine में कैसे पास किया जाए?

समस्या यह है कि, मैं इस सबराउटिन में TShiftState enum प्रकारों में से किसी एक को पास करने का तरीका नहीं समझ सकता। मैंने Byte, Integer, और Cardinal की कोशिश की लेकिन मुझे Incompatible types: 'Byte' and 'Enumeration' (या जो भी प्रकार मैं कोशिश कर रहा था) प्राप्त कर रहा हूं। उनमें से एक पर होवरिंग केवल $1 दिखाता है जहां आमतौर पर प्रकार होगा।

function ShiftStateStr(const Shift: TShiftState): String; 
    procedure A(const Sh: Byte; const Str: String); 
    begin 
    if Sh in Shift then 
     Result:= Result + StrLen(Str, Length(Str)+1) 
    else 
     Result:= Result + StrLen('', Length(Str)+1); 
    end; 
begin 
    Result:= ''; 
    A(ssShift, 'Shift'); 
    A(ssAlt, 'Alt'); 
    A(ssCtrl, 'Ctrl'); 
    A(ssLeft, 'Left'); 
    A(ssRight, 'Right'); 
    A(ssMiddle, 'Middle'); 
    A(ssDouble, 'Double'); 
    A(ssTouch, 'Touch'); 
    A(ssPen, 'Pen'); 
    A(ssCommand, 'Cmd'); 
    A(System.Classes.ssHorizontal, 'Horz'); 
end; 

नोट: StrLen एक अलग समारोह जो किसी दिए गए लंबाई की रिक्तियों के साथ एक स्ट्रिंग पैड है।

TShiftState तो जैसे System.Classes में परिभाषित किया गया है:

type 
    TShiftState = set of (ssShift, ssAlt, ssCtrl, 
    ssLeft, ssRight, ssMiddle, ssDouble, ssTouch, ssPen, ssCommand, ssHorizontal); 

मैं कैसे ठीक से A सबरूटीन में इस पारित कर सकते हैं?

+2

के एक सदस्य आप EMBA के पूल निर्णय enumerated प्रकार नाम नहीं द्वारा पकड़ लिया गया है है यह सच है है। यह एक आदर्श उदाहरण है कि समेकित प्रकारों का हमेशा नाम क्यों होना चाहिए। –

+1

इसके अलावा 'स्ट्रेलन' एक ऐसा फ़ंक्शन है जो किसी फ़ंक्शन के लिए उपयोग किया जाता है जो एक निरस्त समाप्त वर्ण सरणी की लंबाई देता है। इसके बजाए 'str.PadLeft (n) 'का प्रयोग करें। –

+0

ऐसा करने के लिए कार्यों में निर्मित क्यों नहीं उपयोग करें? https://community.embarcadero.com/blogs/entry/using-generics-rtti-to-get-enum-string-name-or-enum-value –

उत्तर

7

A से const Sh: TShiftState का पहला पैरामीटर बदलें। तब में

if Sh <= Shift then 

रेफरी रूप

A([ssShift], 'Shift'); 

और अंत में हालत परीक्षण में एक की प्रत्येक कॉल बदल जाते हैं। Expressions

एक्स < = Y सिर्फ मामले में एक्स के हर सदस्य वाई

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