Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   ToogleSwitch und ini (https://www.delphipraxis.net/196842-toogleswitch-und-ini.html)

SaFu 25. Jun 2018 07:28

ToogleSwitch und ini
 
Guten Morgen,

Leider stehe ich etwas auf dem Schlauch mit dem ToogleSwitch.

Das Schreiben in eine Ini funktioniert super,

Code:
WriteBool(Einstellung1,Toggle1SwitchAktiviert,True);
nur das lesen, des wertes, verstehe ich nicht ganz.

Code:
ToggleSwitchAktivieren.IsOn:= ReadBool(Einstellung1,Toggle1SwitchAktiviert,True);
Wo liegt der Fehler?

Gruß
S

DeddyH 25. Jun 2018 07:36

AW: ToogleSwitch und ini
 
Ich nehme an, der Switch ist immer aktiviert. Das dürfte daher kommen, dass immer True in die Ini geschrieben wird, egal, ob der Switch aktiv ist oder nicht.

SaFu 25. Jun 2018 07:47

AW: ToogleSwitch und ini
 
Hi,

So sieht der Code aus, wenn er off ist wird ein False in die INI geschrieben.

Code:
procedure TForm2.ToggleSwitchAktivierenClick(Sender: TObject);
begin
 if ToggleSwitchAktivieren.IsOn = True then
     begin
      with TMemIniFile.Create(ConfigIniPfad) do
      try
        begin
         WriteBool(Einstellung1,Toggle1SwitchAktiviert,True);
         UpdateFile;
        end;
       finally
       Free;
      end;
    end
  else // ab hier wenn Toogle1 Aus dann:
    begin
      with TMemIniFile.Create(ConfigIniPfad) do
      try
        begin
         WriteBool(Einstellung1,Toggle1SwitchAktiviert,False);
         UpdateFile;
        end;
       finally
       Free;
      end;
    end;
end;

HolgerX 25. Jun 2018 07:55

AW: ToogleSwitch und ini
 
Hmm..

Habe hier kein ToggleSwitch, aber aus den Codschnipsel müsste es nicht besser so gehen?

(ich gehe davon aus, das Einstellung1 und Toggle1SwitchAktiviert strings sind, in denen die Section und der Parametername stehen)

Code:
procedure TForm2.ToggleSwitchAktivierenClick(Sender: TObject);
begin
  with TMemIniFile.Create(ConfigIniPfad) do
  try
    WriteBool(Einstellung1,Toggle1SwitchAktiviert,ToggleSwitchAktivieren.IsOn);
    UpdateFile;
  finally
    Free;
  end;
end;
Wobei ich nicht bei jedem Clieck auf dem Switch direkt in die INI schreiben würde...

Uwe Raabe 25. Jun 2018 07:56

AW: ToogleSwitch und ini
 
Das kann man aber deutlich abkürzen:
Delphi-Quellcode:
with TMemIniFile.Create(ConfigIniPfad) do
  try
    WriteBool(Einstellung1,Toggle1SwitchAktiviert,ToggleSwitchAktivieren.IsOn);
    UpdateFile;
  finally
    Free;
  end;
Das Lesen wird vermutlich gar nicht compilieren, da IsOn eine Function und kein writable Property ist.
Delphi-Quellcode:
ToggleSwitchAktivieren.State := IfThen<TToggleSwitchState>(ReadBool(Einstellung1,Toggle1SwitchAktiviert,True), tssOn, tssOff);

DeddyH 25. Jun 2018 07:58

AW: ToogleSwitch und ini
 
Delphi-Quellcode:
procedure TForm2.ToggleSwitchAktivierenClick(Sender: TObject);
var
  Ini: TMemIniFile;
begin
  Ini := TMemIniFile.Create(ConfigIniPfad);
  try
    Ini.WriteBool(Einstellung1,Toggle1SwitchAktiviert, ToggleSwitchAktivieren.IsOn);
    Ini.UpdateFile;
  finally
    Ini.Free;
  end;
end;
Da IsOn eine Funktion ist, kann man ihr auch nichts zuweisen, da müsstest Du wohl auf die State-Eigenschaft zurückgreifen.

KodeZwerg 25. Jun 2018 07:59

AW: ToogleSwitch und ini
 
Delphi-Quellcode:
Wie lautet Ini Anweisung? Ist bei Dir nich ersichtlich.
Beispiel:
  ini := TIniFile.create(IncludeTrailingBackslash(ExtractFilePath(ParamStr(0))) + 'settings.ini');
  try
    ini.WriteBool('Setup', 'Einstellung1', Hier_Kommt_Ein_Boolean-Wert_rein);
    Hier_Kommt_Ein_Boolean-Wert_rein := ini.ReadBool('Setup', 'Einstellung1', False);
  finally
    ini.free;
  end;
Das obige bewirkt, das in Datei Settings.ini eine Sparte [Setup] angelegt wird, als einstellungsname wird Einstellung1 genommen und als Wert True oder False geschrieben, der Wert ist Hier_Kommt_Ein_Boolean-Wert_rein

SaFu 25. Jun 2018 08:16

AW: ToogleSwitch und ini
 
Ich glaube das einfachste wird sein ich nehm eine Checkbox ;)

Danke trotzdem.

freimatz 25. Jun 2018 08:37

AW: ToogleSwitch und ini
 
Auf die Gefahr hin, dass ich jetzt ganz blöd dastehe: Was ist denn Toggle1SwitchAktiviert? Welchen Typ hat das, wo ist das definiert?

Hobbycoder 25. Jun 2018 08:45

AW: ToogleSwitch und ini
 
Zitat:

Zitat von freimatz (Beitrag 1405706)
Auf die Gefahr hin, dass ich jetzt ganz blöd dastehe: Was ist denn Toggle1SwitchAktiviert? Welchen Typ hat das, wo ist das definiert?

Ich nehme mal an, dass der TE in seiner INI immer ToogleSwitch.Active verwendet hat, welches dummerweise nicht für die Schalterfunktion verwendet wird, sondern lediglich das Control in der Form Aktiviert(Anklickbar) oder Deaktiviert(nicht Anklickbar).
Allerdings würde das bei einer Checkbox im gleichen Problem enden.

Zitat:

Zitat von SaFu (Beitrag 1405704)
Ich glaube das einfachste wird sein ich nehm eine Checkbox ;)
Danke trotzdem.

Das ist nicht die richtige Einstellung und löst dein Problem möglicherweise auch nicht.

Einfach mal eine Blick in den Objektinspektor werfen, und dort mal ermitteln mit welcher Eigenschaft das Toogle umgeschaltet wird. Weiterhin hilf F1 auch dort.

Uwe Raabe 25. Jun 2018 08:47

AW: ToogleSwitch und ini
 
Zitat:

Zitat von SaFu (Beitrag 1405704)
Ich glaube das einfachste wird sein ich nehm eine Checkbox

Das Einfachste wäre die Verwendung einer TAction. Dann ist das verwendete Control egal.

SaFu 25. Jun 2018 09:29

AW: ToogleSwitch und ini
 
Zitat:

Zitat von SaFu:
Ich glaube das einfachste wird sein ich nehm eine Checkbox
Danke trotzdem.
Zitat:

Das ist nicht die richtige Einstellung und löst dein Problem möglicherweise auch nicht.

Ich weis, das es nicht gerade die Beste Einstellung ist, aber über diesen blöden TToogleswitch, findet man auch hier im Forum keine Einträge, gehe davon aus, das eigentlich so gut wie keiner diese Ding benutzt.

Mit der Checkbox habe ich es gerade schon umgesetzt und es funktioniert nun alles so wie ich es benötige.

