Pourquoi ca marche pas Show dans OnCreate? [Résolu]

Messages postés
21
Date d'inscription
vendredi 18 mars 2005
Statut
Membre
Dernière intervention
24 octobre 2009
- - Dernière réponse : ni69
Messages postés
1529
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
- 31 juil. 2009 à 00:22
Bonjour,

Pourquoi le code suivant ne marche-t-il pas?

procedure TMainForm.FormCreate(Sender: TObject);
begin
//Autre instruction
Form2.show;
end;

J'ai déclaré Unit2 dans la clause Use;

J'ai une erreur à l'éxecution...

Peut-on m'aider? Merci d'avance!
Afficher la suite 

20 réponses

Meilleure réponse
Messages postés
1529
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
6
3
Merci
@ Bacterius : Je fais avec ce que l'on me donne !

@ smartyan007 : y'a peut-être quelque-chose que tu peux faire pour rendre le code encore plus joli : traiter le cas de la première exécution avant même la création d'une quelconque Form, comme ça, si c'est la première fois que l'appli se lance (détection par le fichier INI comme préconisé), tu crées la Form2 et elle uniquement (elle devient ainsi la Form principale), et une fois les données utilisateur entrées, tu ferme l'instance de l'application et tu la redémarres. Et en cas de NON première exécution, tu crées simplement les forms dont tu as besoin (MainForm,...) en omettant Form2.

Ca donne quelque-chose de ce genre là, directement dans le DPR :

program Project1;

uses
  Forms, Windows, Sysutils, Messages, IniFiles,
  unit1 in 'unit1.pas' {MainForm},
  unit2 in 'unit2.pas' {Form2};

var
  ConfigFile : TIniFile;
{$R *.RES}

