Autor Téma: Spuště Form2 s Form1  (Přečteno 6763 krát)

k.k

  • Host
Spuště Form2 s Form1
« kdy: 14-03-2013, 07:02:22 »
Dobry den.
Poradite začatečnikovi.
Muj projekt ma 2 form.
Proč když chci spustit s Form1.FormActivate Form2, vyskoči toto.



Kód: Delphi [Vybrat]
  1. procedure TForm1.FormActivate(Sender: TObject);
  2. begin
  3. Form2.showmodal;
  4. end;


Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2790
  • Karma: 134
    • Verze Delphi: D2007, XE3, DX10
Re:Spuště Form2 s Form1
« Odpověď #1 kdy: 14-03-2013, 08:02:44 »
Proč když chci spustit s Form1.FormActivate Form2, vyskoči toto.

Kód: Delphi [Vybrat]
  1. procedure TForm1.FormActivate(Sender: TObject);
  2. begin
  3. Form2.showmodal;
  4. end;
Zrejme proto, ze kdyz dostane Form1 focus, tak jeste nebyla vytvorena instance Form2 ( = nil, jak bys urcite zjistil pri pouziti debuggeru)

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2790
  • Karma: 134
    • Verze Delphi: D2007, XE3, DX10
Re:Spuště Form2 s Form1
« Odpověď #2 kdy: 14-03-2013, 09:08:14 »
Kód: Delphi [Vybrat]
  1. procedure TForm1.FormActivate(Sender: TObject);
  2. begin
  3. Form2.showmodal;
  4. end;

Jinak pro Stanislava Hrušku: typická ukázka nevhodnosti používání globálních proměnných

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4992
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Spuště Form2 s Form1
« Odpověď #3 kdy: 14-03-2013, 10:05:54 »
 ;D ;D ;D
Ináč pre tých, čo mi radia. Teraz nerobím nič iné, iba sa zbavujem globálnych premenných. V prípade potreby ich odovzdávam ako parameter. Ten môj zdroják začína byť akosi čitateľnejší/zrozumiteľnejší.
 
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

k.k

  • Host
Re:Spuště Form2 s Form1
« Odpověď #4 kdy: 14-03-2013, 16:38:53 »
Tak poradte, kam mam nacpat to.
Form2.showmodal;
Aby se mi zobrazil Form2 hned po zobrazení Form1.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1493
  • Karma: 37
    • Pepak.net
Re:Spuště Form2 s Form1
« Odpověď #5 kdy: 14-03-2013, 16:49:05 »
To není ani tak otázka na to, kam dát Form2.ShowModal, jako spíš na to, kam dát vytvoření instance Form2. Kde ty formuláře vytváříš a jak?

K.K

  • Host
Re:Spuště Form2 s Form1
« Odpověď #6 kdy: 15-03-2013, 06:01:48 »
Tak porad lamě jak na to.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1493
  • Karma: 37
    • Pepak.net
Re:Spuště Form2 s Form1
« Odpověď #7 kdy: 15-03-2013, 06:21:10 »
Když ti poradím, "musíš zařídit, aby se ten formulář vytvořil předtím, než se ho pokusíš zobrazit," pomůže ti to? Proto jsem se tě ptal, kde a jak ho vytváříš, pak bych ti mohl poradit přesněji.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1493
  • Karma: 37
    • Pepak.net
Re:Spuště Form2 s Form1
« Odpověď #8 kdy: 15-03-2013, 06:24:27 »
A když už se tím budeš zabývat, tak možná rovnou i napiš, čeho bys chtěl dosáhnout (jaký je účel této operace). Ne že by se to nedalo, ale zdá se mi poměrně podezřelé, volat ve FormActivate jednoho formuláře ShowModal druhého - ShowModal bych očekával spíš v reakci na nějaké kliknutí na tlačítko, zobrazování během FormActivate bych zase čekal spíš pomocí Show. Možná se ukáže, že to děláš správně, ale jak říkám, zrovna obvyklé to takhle není.

K.K

  • Host