Uwe Raabe 25. Jun 2018 09:42

AW: ToogleSwitch und ini
 
Zitat:

Zitat von SaFu (Beitrag 1405713)
aber über diesen blöden TToogleswitch, findet man auch hier im Forum keine Einträge, gehe davon aus, das eigentlich so gut wie keiner diese Ding benutzt.

Ich benutze den sehr häufig z.B. in Applikationen, die per Touch bedient werden. Allerdings arbeite ich dort eben mit Actions, was übrigens auch für die Checkbox die empfohlene Herangehensweise wäre.

DieDolly 25. Jun 2018 12:48

AW: ToogleSwitch und ini
 
Ich bin zwar absoluter Anfänger und dürfte hier eigentlich gar nicht reinschreiben, aber eines habe ich ganz am Anfang trotzdem gelernt
nicht auf True oder False vergleichen
Es gibt sicher Ausnahmefälle, die sind mir aber nur in Scriptsprachen bekannt.

Zitat:

if ToggleSwitchAktivieren.IsOn = True then
-------------------------------------^^^^^

himitsu 25. Jun 2018 12:52

AW: ToogleSwitch und ini
 
Einfacher Grund: Es gibt beim Delphi-Boolean 255 Werte die True bedeuten und einen False.

Beim Zuweisen ist es OK, aber beim Vergleichen kann das eben zu Problemen fühlen, denn True ist <>0 und False ist =0, aber diese Konstante True ist =1.
In C++ ist BOOL oft ein Integer und kein Byte, somit 4 Milliarden True und ein False. Und die Konstante ist manchmal +1 ($0000001) und meisten -1 ($ffffffff).

Sherlock 25. Jun 2018 13:24

AW: ToogleSwitch und ini
 
Es ist auch schlicht überflüssig und erschwert unter Umständen die Lesbarkeit des Codes.

Sherlock

haentschman 25. Jun 2018 14:09

AW: ToogleSwitch und ini
 
Zitat:

Ich bin zwar absoluter Anfänger und dürfte hier eigentlich gar nicht reinschreiben
...wer sagt denn so etwas.:shock: Du kannst überall reinschreiben...solange es zum Thema gehört. :zwinker:

freimatz 26. Jun 2018 07:21

AW: ToogleSwitch und ini
 
delete

freimatz 26. Jun 2018 17:16

AW: ToogleSwitch und ini
 
Zitat:

Zitat von himitsu (Beitrag 1405740)
Einfacher Grund: Es gibt beim Delphi-Boolean 255 Werte die True bedeuten und einen False.

Das finde ich so nicht richtig. In der Orginaldoku (http://docwiki.embarcadero.com/Libra...System.Boolean) steht:
Delphi-Quellcode:
type Boolean = (False, True);
Demnach ist es ein Aufzählungstyp und hat genau zwei Werte nämlich False und True.

Intern wird ein Byte verwendet was auch dokumentiert ist. Aber das steht auf einem anderen Blatt und solange man sauber programmiert hat man damit nichts zu tun.

Als Grund warum man Vergleiche mit True oder False nicht machen sollte sehe ich wie Sherlock bei der Leserlichkeit.

himitsu 26. Jun 2018 17:20

AW: ToogleSwitch und ini
 
Es wird immer nur mit ganzen Bytes gearbeitet.

Das Selbe gilt auch für Aufzählungstypen.
Ein ENUM oder SET mit zwei Werten ist eben nicht nur 1 bzw. 2 Bits groß
und kann somit auch weitere Werte enthalten.

Delphi-Quellcode:
type TMyEnum = (meNull, meEins);

var E: TMyEnum;

E := TMyEnum(3);
Bei Enums kommt es dabei auch auf
Delphi-Quellcode:
{$MINENUMSIZE}
drauf an, wieviele Bytes es nun letztendlich sind.
http://docwiki.embarcadero.com/RADSt..._size_(Delphi)


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