Einzelnen Beitrag anzeigen

Daniel B
(Gast)

n/a Beiträge
 
#1

Problem mit Fenster positionierung

  Alt 30. Jan 2003, 22: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 = '2400then
  begin
    ComboBoxBaud.ItemIndex := 0;
  end
  else if s = '4800then
  begin
    ComboBoxBaud.ItemIndex := 1;
  end
  else if s = '9600then
  begin
    ComboBoxBaud.ItemIndex := 2;
  end
  else if s = '14400then
  begin
    ComboBoxBaud.ItemIndex := 3;
  end
  else if s = '19200then
  begin
    ComboBoxBaud.ItemIndex := 4;
  end
  else if s = '28800then
  begin
    ComboBoxBaud.ItemIndex := 5;
  end
  else if s = '38400then
  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
  Mit Zitat antworten Zitat