![]() |
Set in INI speichern
Wie kann den Inhalt von einem Set möglichst effizient in einer INI-Datei speichern? Das set kann sehr viele Elemente enthalten.
Diese Lösung, die ich habe ist nicht optimal, wenn das set z.B. 50 verschiedene Elemente haben kann:
Delphi-Quellcode:
TFoo = (fA, fB, fC, fD, fE, fF, fG, fH, fI, ...)
Foo = [fA, fF, fI]; s := ''; if fA in Foo then s := s + 'fA', if fB in Foo then s := s + 'fB', if fC in Foo then s := s + 'fC', if fD in Foo then s := s + 'fD', if fE in Foo then s := s + 'fE', if fF in Foo then s := s + 'fF', usw... Ini.WriteString(...,...,s); |
Re: Set in INI speichern
Delphi-Quellcode:
Eventuell, aber wenn sich das Set-Ändert ändern sich eve. auch die Werte.
Ini.WriteInteger('S', 'K', Integer(aSet));
|
Re: Set in INI speichern
Zitat:
|
Re: Set in INI speichern
Wieviel Elemente sind in dem Set?
Teste mal das aus:
Delphi-Quellcode:
Hinter einem Set steht eigentlich nur ein Integer.
Ini.WriteInteger('S', 'K', PInteger(@aSet)^);
Um das zu fördern füge an das Ende ein Element Last = 31 an. |
Re: Set in INI speichern
Danke, das klappt. Es sind 17 Elemente im set. Ich habe aber auch größere Sets mit mehr Elementen.
|
Re: Set in INI speichern
Über 31-Elementen wird sich Wahrscheinlich der Datentyp auf Int64 ändern. Wie gesagt erzwinge den Integer mittels einem Elementes, dass den Wert e31 hat.
Achtung diese Lösung wird nur unter Win32 funktionieren. |
Re: Set in INI speichern
Hi.
32 member hatte der Set ganz früher einmal. Bei Borland hat ein Set 256 member (bit) - der Zugriff sollte besser auf den ganzen Set erfolgen:
Delphi-Quellcode:
Grüße vom marabu
type
THackedSet = packed record case Integer of 0: (AsSet: set of Char); 1: (AsArray: array [0..7] of Cardinal); end; var hs: THackedSet; i: Integer; begin with hs do begin AsSet := [#0, #255]; for i := Low(AsArray) to High(AsArray) do ShowMessage(IntToHex(AsArray[i], 8)); end; end; |
Re: Set in INI speichern
Ich hab das selbe Problem...mit einem TJvAlarm
Also speichern geht bei mir mit
Delphi-Quellcode:
Aber wie lade ich wieder?
Ini.WriteInteger('Alarm_'+IntToStr(i),'Kind',Integer(Alarm.Alarms[i].Kind));
wenn ich versuche das ganze einfach zurückzucasten
Delphi-Quellcode:
dann motzt er, er würde TJvTriggerKind nicht finden :(
Alarm.Alarms[i].Kind:=TJvTriggerKind(Ini.ReadInteger('Alarm_'+IntToStr(i),'Kind',0));
|
Re: Set in INI speichern
dann musst du logicher weise noch die unit einbinden in der TJvTriggerKind declariert ist. Oder du castest die linke seite
Delphi-Quellcode:
Integer(Alarm.Alarms[i].Kind) := Ini.ReadInteger('Alarm_'+IntToStr(i),'Kind',0);
|
Re: Set in INI speichern
Zitat:
und das zweite geht nicht (der linken Seite kann nichts zugewiesen werden) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz