Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Advanced RTTI und Set's (https://www.delphipraxis.net/195417-advanced-rtti-und-sets.html)

Ghostwalker 27. Feb 2018 06:14

Advanced RTTI und Set's
 
Moinmoin,

ich hoffe mal, mir kann jemand helfen :)

Ich habe verschiedene Set's, die ich via RTTI aufdrösel:

Beispiel SET:
Delphi-Quellcode:
   TMyEnum = (meElement1,meElement2,meElement3,meElement4);
   TMySet = Set of TMyEnum;
Aufgedröselt wird das ganze in eine kleine Zeigerkette:
Delphi-Quellcode:
    PMYTYPE = ^TMYTYPE;
    TMYTYPE = Record
                Display : String; //Bezeichnung
                Value  : TValue; //Wert
                  :
                  :
                FirstChild : PMYTYPE;
                Next : PMyType;
    end;
Was grob sowas ergibt:

MySetType
|
-- Element1 : boolean
-- Element2 : boolean;
:

Soweit funktioniert das ganze auch wunderbar. Problem ist nun, wenn ein Element auf True oder False gesetzt wird (bei den Aufgedröselten) muss das entsprechende Element auch im Set gesetzt bzw. gelöscht werden.

Da ich den konkreten Type des Sets bzw. Enums nicht hab, muss ich das ganze auch wieder über die RTTI machen, allerdings fehlt mir hier grad ein wenig der Ansatz, wie ich das machen muss. Weiß hier jemand Rat ?

Ghostwalker 28. Feb 2018 10:58

AW: Advanced RTTI und Set's
 
Gelöst:

Zuerst aus den gesetzten Teilen einen String im Format '[Wertname1,Wertname2]'.

Delphi-Quellcode:
function SetStrToValue(SetTypeName:string;value:string):TValue;
var
  ctx : TRttiContext;
  t  : TRttiType;

begin
  t := ctx.FindType(SetTypeName);
  if (t <> NIL) then
    result := TValue.Make(StringToSet(t.handle,value),t.handle,result)
 else
   Raise Exception.create('Settype not found !');
end;
Wichtig dabei ist das TValue.Make, ansonsten wird nämlich der Typ von TValue auf tkInteger gesetzt und auch als Integer behandelt, statt als Set :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz