🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: RTTI SetValue i TValue.FromVariant

#346923
From: Roman Tyczka
Date: Fri, 25 Jan 2019 14:27
47 lines
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-mail
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>

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