Witam, mam taki mały problem. Otóż gry otworzę inną formę przez Form.Show schowa poprzednią Form.Hide i zamknę program na tej drugiej, to program wciąż działa w procesach. Wiecie może jak to rozwiązać?
Jeśli z pierwszego formularza uruchamiasz drugi przez:
Form2.Show();
i chowasz pierwszy przez:
Form1.Hide()
po czym zamkniesz drugą formę krzyżykiem (lub w inny sposób) to nie zamykasz aplikacji, tylko ten konkretny formularz; Z racji tej, że pierwszy schowałeś i nie przywróciłeś go po zamknięciu drugiego - aplikacja nadal pracuje, jednak Form1
jest ukryty i wydaje się, jakby program zakończył działanie, ale wcale tak nie jest;
Jeśli więc chcesz, aby po zamknięciu drugiego formularza ten pierwszy został z powrotem pokazany - w zdarzeniu Form2.OnClose
wpisz:
Form1.Show();
Jeśli natomiast po zamknięciu drugiego formularza chcesz, by aplikacja została zamknięta, w zdarzeniu Form2.OnClose
wpisz:
Form1.Close();
Oczywiście nie zapomnij dodać w odpowiednich miejscach w sekcji uses
modułów zawierających deklarację i definicję klas formularzy;
Mimo wszystko polecam przeczytać jakiś dobry kurs programowania, a jak już nauczysz się posługiwać podstawowymi mechanizmami - zacząć stosować dynamiczne tworzenie formularzy.
Dzięki, nie wziąłem pod uwagę tego.
Ale mam problem bo wyskakuje mi błąd: [dcc64 Fatal Error] Main.pas(7): F2046 Out of memory
Nie wiem dlaczego, RAMu mi nie brakuje, w tym momencie do dyspozycji jest ponad 9GB. Na dysku mam dostępne jeszcze 211 GB.
Błąd pojawia się w sekcji Uses w drugim pliku, przy deklaracji poprzedniego a kursor wskazuje na:
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, >>Welcome<<, Configurator;
zamiana znacznika <code class="cpp"> na <code class="delphi"> - fp
Napisz co masz w siódmej linijce, która powoduje błąd oraz podaj z której wersji Delphi korzystasz; Ja niestety mam tylko Delphi7 i na nim przetestowałem - działa bez problemu; Podaj w ogóle kod jaki testujesz, bo na ślepo ciężko wyłapać wadę;
EDIT: A która to siódma linijka...? o.O
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, >>Welcome<<, Configurator;
To >>Welcome<<
to masz tak zaznaczone (przez siebie), czy tak jest w kodzie wpisane? Co jest w ogóle w tym module Welcome
?
Korzystać z RAD Studio XE3.
Kod Main.pas jeszcze nic nie ma, ale proszę:
unit Main;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Welcome, Configurator;
type
TfMain = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fMain: TfMain;
implementation
{$R *.dfm}
procedure TfMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
fWelcome.Show;
end;
end.
Ale gdy przełączam typ kompilacji na Release(bo ponoć to ma pomóc) to pojawia mi się inny błąd:
[dcc64 Fatal Error] Main.pas(7): F2047 Circular unit reference to 'Welcome'
Gdy usunę deklarację Welcome, to nie mogę wtedy wykonać fWelcome.Show. Więc nie rozumiem....
Kod Main.pas jeszcze nic nie ma, ale proszę:
Nie chodziło mi o moduł Main
, bo nie podałeś nazwy modułu, w którym jest deklaracja modułów jakią wkleiłeś do posta, tylko o Welcome
; No nic - widzę co kombinujesz;
Dodaj nowy uses
do sekcji implementation
- unikniesz błędu circular unit reference
, który oznacza, że moduł Main
jest zadeklarowany w module Welcome
także w sekcji interface
, przez co kompilacja się zapętla:
unit Main;
interface
uses
{...} Welcome;
unit Welcome
interface
uses
{...} Main;
Najprawdopodobniej tak to wygląda;
W module Main
dodaj sekcję uses
pod implementation
i przenieś tam moduły Welcome
i Configurator
(jeśli ten także jest napisany przez Ciebie):
unit Main;
interface
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs;
{...}
implementation
uses
Welcome, Configurator;
Podobnie zrób w module Welcome
:
unit Welcome;
interface
{...}
implementation
uses
Main;
i powinno wszystko się ładnie kompilować;
Ale gdy przełączam typ kompilacji na Release(bo ponoć to ma pomóc)
Tryb Release
jest używany do kompilacji ostatecznej wersji aplikacji przed dystrybucją - dzięki temu do pliku nie lądują np. symbole debugera (i inne zbędne dla użytkownika informacje) potrzebne do debugowania kodu, które zwiększają rozmiar pliku wykonywalnego.
Hahaha! Dzięki wielkie! A wiedziałem że kiedyś podobny problem miałem.....
Zazwyczaj piszę proste programiki w konsoli i zawsze co się nauczę to zapomnę.
Pewne rzeczy można sobie przyjąć:
- jeśli dany moduł będzie potrzebny do deklaracji jakichś klas, typów itp. które będą zadeklarowane w sekcji
interface
- moduł dopisz do tej sekcji wuses
; - jeśli taki moduł będzie wykorzystany tylko w sekcji
implementation
- możesz dodać go do nowegouses
w sekcjiimplementation
, ale równie dobrze winterface
; - jeśli dany moduł zawiera deklaracje np. formularzy i klasa tego formularza będzie wykorzystana w sekcji
interface
do deklaracji jakichś klas, typów itp. - musi się znaleźć wuses
sekcjiinterface
; - jeśli taki moduł będzie wykorzystany jedynie w
implementation
np. w zdarzeniach lub lokalnych procedurach/funkcjach - możesz dodać go douses
w sekcjiinterface
, ale pod warunkiem, że ten moduł nie zawiera w sekcjiinterface
wuses
wpisu tego pierwszego modułu, bo będziesz miał podczas kompilacji właśnie ten błąd: "circular unit reference to XXX", czyli zatoczone koło wzajmenych referencji modułów; - jeśli moduł z klasą formularza jest potrzebny tylko np. w zdarzeniach czy lokalnych procedurach/funkcjach (czyli ogólnie w sekcji
implementation
) nie ma sensu pakować go dointerface
;
Aby to zobrazować przykład pierwszy, gdzie wystąpi błąd "circular unit reference":
unit Main;
interface
uses
{...} Welcome;
unit Welcome;
interface
uses
{...} Main;
i przykład drugi, gdzie ten błąd nie wystąpi:
unit Main;
interface
{...}
implementation
uses
Welcome;
unit Welcome;
interface
{...}
implementation
uses
Main;
Pomimo tego, że w uses
sekcji implementation
w obu modułach jest odniesienie wzajemne - błąd ten nie wystąpi (przykład drugi); Jeśli to samo zrobi się w sekcji interface
- błąd kompilacji (przykład pierwszy);
Aby tego błędu uniknąć można także jeden moduł dodać do uses
w interface
, a w drugim module w sekcji implementation
lub odwrotnie i także błędu kompilacji nie będzie.
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.