Re:Spuště Form2 s Form1
« Odpověď #9 kdy: 15-03-2013, 07:50:38 »
Form 2 jsem vytvořil normalně přes project manager.
Zatim to řešim přes ten button ale nelibi.
Form 2 je takovy přihlašovaci.
Zobrazi se Form1 s prazdnym StringGridem a hned by vyskočil Form2 pro zadani informaci.
Nemam rad zbytečne klikani.
Po zadani jmena a hesla se teprve načtou data ve Form1 do StringGridu podle uživatele, ktery se přihlasil.
Netušil jsem že s tym dudou takove problemy.
Hold lama :(

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1493
  • Karma: 37
    • Pepak.net
Re:Spuště Form2 s Form1
« Odpověď #10 kdy: 15-03-2013, 08:10:49 »
1) No tak za těchto okolností je vhodné si ten formulář vytvořit sám, použít ho a hned zase zrušit - ne ho vytvořit na začátku programu, jednou použít a pak nechat celou dobu v paměti (patrně i s vyplněným heslem). Takže ten formulář v Project options vyřaď z automatického vytváření a pak si ho vytvářej sám:
Kód: Delphi [Vybrat]
  1. var
  2.   F: TForm2;
  3. begin
  4.   F := TForm2.Create(Self);
  5.   try
  6.     if F.ShowModal = mrOK then ... ;
  7.   finally
  8.     FreeAndNil(F);
  9.     end;
  10. end;

2) FormActivate pro tohle podle mě není vhodné místo. Obvykle se to řeší tak, že si formulář ve FormCreate pošle sám sobě zprávu a v obsluze té zprávy provede příslušnou akci. Například proto, že uživatel to heslo nezná, tak bude chtít přihlašovací formulář ESCAPEm zavřít a očekává, že se aplikace ukončí.
Kód: Delphi [Vybrat]
  1. const
  2.   WM_USER_POVYTVORENIFORMULARE = WM_USER + 1;
  3. type
  4.   TForm1 = class(TForm)
  5.     ...
  6.     public
  7.       constructor Create(AOwner: TComponent); override;
  8.     private
  9.       procedure WMUserPoVytvoreniFormulare(var Msg: TMessage); message WM_USER_POVYTVORENIFORMULARE;
  10.     end;
  11.  
  12. constructor TForm1.Create(AOwner: TComponent);
  13. begin
  14.   inherited Create(AOwner);
  15.   PostMessage(Handle, WM_USER_POVYTVORENIFORMULARE, 0, 0);
  16. end;
  17.  
  18. procedure TForm1.WMUserPoVytvoreniFormulare;
  19. begin
  20.   // Tady uz si delej, co potrebujes
  21. end;

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4992
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Spuště Form2 s Form1
« Odpověď #11 kdy: 15-03-2013, 08:41:59 »
Ja by som najprv vytovril a zobrazil prihlasovací formulár. Až po zadaní správnych údajov by som vytvoril a zobrazil ďalší formulár.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

k.k

  • Host
Re:Spuště Form2 s Form1
« Odpověď #12 kdy: 15-03-2013, 15:29:04 »
 Pepak dik moc za radu, ochotu i ty přiklady.

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 576
  • Karma: 25
Re:Spuště Form2 s Form1
« Odpověď #13 kdy: 15-03-2013, 17:56:41 »
Ja by som najprv vytovril a zobrazil prihlasovací formulár. Až po zadaní správnych údajov by som vytvoril a zobrazil ďalší formulár.

to jo, dá se to třeba v .dpr před tím, než se začnou vytvářet ty automaticky vytvářené formuláře

kk

  • Host
Re:Spuště Form2 s Form1
« Odpověď #14 kdy: 16-03-2013, 16:51:22 »
Tak jsem si dnes hral a zkoušel ten druhy zpusob od pepaka.
Fungovat to funguje ale vypada to nějak divně.
První se vykresli Form2.
Pak Form1.
A pak se znovu překresli ten Form2 aby byl nad Form1.

Mam to tak jak to tu dal pepak jen jsem přidal do procedure TForm1.WMUserPoVytvoreniFormulare;

form2.showmodal;