Zmiana formy podstawowej (MainForm) podczas działania programu

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

0

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

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ć?

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)

    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);
  2. Odczyt ustawienia (podczas uruchamiania programu)

    //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;
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

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. 
0

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

0

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

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0