Comment je peux Détruire (gratuit) un Formulaire à partir de la mémoire?
j'ai 2 Formulaire (Form1 et Form2) dans mon projet, Form1 est Auto-créer des formulaires, mais Form2 est Disponible formes.
comment je peux créer Form2 et décharger Form1?
J'ai reçu un "Accès de validation" Erreur dans ce code.
Ici est de code de Form1:
1. uses Unit2;
//*********
2. procedure TForm1.FormCreate(Sender: TObject);
3. var a:TForm2;
4. begin
5. a := TForm2.Create(self);
6. a.Show;
7. self.free; // Or self.destory;
8. end;
Grâce.
J'ai modifié que "Serg" code à ceci :
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Application.CreateForm(TForm2, Form2);
Release;
end;
end.
///
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Form1:= TForm1.Create(Application);
Application.Run;
end.
mais ce début du projet, puis quittez automatiquement, Pourquoi?
je veux montrer à Form1 et quand nous cliquez sur Button1 de montrer ensuite Form2 et gratuit(la presse) à Form1. comment je peux à présent?
- Vous appelez un destructeur à partir d'un constructeur.
- jetez un oeil à ce post au sujet de l'application.mainform : <stackoverflow.com/questions/25666626/...>
Vous devez vous connecter pour publier un commentaire.
Lorsque vous détruisez un formulaire, il est préférable d'utiliser de la Libération.
Version est presque la même que libre, mais il attend pour les messages en attente pour éviter les plantages.
Vous ne devriez jamais utiliser le Détruire. Gratuit/Release appelle le destructeur.
De soi est l'objet courant (dans votre code de Form1, donc de soi.Gratuit tue la forme actuelle. Ce qui provoque la violation d'accès. Form1 est automatiquement créé, il est également l'auto détruit, vous ne pouvez pas détruire vous-même. Si vous ne voulez pas, les cacher.
Et vous devez conserver une référence à la nouvelle forme, si vous souhaitez traiter plus tard.
Modifié votre code devrait ressembler à:
Mais Pourquoi voulez-vous créer un autre formulaire dans le formulaire de créer de la première forme. Pourquoi ne pas supprimer la première forme entièrement et uniquement utiliser la seconde (auto créé)?
Form1 := TForm1.Create(nil); Form1.ShowModal; Form1.Free;
Après cela, laissez Form2 être auto-créé avec l'habitudeApplication.CreateForm(Form2, TForm2)
. Pour une réponse plus détaillée, poser une nouvelle question, telles que "Comment puis-je afficher un formulaire de configuration avant de la principale forme?"Que vous essayez de faire quelque chose d'étrange.
Vous ne pouvez pas libre formulaire principal, sans fermer l'application, de sorte que votre Form1 ne doit pas être autocreated formulaire Form1 et Form2 doit être créé manuellement.
D'abord, vous devez éditer le source de votre projet de ce genre pour créer Form1 manuellement:
Form1.OnCreate devrait être écrit comme
qui fera Form2 la forme principale de votre application. Comme déjà répondu, vous devriez utiliser la méthode de Version gratuit le formulaire.
Si Form1 est "autocreate", il en est le propriétaire de l'objet application - vous ne devriez pas gratuit, il est dans votre code. Si Form1 possède Form2, l'application nettoie à la fois.
Je le ferais comme ça, mais pas sûr qu'il réponde à vos exigences:
...
Donc, c'est tout...
Si tous les Form1 devez faire est d'initialiser quelque chose, mais ne s'affichent pas, envisagez d'utiliser un datamodule à la place. On ne peut pas être indiqué, mais peut encore être autocreated.