begin
  Application.Initialize;
  Application.Title := 'Starting...';
  
  [Création de l'objet et accès au fichier INI]


  if [First_exec] then // Première exécution
    begin
      Application.Title := 'Première exécution';
      Application.CreateForm(TForm2, Form2);
      Application.Run;
    end
  else
    begin
      Application.Title := 'Exécution Normale';
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end;
end.


@+
Nico { www.ni69.info }

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 138 internautes nous ont dit merci ce mois-ci

Commenter la réponse de ni69
Messages postés
1529
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
6
0
Merci
Simplement parce-que ta Form2 n'est sans doute pas encore créée lors de la création de la Form Principale (MainForm).

Place l'instruction
Form2.show

dans l'événement OnShow de ta MainForm, et pas dans le OnCreate.

Tu peux voir dans quel ordre tes forms sont créées dans la source du programme (DPR). Delphi crée les forms au fur et à mesure selon l'ordre qui lui est dicté dans le DPR. La première form créée est ainsi considérée par comme étant la form principale de l'application.

@+
Nico { www.ni69.info }
Commenter la réponse de ni69
Messages postés
21
Date d'inscription
vendredi 18 mars 2005
Statut
Membre
Dernière intervention
24 octobre 2009
0
Merci
OK j'ai compris!

Merci beaucoup!

Et si je voulais ouvrir une deuxième form seulement à la premiere utilisation?
Tu ferais comment?
P.S: je peux vérifier si c'est la première utilisation en vérifiant la présence d'une clé de registre

Bien à toi, merci
Commenter la réponse de smartyan007
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
5
0
Merci
Voici un petit exemple qui indique le déroulement des opérations.
-- Création des fenêtres --
Création de Form1
Form1.OnCreate déclenché
Création de Form2
Form2.OnCreate déclenché
...

-- Affichage des fenêtres --
Affichage de Form1
Form1.OnShow (si fenêtre visible)
Affichage de Form2
Form2.OnShow (si fenêtre visible)
...



Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
5
0
Merci
Ah pas vu le 2eme message de l'auteur.
Le mieux, c'est d'utiliser un fichier INI à côté de l'exécutable afin de ne pas polluer le registre. Plus pratique si on veut se débarrasser de ton programme, par exemple. Dans le fichier INI, tu mets une clé "FirstTime" booléenne, puis à chaque exécution du programme :

Teste si clef a la valeur FALSE
Si valeur FALSE => Première exécution
Sinon => Pas première exécution
Définir la clef à la valeur TRUE

Evidemment, si l'on supprime le fichier ini, il faudra prévoir un système de récupération (idem avec le registre).

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
1529
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
6
0
Merci
Inutile d'encombrer le registre avec des données comme celles-là !
Tu as juste à déclarer une variable globale booléenne (flag) dans ton unité principale. Lors du OnCreate de MainForm, tu la mets à true, et dans le OnShow de Mainform, tu traites sa valeur :

var FIRST_EXEC_FLAG: boolean;

procedure TMainForm.FormCreate(Sender: TObject); 
begin 
  FIRST_EXEC_FLAG := true;
end;

procedure TMainForm.FormShow(Sender: TObject); 
begin 
  if FIRST_EXEC_FLAG then begin
    Form2.Show;
    FIRST_EXEC_FLAG := false;
  end;
end;



@+
Nico { www.ni69.info }
Commenter la réponse de ni69
Messages postés
1529
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
6
0
Merci
( Mais pourquoi donc les sauts de ligne sont si larges dans les blocs de code? )

@+
Nico { www.ni69.info }
Commenter la réponse de ni69
Messages postés
1529
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
6
0
Merci
@ Bacterius : Euh, je crois qu'on a des visions différentes de "Première" exécution. D'après son exemple initial, smartyan007 semble vouloir afficher sa Form2 à chaque démarrage de l'application...

@+
Nico { www.ni69.info }
Commenter la réponse de ni69
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
5
0
Merci
Ah lol, moi je pensais genre comme des logiciels "Vous avez lancé le logiciel pour la première fois.". La suggestion du registre me semblait aller dans ce sens ??

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
1529
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
6
0
Merci
Effectivement !
Mais finalement nous nous accordons tous deux à penser que le registre n'est pas une bonne solution que ce soit pour l'atteinte d'un objectif ou de l'autre, et je pense que c'est le principal !

@+
Nico { www.ni69.info }
Commenter la réponse de ni69
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
5
0
Merci
Effectivement.
Registre = Système, laissons à ce dernier le champ libre !
Les fichiers INI ne mourront pas !



Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
21
Date d'inscription
vendredi 18 mars 2005
Statut
Membre
Dernière intervention
24 octobre 2009
0
Merci
Merci pour vos réponse

Je parlais de toute premiere utilisation du logiciel qui cree une clé nom d'utilisateur dans le registre.
Ce nom est demandé sur un formulaire dans la deuxième Form.

C'est pour cela que je voudrais afficher la deuxième Form uniquement à la première utilsation du logiciel
Commenter la réponse de smartyan007
Messages postés
21
Date d'inscription
vendredi 18 mars 2005
Statut
Membre
Dernière intervention
24 octobre 2009
0
Merci
Le fait que ce soit par INI ou par Registre m'est égal, c'est le fait d'afficher la deuxième form à la seule première utilisation du programme.

Meric d'avance
Commenter la réponse de smartyan007
Messages postés
21
Date d'inscription
vendredi 18 mars 2005
Statut
Membre
Dernière intervention
24 octobre 2009
0
Merci
Petite précision, je voudrais que cette deuxième form soit la première chose que mon programme fasse à sa première utilisation
Commenter la réponse de smartyan007
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
5
0
Merci
Ah ah ah tu es vaincu Ni69 !!
Utilise le fichier INI.

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
5
0
Merci
Pour que ça soit la première chose que ton application fasse, je t'engage tout simplement à reporter tout le code de l'OnCreate/OnShow de la Form1 dans la Form2.

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
21
Date d'inscription
vendredi 18 mars 2005
Statut
Membre
Dernière intervention
24 octobre 2009
0
Merci
Moui, c'est ce que je pensais faire mais ca me dérange un peu pour le passage des infos mais si y a pas moyen autrement tanpis!

Merci pour ton aide!


Ok je vois comment je vais faire, merci beaucoup!
Commenter la réponse de smartyan007
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
5
0
Merci
Mais en fait il y a encore plus simple. On s'embête à créer une clef dans le fichier ini ... pourquoi ne pas tout simplement tester l'existence de ce fichier ?

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
21
Date d'inscription
vendredi 18 mars 2005
Statut
Membre
Dernière intervention
24 octobre 2009
0
Merci
merci pour ta solution avec le DPR elle me plait beaucoup et me simplifie pas mal les choses...

Je savais pas que je pouvais traité un INI a partir du DPR... et je vois pas encore comment mais je vais me renseigner pour aller dans cette direction!

Ce sera plus propre et je limite mes variables et procédures dans mon MAIN Form!

Bonne nuit et encore merci.
Commenter la réponse de smartyan007
Messages postés
1529
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
6
0
Merci
@ Bactérius : C'est parfaitement possible dans l'idée. Mais après, il ne faudrait surtout pas oublier d'implémenter des procédures de validation du fichier INI concerné, dans MainForm, pour vérifier s'il y a réellement un utilisateur d'enregistré, car si ce n'est pas le cas (ex: fichier vide), il faudrait de toute manière afficher la Form2 d'identification ce qui entraînerait immanquablement des complications
Donc à la limite, autant regrouper dès le départ tous les contrôles dans un seul et même endroit (fusse-t-il le DPR), puis tout stocker dans des variables internes globales pour ne pas être tributaire d'éventuels changements manuels effectués par l'utilisateur dans le fichier INI lors de l'exécution de l'application... (quel vilain utilisateur ce serait ! )

@ smartyan007 : Il y a de nombreux exemples de gestion de fichiers INI sur ce site, tu ne devrais pas avoir de difficulté à en trouver

@+
Nico { www.ni69.info }
Commenter la réponse de ni69