Article View: pl.comp.lang.delphi
Article #346910RTTI SetValue i TValue.FromVariant
From: immo
Date: Thu, 24 Jan 2019 21:59
Date: Thu, 24 Jan 2019 21:59
42 lines
2814 bytes
2814 bytes
Witam,
Nigdy "ręcznie" nie bawiłem się RTTI, zawsze używałem armatę na muchę.
Ale tym razem chciałem coś banalnego zrobić i poległem.
Mianowicie, chciałem odczytać i zapisać dowolne property komponentu, a później ustawić to wcześniej zapisane.
I o ile pobranie wartości property jako Variant i zapisanie gdziekolwiek nie robi problemu. Tzn wszystko działa i zapisuje się poprawnie.
To tyle już ustawienie property rodzi problemy.
Krótki przykład:
var
ctx : TRttiContext;
rttiType : TRttiType;
rttiProp : TRttiProperty;
value: variant;
rttiValue: TValue;
Begin
Value := GetDBValueAsVariant;
rttiValue := TValue.FromVariant(Value);
ShowMessage(rttiValue.ToString); //tutaj pokazuje poprawne wartości
ctx := TRttiContext.Create;
rttitype := ctx.GetType(jakiś np. ComboBox.ClassType);
rttiprop := rttitype.GetProperty('ItemIndex');
rttiProp.SetValue(jakiś np. ComboBox,rttiValue);
end;
i problem jest taki, że jak rttiValue jest brane z Varianta, to przy podstawianiu dostaje w ostatniej linii invalid type cast.
Jeśli Value zmienie na integer a TValue.FromVarian na TValue.From(value) to przy podstawieniu nie ma błędu i działa ok.
Jednak takie rozwiązanie jest do bani, bo ja chcę żeby to działało ze wszystkimi property (integer, string, datetime, color itp. itd.).
Tak sobie szukam po necie i raczej nie znalazłem rozwiązania, bo wszystkie albo są proste tak jak powyżej, albo dla kolekcji czy bardziej złożonych propertiesów.
Pytanie - czy ktoś mógłby nakierować mnie co jest nie tak?
pozdrawiam,
Przemek O.
Technical Details
Message-ID:
<26a7a704-1917-44d0-9661-5e95ad255534@googlegroups.com>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!news.unit0.net!feeder.erje.net!2.eu.feeder.erje.net!proxad.net!feeder1-2.proxad.net!209.85.166.216.MISMATCH!q69no185522itb.0!news-out.google.com!v71ni228ita.0!nntp.google.com!q69no185521itb.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mailShow Full Headers
Complete Article Headers
X-Received: by 2002:a24:ed8c:: with SMTP id r134mr3456351ith.30.1548367175414; Thu, 24 Jan 2019 13:59:35 -0800 (PST) X-Received: by 2002:aca:5884:: with SMTP id m126mr52579oib.4.1548367174942; Thu, 24 Jan 2019 13:59:34 -0800 (PST) Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!news.unit0.net!feeder.erje.net!2.eu.feeder.erje.net!proxad.net!feeder1-2.proxad.net!209.85.166.216.MISMATCH!q69no185522itb.0!news-out.google.com!v71ni228ita.0!nntp.google.com!q69no185521itb.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail Newsgroups: pl.comp.lang.delphi Date: Thu, 24 Jan 2019 13:59:34 -0800 (PST) Complaints-To: groups-abuse@google.com Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=91.230.119.211; posting-account=uWBjDgoAAACxkgIP6dtE4dpCnc16V86n NNTP-Posting-Host: 91.230.119.211 User-Agent: G2/1.0 MIME-Version: 1.0 Message-ID: <26a7a704-1917-44d0-9661-5e95ad255534@googlegroups.com> Subject: RTTI SetValue i TValue.FromVariant From: immo <przemek-o@soft-system.pl> Injection-Date: Thu, 24 Jan 2019 21:59:35 +0000 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit