Article View: pl.comp.lang.delphi
Article #346923Re: RTTI SetValue i TValue.FromVariant
From: Roman Tyczka
Date: Fri, 25 Jan 2019 14:27
Date: Fri, 25 Jan 2019 14:27
47 lines
3143 bytes
3143 bytes
On Fri, 25 Jan 2019 06:17:23 -0800 (PST), immo wrote:
>> Value := TValue.From<Integer>(v).AsVariant;
>
> No tak zadziała to jawnie konwertujesz stringa do integera :) Podobne rozwiązanie podałem powyżej.
> Natomiast chodzi o to, że jeśli TValue w środku ma varianta stringowego to nie potrafi go skonwertować do integera. I tyle.
> Zastanawiam się tylko, czy jest jakiś powód takiego działania, czy po prostu zaniedbanie, błąd, czy może zostawione to jest na wieczne "później".
> Bo mając informacje o tym jakiego rodzaju jest property, mając informacje jakiego rodzaju jest variant w TValue nie problem przekonwertować stringa do integera... Albo przerobić SetValue, zeby nie wymagał TValue tylko Varianta...
Wynika to z tego, że TValue nie jest odpowiednikiem Varianta czyli typu
autokonwertującego, TValue służy do wewnętrzbych spraw RTTI jako kontener
na wartość.
> Wiem że varianty są kapryśne w niektórych zastosowaniach - może to jest problemem dlaczego to jest tak a nie inaczej?
>
> Zresztą - nieważne - to już tylko dywagacje na ten temat :)
To jeszcze ostatni kodzik, tym razem bazuje na typie docelowym, który
bierze z propertysa i też robi konwersję tylko bez żadnych case of:
procedure test;
var
ctx : TRttiContext;
rttiType : TRttiType;
rttiProp : TRttiProperty;
value: variant;
rttiValue: TValue;
v: Variant;
Begin
v := '5';
ctx := TRttiContext.Create;
rttitype := ctx.GetType(frmMain.cbbServerAddress.ClassInfo);
rttiProp := rttitype.GetProperty('ItemIndex');
value := rttiProp.GetValue(frmMain.cbbServerAddress).AsVariant;
value := VarAsType(v, VarType(value));
rttiValue := TValue.FromVariant(value);
rttiProp.SetValue(frmMain.cbbServerAddress, rttiValue);
end;
> pozdrawiam i miłego weekendu,
pozdrawiam także życząc spokoju i odpoczynku
--
pozdrawiam
Roman Tyczka
Technical Details
Message-ID:
<1o1a3kdzrnc90.dlg@tyczka.com>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!.POSTED!not-for-mailReferences:
<26a7a704-1917-44d0-9661-5e95ad255534@googlegroups.com> <xhs5aachxoxt.dlg@tyczka.com> <b0793d30-5159-4dd7-b059-d0add1131590@googlegroups.com> <lqwexlswweys.dlg@tyczka.com> <24f75068-0e40-489a-be02-9042b10692dc@googlegroups.com> <67ocpvsjh6td$.dlg@tyczka.com> <7bfkywf7eusg$.dlg@tyczka.com> <14p95nhiv0qm$.dlg@tyczka.com> <87d7a95e-b0fc-4481-9c60-36c02e54c3d0@googlegroups.com> <ycbbneps4ih6$.dlg@tyczka.com> <cc1d2f96-1bcd-4717-98af-a00867cd6d59@googlegroups.com>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!.POSTED!not-for-mail From: Roman Tyczka <noemail@because.no> Newsgroups: pl.comp.lang.delphi Subject: Re: RTTI SetValue i TValue.FromVariant Date: Fri, 25 Jan 2019 15:27:22 +0100 Organization: ATMAN - ATM S.A. Lines: 47 Sender: romek@tyczka.no.found Message-ID: <1o1a3kdzrnc90.dlg@tyczka.com> References: <26a7a704-1917-44d0-9661-5e95ad255534@googlegroups.com> <xhs5aachxoxt.dlg@tyczka.com> <b0793d30-5159-4dd7-b059-d0add1131590@googlegroups.com> <lqwexlswweys.dlg@tyczka.com> <24f75068-0e40-489a-be02-9042b10692dc@googlegroups.com> <67ocpvsjh6td$.dlg@tyczka.com> <7bfkywf7eusg$.dlg@tyczka.com> <14p95nhiv0qm$.dlg@tyczka.com> <87d7a95e-b0fc-4481-9c60-36c02e54c3d0@googlegroups.com> <ycbbneps4ih6$.dlg@tyczka.com> <cc1d2f96-1bcd-4717-98af-a00867cd6d59@googlegroups.com> NNTP-Posting-Host: ip-94-75-90-137.wave.com.pl Mime-Version: 1.0 X-Trace: node2.news.atman.pl 1548426442 3177 94.75.90.137 (25 Jan 2019 14:27:22 GMT) X-Complaints-To: usenet@atman.pl NNTP-Posting-Date: Fri, 25 Jan 2019 14:27:22 +0000 (UTC) User-Agent: 40tude_Dialog/2.0.15.84 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit