Program nie zamyka się wyłączając go na drugiej formie.

0

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

0

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.

0

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

0

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?

0

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

0

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.

0

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

0

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 w uses;
  • jeśli taki moduł będzie wykorzystany tylko w sekcji implementation - możesz dodać go do nowego uses w sekcji implementation, ale równie dobrze w interface;
  • 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źć w uses sekcji interface;
  • jeśli taki moduł będzie wykorzystany jedynie w implementation np. w zdarzeniach lub lokalnych procedurach/funkcjach - możesz dodać go do uses w sekcji interface, ale pod warunkiem, że ten moduł nie zawiera w sekcji interface w uses 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 do interface;
    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.

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