Delphi-PRAXiS
Seite 1 von 2  1 2      

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)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:12 Uhr.
Seite 1 von 2  1 2      

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