Görsel bileşenlerin içerik doğrulamasını RTTI kullanarak Text-property ile genelleştirmeye çalışıyorum ancak bir dize değerini TRttiMethod.Invoke içine iletmeye çalıştığımda, "Geçersiz Typecast" mesajını alıyorum. (Aslında "Ungültige Typumwandlung" ama sanırım, bu uygun bir çeviri idi.)TRINKMethod.Invoke içinde bir dizeyi doğru olarak nasıl parametre olarak kullanırım?
Aşağıdaki kod, tüm geçilen nesnelerin mükemmel olduğu varsayılarak tüm güvenlik önlemlerinden, iddialardan ve benzerlerinden sıyrılıyor.
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;
Validator'un Yürütme işlemi yalnızca bir dize Parametresine sahiptir. Dizelerin doğrudan TValue dizisine aktarıldığı örnekleri gördüm, ancak aynı yazım hatasıyla karşılaşıyorum.
düzenleme:
gerçek hata execute.Invoke(Validator,[value])
görünür.
Örnek
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;
verin bir [MCVE] yüzden –
eksik parçalarını tahmin etmek zorunda değilsiniz Durduğu gibi, bu soru konu dışı olarak kapatılmalıdır. Çünkü bir çoğaltma sağlamadınız. Bunu düzelttikten sonra (yukarıdaki yorumdaki bağlantıya bakın), cevap verebiliriz. –
Aslında kod, hatayı tespit etmek için yeterli bilgi sağlar. –