Pourquoi ca marche pas Show dans OnCreate?

Résolu
smartyan007 Messages postés 21 Date d'inscription vendredi 18 mars 2005 Statut Membre Dernière intervention 24 octobre 2009 - 30 juil. 2009 à 19:55
ni69 Messages postés 1418 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!

20 réponses

ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
30 juil. 2009 à 22:20
@ 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 }
3
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
30 juil. 2009 à 20:44
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 }
0
smartyan007 Messages postés 21 Date d'inscription vendredi 18 mars 2005 Statut Membre Dernière intervention 24 octobre 2009
30 juil. 2009 à 21:05
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
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
30 juil. 2009 à 21:05
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 !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
30 juil. 2009 à 21:07
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 !
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
30 juil. 2009 à 21:10
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 }
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
30 juil. 2009 à 21:12
( Mais pourquoi donc les sauts de ligne sont si larges dans les blocs de code? )

@+
Nico { www.ni69.info }
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
30 juil. 2009 à 21:15
@ 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 }
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
30 juil. 2009 à 21:24
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 !
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
30 juil. 2009 à 21:29
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 }
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
30 juil. 2009 à 21:38
Effectivement.
Registre = Système, laissons à ce dernier le champ libre !
Les fichiers INI ne mourront pas !



Cordialement, Bacterius !
0
smartyan007 Messages postés 21 Date d'inscription vendredi 18 mars 2005 Statut Membre Dernière intervention 24 octobre 2009
30 juil. 2009 à 21:48
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
0
smartyan007 Messages postés 21 Date d'inscription vendredi 18 mars 2005 Statut Membre Dernière intervention 24 octobre 2009
30 juil. 2009 à 21:50
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
0
smartyan007 Messages postés 21 Date d'inscription vendredi 18 mars 2005 Statut Membre Dernière intervention 24 octobre 2009
30 juil. 2009 à 21:55
Petite précision, je voudrais que cette deuxième form soit la première chose que mon programme fasse à sa première utilisation
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
30 juil. 2009 à 21:57
Ah ah ah tu es vaincu Ni69 !!
Utilise le fichier INI.

Cordialement, Bacterius !
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
30 juil. 2009 à 21:58
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 !
0
smartyan007 Messages postés 21 Date d'inscription vendredi 18 mars 2005 Statut Membre Dernière intervention 24 octobre 2009
30 juil. 2009 à 22:03
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!
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
30 juil. 2009 à 22:30
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 !
0
smartyan007 Messages postés 21 Date d'inscription vendredi 18 mars 2005 Statut Membre Dernière intervention 24 octobre 2009
30 juil. 2009 à 23:12
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.
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
31 juil. 2009 à 00:22
@ 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 }
0
Rejoignez-nous