Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Windowstate in INI einschreiben


110022 - Sa 06.12.08 20:47
Titel: Windowstate in INI einschreiben
Hi

Ich bekomme es einfach nicht hin den wert von "WindowState"
in einer Ini einzuspeichern

So hab ich es bisher versucht

Delphi-Quelltext
1:
2:
3:
ini.writebool('MainWindow','WindowState',form1.Windowstate);

[Fehler] Unit4.pas(113): Inkompatible Typen: 'Double' und 'TWindowState'


Aber es klappt nicht und mit der Fehlermeldung kann ich nichts anfangen.

Kann mir da bitte jemand helfen?

danke im Voraus.


Boldar - Sa 06.12.08 20:51

Windowstate ist ein integer, also musst du auch einen Integer speichern...


110022 - Sa 06.12.08 20:59

user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:
Windowstate ist ein integer, also musst du auch einen Integer speichern...

Integer funktioniert auch nicht, es wird diese Meldung ausgespuckt


Delphi-Quelltext
1:
[Fehler] Unit4.pas(113): Inkompatible Typen: 'Integer' und 'TWindowState'                    


SAiBOT - Sa 06.12.08 21:09


Delphi-Quelltext
1:
ini.writeInteger('MainWindow','WindowState',Integer(form1.Windowstate));                    



Quelltext
1:
(wsNormal = 0, wsMinimized = 1, wsMaximized = 2)                    


:wink:


jaenicke - Sa 06.12.08 21:51

Ich würde es eher nach Byte casten, denn intern wird AFAIK das benutzt für Aufzählungen und nicht Integer. ;-)
Speichern geht dann natürlich damit über WriteInteger.


SAiBOT - Sa 06.12.08 22:09

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ich würde es eher nach Byte casten, denn intern wird AFAIK das benutzt für Aufzählungen und nicht Integer. ;-)
Speichern geht dann natürlich damit über WriteInteger.


Hat das Sinn wenn WriteInteger es wieder "nach" Integer Castet?


jaenicke - Sa 06.12.08 22:14

Ich müsste mir mal den Assemblercode dazu anschauen, aber das ist ja kein Cast im eigentlichen Sinn, da kann man schon davon ausgehen, dass der Compiler das dann schon richtig macht. ;-)
Ein direkter Cast wird aber von Delphi nicht weiter geprüft. D.h. da muss man dann schon sicher sein, dass es exakt dieser Typ ist, denn man sagt ja: "Egal was du denkst was das ist, du, Delphi, behandele das jetzt als Integer.". Und meiner Meinung nach war das Byte und nicht Integer. Und da ist ja ein Unterschied von 3 Byte.

Aber das lässt sich ja überprüfen wie das auf Assemblerebene aussieht, da hab ich bisher nicht diesen Fall angeschaut. ;-)


Boldar - Sa 06.12.08 22:15

Ja, das mit byte sieht schöner aus...
man kann auch das schreiben:

Delphi-Quelltext
1:
ini.writeinteger('Mainwindow', 'Windowstate', integer(byte(cardinal(char(byte(self.windowstate))))));                    


jaenicke - Sa 06.12.08 22:27

Ich habe mich geirrt, bei Sets ist es Byte, bei Aufzählungen wohl nicht, da ist Integer wohl richtig. :oops:

// EDIT:
Ich sehe schon, die Größe wird dynamisch verändert je nach Anzahl und Inhalt der Werte. Sind es bis zu 256 wird 1 Byte verwendet, sind die Werte darüber 2 Byte, etc.


110022 - Sa 06.12.08 23:29

user profile iconSAiBOT hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
ini.writeInteger('MainWindow','WindowState',Integer(form1.Windowstate));                    



Quelltext
1:
(wsNormal = 0, wsMinimized = 1, wsMaximized = 2)                    


:wink:


Hab das genommen, das mit Byte ist mir zu kompliziert^^
Funktioniert der überhaupt mit Byte?

Wie sieht as aus wenn ich aus der Ini den wert wieder auslesen will?

so?

Delphi-Quelltext
1:
form1.WindowState:=Ini.readInteger('MainWindow','WindowState',Integer(form1.Windowstate));                    


110022 - Sa 06.12.08 23:30

Kann man den löschen?

Hab mich verklickt.....


