मैं आरटीटीआई का उपयोग कर टेक्स्ट-प्रॉपर्टी के साथ दृश्य घटकों की सामग्री सत्यापन को सामान्यीकृत करने की कोशिश कर रहा हूं, लेकिन जब मैं TRttiMethod.Invoke में स्ट्रिंग मान पास करने का प्रयास करता हूं, तो मुझे संदेश "अमान्य टाइपकास्ट" मिलता है। (असल में "Ungültige Typumwandlung" लेकिन मुझे लगता है कि यह एक उपयुक्त अनुवाद था।)मैं TRttiMethod.Invoke में स्ट्रिंग का सही तरीके से उपयोग कैसे करूं?
नीचे दिया गया कोड सभी सुरक्षा उपायों, दावों और इतने पर छीन लिया गया है, मानते हैं कि सभी पास की गई वस्तुएं बिल्कुल सही हैं।
procedure ValidateTextFieldAndSetFocus(const Field: TObject; const Validator: TObject; const errorStates: array of TStringValidationResult; const sErrorMessage: string);
var
context : TRttiContext;
objField : TRttiType;
objValid : TRttiType;
prop : TRttiProperty;
execute : TRttiMethod;
I : Integer;
validResult : TStringValidationResult;
value : TValue;
begin
context := TRttiContext.Create;
objField := context.GetType(Field.ClassInfo);
objValid := context.GetType(Validator.ClassInfo);
prop := objField.GetProperty('Text');
value := prop.GetValue(Field);
execute := objValid.GetMethod('Execute');
for I := 0 to High(errorStates) do
if execute.Invoke(Validator,[value]).TryAsType<TStringValidationResult>(validResult) then
if validResult = errorStates[I] then
begin
SetFocusIfCan(Field);
raise Exception.Create(sErrorMessage);
end;
end;
वैलिडेटर निष्पादन में केवल एक स्ट्रिंग-पैरामीटर है। मैंने उदाहरण देखे हैं जहां तारों को सीधे टीवीएयू की सरणी में पारित किया गया था, लेकिन फिर मुझे एक ही टाइपकास्ट त्रुटि मिलती है।
संपादित करें: execute.Invoke(Validator,[value])
में
वास्तविक त्रुटि दिखाई देता है।
उदाहरण
TNoSemicolonNullValidator = class
class function Execute(const aStr: string): TStringValidationResult;
end;
procedure TestValidation;
var
Validator : TNoSemicolonNullValidator;
begin
Validator := TNoSemicolonNullValidator.Create;
try
ValidateTextFieldAndSetFocus(Edit1,Validator,[svInvalid],'Edit1 is invalid!');
finally
Validator.Free;
end;
end;
प्रदान करें एक [mcve] तो हम भागों कि –
याद कर रहे हैं लगता है की जरूरत नहीं है कि जैसा कि यह खड़ा है, इस सवाल को विषय से दूर होने के रूप में बंद किया जाना चाहिए। क्योंकि आपने प्रजनन प्रदान नहीं किया है। एक बार जब आप इसका समाधान कर लें (ऊपर टिप्पणी में लिंक देखें), तो हम जवाब देने में सक्षम होंगे। –
असल में कोड गलती को खोजने के लिए पर्याप्त जानकारी प्रदान करता है। –