🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.delphi
Article #346910

RTTI SetValue i TValue.FromVariant

#346910
From: immo
Date: Thu, 24 Jan 2019 21:59
42 lines
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-mail

Show 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