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

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1493
  • Karma: 37
    • Pepak.net
Re:Spuště Form2 s Form1
« Odpověď #15 kdy: 16-03-2013, 19:03:19 »
Tak samozřejmě to nemusíš psát přímo v OnCreate. Zrovna tak dobře bys to mohl dát třeba do OnShow, ideálně tak, že:

Kód: Delphi [Vybrat]
  1. type
  2.   TForm = class(TForm)
  3.     procedure FormCreate(Sender: TObject);
  4.     procedure FormShow(Sender: TObject);
  5.   private
  6.     fForm2UzBylZobrazen: boolean;
  7.   end;
  8.  
  9. procedure TForm1.FormCreate(Sender: TObject);
  10. begin
  11.   fForm2UzBylZobrazen := False; // V podstate zbytecne, promenne se inicializuji na False/0/nil atd., ale pro nazornost
  12. end;
  13.  
  14. procedure TForm1.FormCreate(Sender: TObject);
  15. begin
  16.   if not fForm2UzBylZobrazen then
  17.     begin
  18.     PostMessage(...);
  19.     fForm2UzBylZobrazen := True;
  20.     end;
  21. end;

kk

  • Host
Re:Spuště Form2 s Form1
« Odpověď #16 kdy: 17-03-2013, 07:58:27 »
Tak s toho začinam byt trochu mimo.
Delphi mam jen 3 měsice, takže uplna lama.
Netušil jsem že stym bude takovy problem.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2790
  • Karma: 134
    • Verze Delphi: D2007, XE3, DX10
Re:Spuště Form2 s Form1
« Odpověď #17 kdy: 17-03-2013, 08:37:38 »
Tak s toho začinam byt trochu mimo.
Delphi mam jen 3 měsice, takže uplna lama.
Netušil jsem že stym bude takovy problem.
Takova kontrolni otazka: v project options | forms jsi zajistil, aby se ti vytvarel jen hlavni form?

A pokud to nefunguje spravne, tak jsi neco udelal jinak, nez ti pepak radil. Jeste jednou rekapitulace:
1. v .dpr vytvaris jediny formular a to hlavni okno
2. Do unit hlavniho okna pridas v implementation do uses LoginForm
3. v OnCreate hlavniho okna si posles na jeho handle nejakou user message (kterou sis tam nadefinoval)
4. v handleru te user message vytvoris instanci login formulare, na ktere zalovas ShowModal a po navratu instanci formulare zrusis

Pokud si zajistis, ze ti Login formular vrati mrOK v pripade, ze bylo prihlaseni uspesne, tak muzes udelat neco takoveho:

Kód: Delphi [Vybrat]
  1. procedure TMainForm.__UM_ShowLogin(var AMsg: TMessage);
  2. var
  3.   Form: TLoginForm;
  4. begin
  5.   Form := TLoginForm.Create(self);
  6.   try
  7.     if Form.ShowModal<>mrOK then
  8.       PostMessage(self.Handle, WM_QUIT, 0, 0);
  9.   finally
  10.     Form.Release;
  11.   end;
  12. end;
  13.  

A proc se to dela: kdyz si posles sam sobe message, tak ji Windows zaradi do fronty, odkud si ji okno, kteremu byla urcena, pozdeji vyzvedne. Klicove je to pozdeji: formular se nejdriv vytvori a zobrazi (uplne probehnou vsechny odalosti OnCreate, OnShow atd.) a teprva pak jde okno cist zpravy z fronty.

Offline Slavomir

  • Mladík
  • **
  • Příspěvků: 58
  • Karma: 0
    • Verze Delphi: XE2 + 10.3 Community Edition
    • RQ Money
Re:Spuště Form2 s Form1
« Odpověď #18 kdy: 17-03-2013, 08:38:53 »
Ja by som to riešil asi trochu jednoduchšie:

1) Vytvorím Form1 a Form2.
2) V procedúre OnShow u Form1 spustím obyčajný Timer, ktorý napr. po pol sekunde spustí Form2.

