Zmiana formy podstawowej (MainForm) podczas działania programu

Zmiana formy podstawowej (MainForm) podczas działania programu
  • Rejestracja: dni
  • Ostatnio: dni
0

Mam problem: Chcę aby podczas działania programu, po naciśnięciu Buttona zmieniona została forma startowa (MainForm), i jednocześnie po ponownym uruchomieniu programu, aby MainForm nadal była zmieniona (np z Form1 na Form2). W google jest wiele wątków o podobnym działaniu, ale po ponownym uruchomieniu programu exe, MainForm powraca do pierwotnych ustawień.

Jeden z niektórych wątków na google
http://www.swissdelphicenter.ch/en/showcode.php?id=665

pelsta
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 819
0

Zapisać w pliku ini która forma ma być MainForm.

  • Rejestracja: dni
  • Ostatnio: dni
0

Z plikami INI się jeszcze nie bawiłem, ale za chwilę zobaczę. A jak zapiszę już która forma ma być MainForm, to jak to potem używać?

pelsta
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 819
0

Jak będziesz się bawił to do niczego nie dojdziesz.

Najprościej widzę to mniej więcej tak:

  1. Zapis ustawienia (podczas zamykania programu)
Kopiuj
var
  f:TextFile;
  ini:string;
  mf:string;
//...
  mf:='Form1';//oznaczenie która forma ma być główna
  ini:=ChangeFileExt(ParamStr(0),'.ini');
  AssignFile(f,ini);
  Rewrite(f);
  WriteLn(f,mf);
  CloseFile(f);
  1. Odczyt ustawienia (podczas uruchamiania programu)
Kopiuj
//dodaj SysUtils do uses
//SetAsMainForm to procedura z linku, który podałeś
var
  f:TextFile;
  ini:string;
  mf:string;
//...
  mf:='';
  ini:=ChangeFileExt(ParamStr(0),'.ini');
  if FileExists(ini) then
  begin
    AssignFile(f,ini);
    Reset(f);
    ReadLn(f,mf);
    CloseFile(f);
    if mf='Form1' then SetAsMainForm(Form1);
    if mf='Form2' then SetAsMainForm(Form2);
  end;
  • Rejestracja: dni
  • Ostatnio: dni
0

Dzięki, ale mam jeszcze pytanko.

  1. Punkt idzie świetnie i tworzy plik INI z nazwą formy w środku

Drugi punkt nie wiem czy dobrze wkleiłem, bo po uruchomieniu programu, nadal MainForm jest Form5

Kopiuj
program Project1;

uses
  Forms, SysUtils,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2},
  Unit3 in 'Unit3.pas' {Form3},
  Unit4 in 'Unit4.pas' {Form4},
  Unit5 in 'Unit5.pas' {Form5},
  Unit6 in 'Unit6.pas' {Form6};

{$R *.res}

procedure SetAsMainForm(aForm:TForm);
var
  P:Pointer;
begin
  P := @Application.Mainform;
  Pointer(P^) := aForm;
end;

var
  f:TextFile;
  ini:string;
  mf:string;

begin
  Application.Initialize;

  Application.CreateForm(TForm5, Form5);
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TForm3, Form3);
  Application.CreateForm(TForm4, Form4);
  Application.CreateForm(TForm6, Form6);

        mf:='';
  ini:=ChangeFileExt(ParamStr(0),'ini');
  if FileExists(ini) then
  begin
    AssignFile(f,ini);
    Reset(f);
    ReadLn(f,mf);
    CloseFile(f);
    if mf='Form6' then SetAsMainForm(Form6);
    if mf='Form5' then SetAsMainForm(Form5);
  end;

  Application.Run;
end. 
pelsta
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 819
0

Wklejone dobrze.
Deklarację zmiennych umieściłbym przed procedurami.
Błąd w linijce z ChangeFileExt.

  • Rejestracja: dni
  • Ostatnio: dni
0

Ok, już poprawiłem i działa. Dziękuję Ci za wszystko ;)

olesio
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
  • Postów: 4191
0

Jak chcesz zobaczyć jak to się powinno zrobić na klasie przeznaczonej do tworzenia prawdziwych plików INI to przeanaluzuj sobie działanie programu, którego kod został dołączony przeze mnie do tego posta.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.