Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Set in INI speichern (https://www.delphipraxis.net/62126-set-ini-speichern.html)

BlueStarHH 31. Jan 2006 11:51


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);

neolithos 31. Jan 2006 12:03

Re: Set in INI speichern
 
Delphi-Quellcode:
Ini.WriteInteger('S', 'K', Integer(aSet));
Eventuell, aber wenn sich das Set-Ändert ändern sich eve. auch die Werte.

BlueStarHH 31. Jan 2006 12:28

Re: Set in INI speichern
 
Zitat:

Zitat von neolithos
Delphi-Quellcode:
Ini.WriteInteger('S', 'K', Integer(aSet));

Das compiliert Delphi 5 nicht: "Ungültige Typenumwandlung". Meines Wissens nach können auch nur einzelne Elemente des set als Integer gecastet werden.

neolithos 31. Jan 2006 12:32

Re: Set in INI speichern
 
Wieviel Elemente sind in dem Set?

Teste mal das aus:

Delphi-Quellcode:
Ini.WriteInteger('S', 'K', PInteger(@aSet)^);
Hinter einem Set steht eigentlich nur ein Integer.

Um das zu fördern füge an das Ende ein Element Last = 31 an.

BlueStarHH 31. Jan 2006 12:45

Re: Set in INI speichern
 
Danke, das klappt. Es sind 17 Elemente im set. Ich habe aber auch größere Sets mit mehr Elementen.

neolithos 31. Jan 2006 13:40

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.

marabu 31. Jan 2006 15:37

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:
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;
Grüße vom marabu

glkgereon 11. Feb 2006 13:03

Re: Set in INI speichern
 
Ich hab das selbe Problem...mit einem TJvAlarm

Also speichern geht bei mir mit
Delphi-Quellcode:
Ini.WriteInteger('Alarm_'+IntToStr(i),'Kind',Integer(Alarm.Alarms[i].Kind));
Aber wie lade ich wieder?
wenn ich versuche das ganze einfach zurückzucasten
Delphi-Quellcode:
Alarm.Alarms[i].Kind:=TJvTriggerKind(Ini.ReadInteger('Alarm_'+IntToStr(i),'Kind',0));
dann motzt er, er würde TJvTriggerKind nicht finden :(

SirThornberry 11. Feb 2006 13:42

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);

glkgereon 11. Feb 2006 13:51

Re: Set in INI speichern
 
Zitat:

Zitat von SirThornberry
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);

Das Problem ist das ich nicht genau weiss in welcher unit das deklariert ist, da ich irgendwie nur die dcu's da hab... :-/

und das zweite geht nicht (der linken Seite kann nichts zugewiesen werden)

Khabarakh 11. Feb 2006 13:58

Re: Set in INI speichern
 
Zitat:

Das Problem ist das ich nicht genau weiss in welcher unit das deklariert ist, da ich irgendwie nur die dcu's da hab... :-/
Mal davon abgesehen, dass ich gar nicht wissen will, wie du das geschafft hast, kann es doch kein Problem darstellen, bei einem OpenSource-Projekt sich die Soßen zu beschaffen.

Ralf Kaiser 11. Feb 2006 14:39

Re: Set in INI speichern
 
Zitat:

Zitat von BlueStarHH
Wie kann den Inhalt von einem Set möglichst effizient in einer INI-Datei speichern? Das set kann sehr viele Elemente enthalten.
[/delphi]

Halli Hallo,

schau dir mal diese Routinen aus der Unit TypInfo an:

GetEnumName Routine
Returns the name of a Delphi enumerated type constant given its value.

GetEnumValue Routine
Returns the value of an enumerated type constant given its string representation.

Mit diesen beiden Routinen kannst du einfach eine Speicher- bzw. Laderotine schreiben die vollkommen unhabhängig von Settyp und Setgrösse ist.

NOch ein Hinweis: Falls du die JCL verwendest, schau dir mal die Unit JclRTTI an. Dort findest du Routinen um alles mögliche von/in Strings umzuwandeln die dann bequem in INI-Dateien verpackt werden können.

Ciao,
Ralf

Khabarakh 11. Feb 2006 15:25

Re: Set in INI speichern
 
Da stand etwas von möglichst effizient ;) .

mirage228 11. Feb 2006 15:31

Re: Set in INI speichern
 
Zitat:

Zitat von Khabarakh
Da stand etwas von möglichst effizient ;) .

Ich wüsste nicht, was an den RTTI Routinen ineffizient sein sollte...
Ist meiner Meinung nach ganz sinnvoll diese hier anzuwenden.

mfG
mirage228


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:01 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