Používam to, funguje to. Najskôr sa zobrazí Form1 a hneď za ním Form2.
« Poslední změna: 17-03-2013, 08:41:49 od Slavomir »
Lazarus, Delphi - RQ Money

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2790
  • Karma: 134
    • Verze Delphi: D2007, XE3, DX10
Re:Spuště Form2 s Form1
« Odpověď #19 kdy: 17-03-2013, 08:42:51 »
Ja by som to riešil asi trochu jednoduchšie:
...
Používam to, funguje to. Najskôr sa zobrazí Form1 a hneď za ním Form2.
Urcite to funguje, protoze to dela totez. Ale jestli je to jednoduzsi...

kk

  • Host
Re:Spuště Form2 s Form1
« Odpověď #20 kdy: 17-03-2013, 08:53:12 »
Citace: pf1957
Takova kontrolni otazka: v project options | forms jsi zajistil, aby se ti vytvarel jen hlavni form?
A to jak zajistim.
Určitě v options ale nemohu najit  :(

Citace: Slavomir
Ja by som to riešil asi trochu jednoduchšie:
O tom jsem take uvažoval, ale připadalo mi to jako prasarna.
V ToolBar mam ikonu, ktera mi take Form 2 vykresli, kdyby se chtěl přihlasit někdo jiny.
Možna by šlo simulovat to kliknuti hned při spouštění.
Ale zatim jsem nezkoušel a obratil se o pomoc u profiku.



Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2790
  • Karma: 134
    • Verze Delphi: D2007, XE3, DX10
Re:Spuště Form2 s Form1
« Odpověď #21 kdy: 17-03-2013, 09:32:59 »
A to jak zajistim.
Určitě v options ale nemohu najit  :(
No sice neuvadis, co mas za Delphi, ale podle me je to vsude hned na rane: Project | Options | Forms | Auto-Create forms, akorat jednu je to zalozka, jindy vetev ve stromu.

Ale nejjednoduzsi je otevrit si .DPR (v project manageru das na pojektu View Source nebo Ctrl+V) a nechas si tam pouze jeden prikaz z hlavnim oknem.
Kód: Delphi [Vybrat]
  1.   Application.CreateForm(...);
  2.  
Ovsem pokud tam mas formularu vice nez jen hlavni a login, tak budes muset zajistit, aby se ti ve vhodnou dobu vytvarely. Nechavat je v tom .DPR, pokud je aplikace skutecne nepotrebuje po celou dobu, je prasarna.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1493
  • Karma: 37
    • Pepak.net
Re:Spuště Form2 s Form1
« Odpověď #22 kdy: 17-03-2013, 09:40:35 »
1) Vytvorím Form1 a Form2.
2) V procedúre OnShow u Form1 spustím obyčajný Timer, ktorý napr. po pol sekunde spustí Form2.
Je to jednodušší v tom, že to uděláš čistě prostředky Delphi a téměř celé v GUI, nemusíš se zabývat programováním nebo dokonce WinAPI. Ale má to i své nevýhody - například je to náročnější na zdroje a hlavně se blbě odhaduje ten časový interval (na hodně pomalém nebo zatíženém počítači ta půlsekunda nemusí stačit, rychlého uživatele zase ta půlsekunda bude zdržovat). Řešení s PostMessage ani jednu z těchto nevýhod nemá.

kk

  • Host
Re:Spuště Form2 s Form1
« Odpověď #23 kdy: 18-03-2013, 06:53:09 »
Tak zas par hodin zkoušení a nic.
Vypada to že Delphi  a ja jsou 2 věci ktere k sobě nepasuji  :'(
Přes ten timer to funguje ale jen s Form2.show.
U Form2.showmodal se vykreslí Form a pak vyskoči hlaška Cannot make a visible window modal

Vice se mi libil ten 2 zpusob od pepka ale netušim kde dělam chybu.