jaenicke - So 07.12.08 00:18


Delphi-Quelltext
1:
Form1.WindowState := TWindowState(Ini.readInteger('MainWindow', 'WindowState', Integer(wsNormal)));                    
Wenn der Typ TWindowState ist, sonst musst du den entsprechend schreiben.
Der dritte Parameter ist der Standardwert, der zurückgegeben wird, wenn der Wert nicht existiert.


110022 - So 07.12.08 00:22

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
Form1.WindowState := TWindowState(Ini.readInteger('MainWindow', 'WindowState', Integer(wsNormal)));                    
Wenn der Typ TWindowState ist, sonst musst du den entsprechend schreiben.
Der dritte Parameter ist der Standardwert, der zurückgegeben wird, wenn der Wert nicht existiert.

Danke, das klappt wunderbar, musste nur das "wsNormal" gegen das passende form1.Windowstate austauschen.

Vielen dank für eure Hilfe :zustimm:


Chemiker - So 07.12.08 10:07

Hallo 110022,

in der Delphi-Hilfe steht unter „TIniFile und TMemIniFile verwenden“, dass folgende Beispiel:



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
procedure TForm1.FormCreate(Sender: TObject);
var
  Ini: TIniFile;
begin
  Ini := TIniFile.Create( ChangeFileExt( Application.ExeName, '.INI' ) );
  try
    Top     := Ini.ReadInteger( 'Form', 'Top', 100 );
 Left    := Ini.ReadInteger( 'Form', 'Left', 100 );
 Caption := Ini.ReadString( 'Form', 'Caption', 'New Form' );
    if Ini.ReadBool( 'Form', 'InitMax', false ) then
      WindowState = wsMaximized
    else
      WindowState = wsNormal;
  finally
    TIniFile.Free;
  end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action TCloseAction)
var
  Ini: TIniFile;
begin
  Ini := TIniFile.Create( ChangeFileExt( Application.ExeName, '.INI' ) );
  try
    Ini.WriteInteger( 'Form', 'Top', Top);
    Ini.WriteInteger( 'Form', 'Left', Left);
 Ini.WriteString( 'Form', 'Caption', Caption );
    Ini.WriteBool( 'Form', 'InitMax', WindowState = wsMaximized );
  finally
    TIniFile.Free;
  end;
end;


Bis bald Chemiker


SAiBOT - Mo 08.12.08 11:28

user profile iconChemiker hat folgendes geschrieben Zum zitierten Posting springen:
Hallo 110022,

in der Delphi-Hilfe steht unter „TIniFile und TMemIniFile verwenden“, dass folgende Beispiel:



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
procedure TForm1.FormCreate(Sender: TObject);
var
  Ini: TIniFile;
begin
  Ini := TIniFile.Create( ChangeFileExt( Application.ExeName, '.INI' ) );
  try
    Top     := Ini.ReadInteger( 'Form', 'Top', 100 );
 Left    := Ini.ReadInteger( 'Form', 'Left', 100 );
 Caption := Ini.ReadString( 'Form', 'Caption', 'New Form' );
    if Ini.ReadBool( 'Form', 'InitMax', false ) then
      WindowState = wsMaximized
    else
      WindowState = wsNormal;
  finally
    TIniFile.Free;
  end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action TCloseAction)
var
  Ini: TIniFile;
begin
  Ini := TIniFile.Create( ChangeFileExt( Application.ExeName, '.INI' ) );
  try
    Ini.WriteInteger( 'Form', 'Top', Top);
    Ini.WriteInteger( 'Form', 'Left', Left);
 Ini.WriteString( 'Form', 'Caption', Caption );
    Ini.WriteBool( 'Form', 'InitMax', WindowState = wsMaximized );
  finally
    TIniFile.Free;
  end;
end;


Bis bald Chemiker


Dort wird wsMinimized nicht behandelt!


Delete - Mo 08.12.08 12:15

Das sollte sich mit minimalem Aufwand ja nachrüsten lassen. Viel mehr Sorge macht mir
Zitat:

Delphi-Quelltext
1:
2:
3:
finally
    TIniFile.Free;
  end;

Hier soll eine Klasse freigegeben werden und keine Instanz :shock:


jaenicke - Mo 08.12.08 12:23

