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
Boldar hat folgendes geschrieben : |
| 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
jaenicke hat folgendes geschrieben : |
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
SAiBOT hat folgendes geschrieben : |
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
jaenicke hat folgendes geschrieben : |
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
Chemiker hat folgendes geschrieben : |
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
jaenicke hat folgendes geschrieben : |
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
SAiBOT - Mo 08.12.08 13:49
DeddyH hat folgendes geschrieben : |
| Das sollte sich mit minimalem Aufwand ja nachrüsten lassen. |
Ja nur dann nicht mehr mit Boolean, also ist das ganze Bsp. futsch :P .
DeddyH hat folgendes geschrieben : |
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
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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!