Kód: Delphi [Vybrat]
  1. unit Unit1;
  2. interface
  3.  
  4. uses
  5.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  6.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs,password;
  7.  
  8. const
  9.   WM_USER_POVYTVORENIFORMULARE = WM_USER + 1;
  10. type
  11.   TForm1 = class(TForm)
  12.   private
  13.     procedure WMUserPoVytvoreniFormulare(var Msg: TMessage); message WM_USER_POVYTVORENIFORMULARE;
  14.   public
  15.     constructor Create(AOwner: TComponent); override;
  16.   end;
  17.  
  18. var
  19.   Form1: TForm1;
  20.  
  21. implementation
  22.  
  23. constructor TForm1.Create(AOwner: TComponent);
  24. begin
  25.   inherited Create(AOwner);
  26.   PostMessage(Handle, WM_USER_POVYTVORENIFORMULARE, 0, 0);
  27. end;
  28.  
  29. procedure TForm1.WMUserPoVytvoreniFormulare;
  30. begin
  31.   // Tady uz si delej, co potrebujes
  32.   password1.showmodal;
  33. end;
  34. end.
  35.  
Udělal jsem tak jak radil pf1957.
Zajistil, aby se vytvarel jen hlavni form.
Dopadlo to tak že se nevykresli ani Form1 a vyskoči

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2790
  • Karma: 134
    • Verze Delphi: D2007, XE3, DX10
Re:Spuště Form2 s Form1
« Odpověď #24 kdy: 18-03-2013, 08:12:39 »
Přes ten timer to funguje ale jen s Form2.show.
U Form2.showmodal se vykreslí Form a pak vyskoči hlaška Cannot make a visible window modal
Musis ten Form2 v design time nastavit jako invisible a po jeho zavreni ho zase skryt (akci v OnClose), abys ho mohl priste znovu zobrazit.

Udělal jsem tak jak radil pf1957.
Zajistil, aby se vytvarel jen hlavni form.
Dopadlo to tak že se nevykresli ani Form1 a vyskoči

No nejspis jsi udelal neco, co jsi nemel... Ale bez tveho kodu tezko vestit, co tam prasis

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1142
  • Karma: 42
    • Verze Delphi: 7, 2010
Re:Spuště Form2 s Form1
« Odpověď #25 kdy: 18-03-2013, 08:28:35 »
Tak zas par hodin zkoušení a nic.
Vypada to že Delphi  a ja jsou 2 věci ktere k sobě nepasuji  :'(
Přes ten timer to funguje ale jen s Form2.show.
U Form2.showmodal se vykreslí Form a pak vyskoči hlaška Cannot make a visible window modal

ono by stacilo prvne vypnout timer a pak volat showmodal :D :D :D
« Poslední změna: 18-03-2013, 11:29:38 od < z > »

kk

  • Host
Re:Spuště Form2 s Form1
« Odpověď #26 kdy: 19-03-2013, 06:20:58 »
Tak už jsem to přes ten timer rozchodil.
Dik moc všem za pomoc.

K.K

  • Host
Re:Spuště Form2 s Form1
« Odpověď #27 kdy: 19-03-2013, 07:50:43 »
Moh bych ještě jeden dotaz lamy.
Když do toho Form2 dam button a na něj přikaz form1.close je vše OK a po kliknuti se cely program ukonči.
Proč to nefunguje ve Form2.FormClose
Když kliknu ve Form 2 na křižek (uzavřit) aby se ukončil i form1.

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1142
  • Karma: 42
    • Verze Delphi: 7, 2010
Re:Spuště Form2 s Form1
« Odpověď #28 kdy: 19-03-2013, 08:25:58 »
aplikace se neobejde bez hlavniho formulare (Form1) - zrusenim zavres celou aplikaci,
aplikace se obejde bez jinych vedlejsich formularu (Form2) - zrusenim zavres jen dany vedlejsi formular ;)

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1493
  • Karma: 37
    • Pepak.net
Re:Spuště Form2 s Form1
« Odpověď #29 kdy: 19-03-2013, 08:54:28 »
aplikace se neobejde bez hlavniho formulare (Form1)
Obejde. Ale musíš si to sám zařídit (v .dpr souboru za Application.Run), Delphi to za tebe neudělají.