Und das steht wirklich original so inkl. der verkorksten Einrückung in der Hilfe von D7, ich hab grad nochmal nachgeschaut.
:autsch: :autsch: :autsch: :autsch: :autsch: :autsch:


Nersgatt - Mo 08.12.08 12:27

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Und das steht wirklich original so inkl. der verkorksten Einrückung in der Hilfe von D7, ich hab grad nochmal nachgeschaut.
:autsch: :autsch: :autsch: :autsch: :autsch: :autsch:

Und in Delphi 2006 steht es auch noch genauso drin.

Gruß,
Jens


jaenicke - Mo 08.12.08 12:30

Danach hab ich es fast geahnt, das gilt auch für Delphi 2009... :roll:
Sollte das wirklich noch niemandem aufgefallen sein? :shock:

// EDIT:
Doch, ist es, das steht seit 2003 für D7 in der Quality Central [http://qc.codegear.com/wc/qcmain.aspx?d=4873] die Meldung... :autsch:


SAiBOT - Mo 08.12.08 13:49

user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Das sollte sich mit minimalem Aufwand ja nachrüsten lassen.


Ja nur dann nicht mehr mit Boolean, also ist das ganze Bsp. futsch :P .

user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Viel mehr Sorge macht mir
Zitat:

Delphi-Quelltext
1:
2:
3:
finally
    TIniFile.Free;
  end;

Hier soll eine Klasse freigegeben werden und keine Instanz :shock:


xD


jaenicke - Mo 08.12.08 14:06

user profile iconSAiBOT hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Das sollte sich mit minimalem Aufwand ja nachrüsten lassen.


Ja nur dann nicht mehr mit Boolean, also ist das ganze Bsp. futsch :P .
InitMax, InitMin, wenn beides nicht, normal ;-).


SAiBOT - Mo 08.12.08 14:33

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconSAiBOT hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Das sollte sich mit minimalem Aufwand ja nachrüsten lassen.


Ja nur dann nicht mehr mit Boolean, also ist das ganze Bsp. futsch :P .
InitMax, InitMin, wenn beides nicht, normal ;-).


Das sind dann zwei Booleans also zwei Ini-Einträge. Ich würde einen Eintrg bevorzugen (Integer) aber das ist Geschmackssache :wink:


Delete - Mo 08.12.08 15:07

Ist bei 2 Boolean auch dann blöde, wenn beide true sind ;)


Chemiker - Do 11.12.08 02:35

Hallo,

ich muss mich Entschuldigen, dass ich ohne genaue Prüfung ein Beispiel aus der Delphi – Hilfe übernommen habe.

Korrigierte Ini-Funktionen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
function IniSchreiben (aForm: TForm; strIniDateiName: TFileName): boolean;
var
  Ini: TIniFile;
begin
  Result:= True;
  ini:= TIniFile.Create(strIniDateiName);
  try
    Ini.WriteInteger(aForm.Caption, 'Top', aForm.Top);
    Ini.WriteInteger(aForm.Caption, 'Left', aForm.Left);
    Ini.WriteString(aForm.Caption, 'Caption', aForm.Caption );
    Ini.WriteBool(aForm.Caption, 'InitMax', aForm.WindowState = wsMaximized );
  finally
    Ini.Free;
  end;
end;

function IniLesenAnlegen (aForm: TForm; strIniDateiName: TFileName): boolean;
var
  Ini: TIniFile;
begin
  Result:= TRUE;
  ini:= TIniFile.Create(strIniDateiName);
  try
    aForm.Top := Ini.ReadInteger( aForm.Caption, 'Top', 100 );
    aForm.Left := Ini.ReadInteger( aForm.Caption, 'Left', 100 );
    aForm.Caption := Ini.ReadString( aForm.Caption, 'Caption', aForm.Caption );
    if Ini.ReadBool( aForm.Caption, 'InitMax', false ) then
    begin
      aForm.WindowState := wsMaximized;
    end else
    begin
      aForm.WindowState := wsNormal;
    end;
  finally
    Ini.Free;
  end;
end;

wsMinimized wird aber nicht behandelt, weis nicht welchen Sinn das machen soll.

Bis bald Chemiker


Delete - Do 11.12.08 09:11

Das muss Dir doch nicht Leid tun, dass der Hersteller blödsinnigen Code in seine Beispiele schreibt.