(Gast)
n/a Beiträge
|
Problem mit Fenster positionierung
30. Jan 2003, 23:01
Hallöchen,
so ich blick jetzt gar nicht mehr durch.
Kurz zum Ziel:
Das Hauptformular wird normalerweise gecentert auf dem Display angezeigt. Nun habe ich in den Einstellungen eine CheckBox, womit ich entscheiden kann, ob die Fensterposition gespeichert werden soll oder nicht. Ist die also geChecked, so soll beim schliessen die letzte position des Hauptformulares gespeichert werden. Schaltet man die CheckBox wieder aus, so soll danch das Formular dann wieder geCentert angezeigt werden. Also eigentlich nichts schwieriges.
So, jetzt ein bisschen Code:
Delphi-Quellcode:
var
MainFormMC2004: TMainFormMC2004;
mHandle: THandle;
MC2004: TMC2004;
Pfad: String;
FensterPosSave: Boolean;
Geoeffnete: Boolean;
Gespeicherte: Boolean;
Also Global!
Delphi-Quellcode:
procedure TMainFormMC2004.FormShow(Sender: TObject);
//Funktionen, Befehle, die beim Start des Programmes ausgeführt werden
var
ini: TIniFile;
s, t, r, i, n, g: string;
begin
if not (FileExists('MC2004.ini')) then //Fals es die Datei es noch nicht gibt
begin
ini := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini')); //Datei Öffnen
try
ini.WriteString('Einstellungen', 'Port', 'COM1'); //Standardwert COM1 schreiben
ini.WriteString('Einstellungen', 'Baud', '19200'); //Standardwert 19000Baud speichern
ini.WriteString('Einstellungen', 'Format', '2'); //Standardwert Müt schreiben
ini.WriteBool('Einstellungen', 'Geoeffnete', False); //Zuletzt geöffnete laden
ini.WriteBool('Einstellungen', 'Gespeicherte', False); //Zuletzt gespeicherte laden
ini.WriteString('Programme', 'Monitor', ''); //Programmpfad für's Datenmonitor
ini.WriteString('Programme', 'SAM', ''); //Programmpfad für's Signal-Anzeige-Modul
ini.WriteString('Programme', 'MC2004W', ''); //Programmpfad für's MC2004W
ini.WriteBool('Fensterdaten', 'Fensterposition', False); //Fensterposition speichern; Nein
ini.WriteInteger('Fensterdaten', 'Links', 0); //Position von Links auf 0
ini.WriteInteger('Fensterdaten', 'Oben', 0); //Position von Oben auf 0
ini.WriteInteger('Fensterdaten', 'Breite', 0); //Breite auf 0
ini.WriteInteger('Fensterdaten', 'Hoehe', 0); //Hoehe auf 0
s := 'COM1'; //ComPort Port
t := '19200'; //ComPort Baudrate
r := '2'; //Format auf Müt
Geoeffnete := False; //Zuletzt geöffnete Nein
Gespeicherte := False; //Zuletzt gespeicherte Nein
FensterPosSave := False; //Fensterposition Nein
finally
FreeAndNil(ini); //Datei Schliessen/Freigeben
end;
end
else if FileExists('MC2004.ini') then
begin
ini := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini')); //Datei Öffnen
try
s := ini.ReadString('Einstellungen', 'Port', ''); //ComPort Port
t := ini.ReadString('Einstellungen', 'Baud', ''); //ComPort Baudrate
r := ini.ReadString('Einstellungen', 'Format', ''); //Format; Std., Erw., Müt
Geoeffnete := ini.ReadBool('Einstellungen', 'Geoeffnete', False); //Zuletzt geöffnete
Gespeicherte := ini.ReadBool('Einstellungen', 'Gespeicherte', False); //Zuletzt gespeicherte
i := ini.ReadString('Programme', 'Monitor', ''); //Pfad des Datenmonitor's auslesen
n := ini.ReadString('Programme', 'SAM', ''); //Pfad des Signal-Anzeige-Modul's auslesen
g := ini.ReadString('Programme', 'MC2004W', ''); //Pfad des MC2004W
FensterPosSave := ini.ReadBool('Fensterdaten', 'Fensterposition', False); //Fensterposition
if FensterPosSave = True then
begin
MainFormMC2004.Left := ini.ReadInteger('Fensterdaten', 'Links', 0);
MainFormMC2004.Top := ini.ReadInteger('Fensterdaten', 'Oben', 0);
MainFormMC2004.Width := ini.ReadInteger('Fensterdaten', 'Breite', 0);
MainFormMC2004.Height := ini.ReadInteger('Fensterdaten', 'Hoehe', 0);
end
else if FensterPosSave = False then
begin
Position := poScreenCenter;
end;
finally
FreeAndNil(ini); //Datei Schliessen/Freigeben
end;
end;
// ComPort.Port := s; //ComPort Port setzen
// ComPort.CustomBaudRate := StrToInt(t); //ComPort Baudrate setzen
// ComPort.Open; //ComPort Öffnen
SetStandard; //Standardwerte setzen
// ZentralenStatus;
Check;
end;
Delphi-Quellcode:
procedure TMainFormMC2004.FormClose(Sender: TObject;
var Action: TCloseAction);
//Funktionen, Befehle, die beim Beenden des Programmes ausgeführt werden
var
ini: TIniFile;
begin
if not IsAllClear then
begin
if Application.MessageBox('Wollen Sie die vorhandenen Daten Speichern?',
'Speichern?', MB_YESNO) = mrYes then
begin
SpeichernClick(Sender);
end;
end;
ini := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini')); //Datei Öffnen
try
ini.WriteBool('Einstellungen', 'Geoeffnete', Geoeffnete);
ini.WriteBool('Einstellungen', 'Gespeicherte', Gespeicherte);
ini.WriteBool('Fensterdaten', 'Fensterposition', FensterPosSave);
if FensterPosSave = True then
begin
ini.WriteInteger('Fensterdaten', 'Links', MainFormMC2004.Left);
ini.WriteInteger('Fensterdaten', 'Oben', MainFormMC2004.Top);
ini.WriteInteger('Fensterdaten', 'Breite', MainFormMC2004.Width);
ini.WriteInteger('Fensterdaten', 'Hoehe', MainFormMC2004.Height);
end
else if FensterPosSave = False then
begin
ini.WriteInteger('Fensterdaten', 'Links', 0);
ini.WriteInteger('Fensterdaten', 'Oben', 0);
ini.WriteInteger('Fensterdaten', 'Breite', 641);
ini.WriteInteger('Fensterdaten', 'Hoehe', 375);
end;
finally
FreeAndNil(ini);
end;
// ComPort.WriteStr(#113#0);
// ComPort.Close; //ComPort Schliessen
end;
Und die Einstellungen:
Delphi-Quellcode:
procedure TEinstellungen.FormShow(Sender: TObject);
//ComPorts ermitteln und in ComboBox Anzeigen
var
reg: TRegistry;
sl: TStrings;
i: integer;
ini: TIniFile;
s: string;
begin
ShowMessage('Bei Änderungen, kann gleich mit den neuen Werten weiter gearbeitet'
+ #13 + 'werden. Das Programm muss nicht neu gestartet werden!');
reg := TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKey('hardware\devicemap\serialcomm', False);
sl := TStringList.Create;
reg.GetValueNames(sl);
ComboBoxPort.Items.Clear;
for i:=0 to sl.Count -1 do
begin
ComboBoxPort.Items.Add(reg.ReadString(sl.Strings[i]));
end;
sl.Free;
reg.CloseKey;
reg.free;
ComboBoxPort.ItemIndex := StrToInt(
AnsiLastChar(MainFormMC2004.ComPort.Port)) -1;
ini := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini'));
try
s := ini.ReadString('Einstellungen', 'Baud', '');
FensterPosSave := ini.ReadBool('Einstellungen', 'Fensterposition', False);
Geoeffnete := ini.ReadBool('Einstellungen', 'Geoeffnete', False);
Gespeicherte := ini.ReadBool('Einstellungen', 'Gespeicherte', False);
finally
ini.Free;
end;
if Geoeffnete = True then
begin
CheckBox1.Checked := True;
end
else if Geoeffnete = False then
begin
CheckBox1.Checked := False;
end;
if Gespeicherte = True then
begin
CheckBox2.Checked := True;
end
else if Gespeicherte = False then
begin
CheckBox2.Checked := False;
end;
if FensterPosSave = True then
begin
CheckBox3.Checked := True;
end
else if FensterPosSave = False then
begin
CheckBox3.Checked := False;
end;
if s = '2400' then
begin
ComboBoxBaud.ItemIndex := 0;
end
else if s = '4800' then
begin
ComboBoxBaud.ItemIndex := 1;
end
else if s = '9600' then
begin
ComboBoxBaud.ItemIndex := 2;
end
else if s = '14400' then
begin
ComboBoxBaud.ItemIndex := 3;
end
else if s = '19200' then
begin
ComboBoxBaud.ItemIndex := 4;
end
else if s = '28800' then
begin
ComboBoxBaud.ItemIndex := 5;
end
else if s = '38400' then
begin
ComboBoxBaud.ItemIndex := 6;
end;
end;
Delphi-Quellcode:
procedure TEinstellungen.FormClose(Sender: TObject;
var Action: TCloseAction);
var
s, t, r: string;
ini: TIniFile;
begin
ini := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini')); //Datei Öffnen
try
ini.WriteBool('Fensterdaten', 'Fensterposition', Main.FensterPosSave); //Neuen Wert Schreiben
ini.WriteBool('Einstellungen', 'Geoeffnete', Geoeffnete);
ini.WriteBool('Einstellungen', 'Gespeicherte', Gespeicherte);
finally //Neue Werte Einlesen
s := ini.ReadString('Einstellungen', 'Port', ''); //ComPort Port
t := ini.ReadString('Einstellungen', 'Baud', ''); //ComPort Baudrate
r := ini.ReadString('Einstellungen', 'Format', ''); //ComPort Format
FreeAndNil(ini); //Datei Schliessen/Freigeben
end;
end;
Und die Ini:
Code:
[Einstellungen]
Port=COM1
Baud=19200
Format=2
Geoeffnete=1
Gespeicherte=1
[Programme]
Monitor=
SAM=
MC2004W=
[Fensterdaten]
Fensterposition=0
Links=0
Oben=0
Breite=0
Hoehe=0
Ich sagte ja, ein bisschen Code.
Das schlimmste, beim ersten Start, da wird auch die .ini angelegt und bei Fensterposition steht die 0!
Bei Start erhalte ich aber die Fehlermeldung: "Cannot change in OnShow or OnPaint".
Aha, gut zu wissen.
Das nächste ist, wenn ich in den Einstellungen die CheckBox setze, wird beim Schliessen die 1 geschrieben.
Beim starten ist auch ncoh die 1 drin, auch noch wenn ich das Einstellungenfenster öffne, das Problem ist, wenn die 1 in der ini ist, dann sollte die CheckBox geChecked sein, ist sie aber nicht!
Irgend welche Ideen?
Vielen Dank.
Grüsse, Daniel
|