Zmiana formy podstawowej (MainForm) podczas działania programu

Odpowiedz Nowy wątek
2011-07-31 20:19
Oskar Czarny
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

Pozostało 580 znaków

2011-07-31 21:12
0

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

Pozostało 580 znaków

2011-08-01 08:54
Oskar Czarny
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ć?

Pozostało 580 znaków

2011-08-01 09:54
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;

Pozostało 580 znaków

2011-08-01 10:56
Oskar Czarny
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. 

Pozostało 580 znaków

2011-08-01 11:08
0

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

Pozostało 580 znaków

2011-08-01 11:16
Oskar Czarny
0

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

Pozostało 580 znaków

2011-08-01 11:49
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.


Ogólnie warto zagadnienie poznać. Ale nie upierałbym się żeby na siłę stosować TIniFile. - pelsta 2011-08-01 13:37

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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