मैं उपयोगकर्ता-पठनीय स्ट्रिंग में 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
सबरूटीन में इस पारित कर सकते हैं?
के एक सदस्य आप EMBA के पूल निर्णय enumerated प्रकार नाम नहीं द्वारा पकड़ लिया गया है है यह सच है है। यह एक आदर्श उदाहरण है कि समेकित प्रकारों का हमेशा नाम क्यों होना चाहिए। –
इसके अलावा 'स्ट्रेलन' एक ऐसा फ़ंक्शन है जो किसी फ़ंक्शन के लिए उपयोग किया जाता है जो एक निरस्त समाप्त वर्ण सरणी की लंबाई देता है। इसके बजाए 'str.PadLeft (n) 'का प्रयोग करें। –
ऐसा करने के लिए कार्यों में निर्मित क्यों नहीं उपयोग करें? https://community.embarcadero.com/blogs/entry/using-generics-rtti-to-get-enum-string-name-or-enum-value –