Lancement du Form MDI par Form simple [Résolu]

Cobuce 19 Messages postés mardi 10 mai 2005Date d'inscription 1 août 2006 Dernière intervention - 4 juil. 2006 à 04:32 - Dernière réponse : ThWilliam 424 Messages postés mardi 3 janvier 2006Date d'inscription 26 novembre 2013 Dernière intervention
- 11 juil. 2006 à 19:54
Salut,
J'ai conçu un Form en MDI  pour le menu et autre, mais j'ai aussi conçu un form pour un ecran d'acceuil. quand je clique sur le bouton OK rien ne s'execute. Voici le code utilisé:

   OldHwnd := FindWindow ('TFrmMain', 'One Copy');
   if OldHwnd = 0 then begin
       w_Visto.Release; // On détruit la fenêtre et on libère la mémoire
      Application.Initialize;
      Application.CreateForm(TFrmMain, FrmMain);
      Application.Run;
      end
   else begin
      if not IsWindowVisible (OldHwnd) then
        PostMessage (OldHwnd, wm_User,0,0);
        setForegroundWindow(OldHwnd);
      end;

Le w_visto est l'ecran d'acceuil, FrmMain l'ecran principal en MDI
Y-a t'il une autre façon de le faire ? Aidez-moi SVP.
Merçi.

A+
 
Afficher la suite 
19Messages postés mardi 10 mai 2005Date d'inscription 1 août 2006 Dernière intervention

11 réponses

Répondre au sujet
ThWilliam 424 Messages postés mardi 3 janvier 2006Date d'inscription 26 novembre 2013 Dernière intervention - 7 juil. 2006 à 13:38
+3
Utile
Salut Cobuce.


L'erreur "violation d'accès" ne vient pas du fait que w_visto est détruite avant le test.
Ce qui se passe, c'est que w_visto est appelée dans l'événement OnCreate de FrmMain, et donc avant la création du DataModule DMUser ! Donc w_visto ne peut évidemment pas avoir accès à QUser qui n'est pas encore créé.
Pour remédier à cela, c'est très simple. Tu vas dans Menu Projet Options et dans fiches créées automatiquement, tu déplaces DMUser avant FrmMain. Si tu regardes le code de ton projet .dpr, tu verras alors que DMUser est créé avant FrmMain.


Concernant ton code, je me permets quelques remarques (dans un but constructif) :
- A quoi sert la variable connecter puisque tu la mets à false directement après ?
- Tu fais un Trim sur la récupération des champs de ta base de données, généralement, on fait un Trim de la boite de saisie utilisateur (ex: un edit) avant l'enregistrement dans la base. Par contre, ici, il faudrait faire un Trim du RzEdit1.Text.
- Plus important : tu fais un Locate, mais tu ne testes pas si l'enregistrement est trouvé !





procedure TW_Visto.RzBitBtn1Click(Sender: TObject);
var
   OkUser: boolean;
begin
    OkUser:= false;
    with DMUser.QUser do
    begin
        Open;
        First;
        if Locate('LoginID', TrimRight(RzEdit1.Text), []) then  // login trouvé
        begin
            if RzEdit2.Text = FieldByName('Motpass').AsString then
                 OkUser:= true  // password ok
            else
                 ShowMessage('Le Mot de passe est invalide..!');
        end
        else  // login non trouvé
              ShowMessage('Votre nom et mot de passe n''ont pas été définis.'+
                    sLineBreak+'Contactez votre Administrateur pour obtenir le droit'+
                    sLineBreak+'d''accès à ce logiciel.');
        if OkUser then
        begin
              wAcces:= FieldByName('LoginID').AsString;
              wwNom:= FieldByName('Nom').AsString + '  '  +
                                (FieldByName('Prenom').AsString;
              wwNomUtil:= FieldByName('Nom').AsString;
              wwGroupe:= FieldByName('Groupe').AsString:
        end;
        Close;   // fermeture de la base
    end;
    if OkUser then ModalResult:= mrOk;  // fermeture de w_visto si ok
end;

J'espère ne pas avoir fait d'erreurs...
J'ai enlevé les TrimRight pour plus de clarté. A toi de voir si il faut les remettre.
A +
Thierry
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de ThWilliam
ThWilliam 424 Messages postés mardi 3 janvier 2006Date d'inscription 26 novembre 2013 Dernière intervention - 4 juil. 2006 à 18:19
0
Utile
Salut Cobuce,

En fait, tu inverses les choses. Si je comprends bien, c'est ta FrmMain qui est la fiche principale (voir Projet Options) donc, c'est à elle à lancer la form w_visto.
C'est très simple, si tu n'as rien modifié dans le source du fichier .dpr :
- assure-toi que FrmMain soit la fiche principale.
- assure-toi dans l'inspecteur d'objets que la propriété Visible de FrmMain soit = false.

procedure TFrmMain.FormShow(Sender: TObject);
begin
   w_visto.ShowModal;  // appel de l'écran d'accueil
end;

procedure Tw_visto.Button1Click(Sender: TObject);
begin
    // ... code éventuel 
    Close;  // fermeture de w_visto
end;

Si tu veux une création dynamique de w_visto pour pouvoir détruire la fenêtre et libérer la mémoire, vois ceci: 

http://www.delphifr.com/infomsg_DELPHI-RESTE-EXECUTION-LORSQUE-JE-QUITTE-APPLI_772934.aspx#1

A +
Thierry
Commenter la réponse de ThWilliam
Cobuce 19 Messages postés mardi 10 mai 2005Date d'inscription 1 août 2006 Dernière intervention - 5 juil. 2006 à 01:34
0
Utile
Salut ThWilliam,

Merci pour votre intervention. Je viens de corriger, mais je me retrouve avec les deux ecrans affichés au même moment alors que la propriété Visible de FrmMain est à False;
Ma préocupation consiste à afficher d'abord l'ecran d'acceuil w_Visto qui a le Login et Password pour contrôle l'affichage de l'ecran princpal le FrmMain.

A+
Cobuce
 
Commenter la réponse de Cobuce
ThWilliam 424 Messages postés mardi 3 janvier 2006Date d'inscription 26 novembre 2013 Dernière intervention - 5 juil. 2006 à 09:32
0
Utile
Salut Cobuce,

si la propriété Visible de w_visto = false (j'avais oublié de le préciser) et que tu fais un appel w_visto. ShowModal , tu ne devrais voir au démarrage que la fenêtre w_visto. Testé sous Delphi 7.

Ou alors emploie plutôt l'événement OnCreate : mais cela nécessite que w_visto soit, dans Projet Options, en fiche disponible :

procedure TFrmMain.FormCreate(Sender: TObject);
begin
  w_visto: = Tw_visto.Create(self);  // création dynamique de w_visto
  w_visto.ShowModal;   // on montre l'écran d'accueil
  w_visto.Free;    // libération mémoire de w_visto
end;

A +
Thierry
Commenter la réponse de ThWilliam
ThWilliam 424 Messages postés mardi 3 janvier 2006Date d'inscription 26 novembre 2013 Dernière intervention - 5 juil. 2006 à 18:56
0
Utile
Re-Cobuce,

J'avais un peu de temps, alors voilà un exemple de code qui pourrait te convenir.

Préalables :
- FrmMain : doit être la fiche principale du projet. Visible = false.- w_visto : fiche non créée automatiquement. FormStyle fsNormal. Visible false.- sur w_visto : en plus des 2 Edit (login, password) : un bouton Ok (propriété ModalResult mrNone) et un bouton Annuler (propriété ModalResult mrCancel).

Dans l'unité de FrmMain :

procedure TFrmMain.FormCreate(Sender: TObject);
begin
  w_visto:= Tw_visto.Create(self);
  w_visto.ShowModal;
  if not(w_visto.ModalResult = mrOk) then 
  begin
    w_visto.Free;  // on détruit la fiche
    Application.Terminate;  // et on ferme l'application
  end
  else w_visto.Free;  // on détruit la fiche et on continue
end;

Dans l'unité de w_visto :

procedure Tw_visto.OkButtonClick(Sender: TObject);
begin
    if MaFonctionTest then 
       ModalResult:= mrOk;  // fermeture de la fiche si password ok
end;

A +
Thierry
Commenter la réponse de ThWilliam
Cobuce 19 Messages postés mardi 10 mai 2005Date d'inscription 1 août 2006 Dernière intervention - 6 juil. 2006 à 02:11
0
Utile
Salut ThWilliam,
Après modifications, tout marche normalement, mais  un autre problème vient de se poser lorsque je cherche à lire le fichier qui contient l'identité de l'utilisateur un message d'erreur "Accès violation" s'affiche. Donc je n'arrive plus à acceder au fichier Utilisateurs dans le Forme w_Visto. Qu'est ce que je peux faire ?
Sinon Merci pour l'étape franchie.

A+
Cobuce
Commenter la réponse de Cobuce
ThWilliam 424 Messages postés mardi 3 janvier 2006Date d'inscription 26 novembre 2013 Dernière intervention - 6 juil. 2006 à 23:20
0
Utile
Salut Cobuce.

Si tu as utilisé le code ci-dessus, n'oublie pas que la fiche w_Visto est détruite lors de sa fermeture. Donc,  si tu as besoin de garder des infos utilisateurs, il faut les sauvegarder dans des variables globales (déclarées dans FrmMain, p.ex) avant de fermer w_Visto.
Quant-au fichier utilisateurs, si tu en as besoin après la fenêtre d'accueil, ce n'est pas dans cette fenêtre qu'il faut l'ouvrir. Mais ici, tu me donnes trop peu de détails pour pouvoir te répondre efficacement. Il faudrait un bout de code.

A +
Thierry 
Commenter la réponse de ThWilliam
Cobuce 19 Messages postés mardi 10 mai 2005Date d'inscription 1 août 2006 Dernière intervention - 7 juil. 2006 à 10:07
0
Utile
Salut Thwilliam,

Après la saisie des infos des 2 Edits(login et password) je clique sur le Btn Ok dont la procedure ci-dessous. le programme s'arrête au niveau de 'With DMUser.QUser' avec comme message 'Violation d'accès'. Je cherche à identifier l'utilisateur avant l'ouverture de FrmMain.  Si je comprends bien la fiche w_Visto est detruite avant le test et l'accès au fichier utilisateur pour tester les infos entrées dans 2 Edits.
Que dois-je faire ?
procedure TW_Visto.RzBitBtn1Click(Sender: TObject);
var pass,wpass,wNom,wNomp,wNomUtil,wGroupe: String;
begin
  with DMUser.QUser do begin
    Open;
    First;
    Locate('LoginID',RzEdit1.Text,[]);
    wNom := TrimRight(FieldByName('LoginID').AsString);
    wNomp := TrimRight(FieldByName('Nom').AsString)+' '+TrimRight(FieldByName('Prenom').AsString);
    wNomUtil := TrimRight(FieldByName('Nom').AsString);
    wPass := FieldByName('Motpass').AsString;
    wGroupe := RightStr(TrimRight(FieldByName('Groupe').AsString),4);
    close;
  end ;
 wnom : = 'xavier';
 wpass := 'cxavier';
 if RzEdit1.Text = wnom then
    begin
    if RzEdit2.Text = wpass then
     begin
     wwNom := wnomp;
     wAcces:= wNom;
     wwNomUtil:=wNomUtil;
     wwGroupe:= wGroupe;
//**     FinUtilis; // procedure fin utilisation
     connecter := true;
     if connecter then begin
        connecter := False;
        ModalResult:= mrOk;  // fermeture de la fiche si password ok
     end;
     end
   else
    ShowMessage('Le Mot de passe est invalide..!');
   end
 else
   ShowMessage('Votre nom et mot de passe n''ont pas été définis.'+
   sLineBreak+'Contactez votre Administrateur pour obtenir le droit'+
   sLineBreak+'d''accès à ce logiciel.');
end;

A+

Cobuce
Commenter la réponse de Cobuce
Cobuce 19 Messages postés mardi 10 mai 2005Date d'inscription 1 août 2006 Dernière intervention - 8 juil. 2006 à 00:58
0
Utile
Salut Thwilliam,
OK, tout est bon, merci pour votre intervention. Je vous souhaite bonne continuation sur delphifr.

A+
Cobuce

 
Commenter la réponse de Cobuce
Cobuce 19 Messages postés mardi 10 mai 2005Date d'inscription 1 août 2006 Dernière intervention - 11 juil. 2006 à 19:38
0
Utile
 Salut Thwilliam,Excusez-moi, juste un petit problème, je n'arrive pas à recuper les données qui sont dans les variables wwnom, wwNomUtil, etc.. lorsque FrmMain est affiché. Que dois-je faire ? SVP aidez-moi.

A+

Cobuce
Commenter la réponse de Cobuce
ThWilliam 424 Messages postés mardi 3 janvier 2006Date d'inscription 26 novembre 2013 Dernière intervention - 11 juil. 2006 à 19:54
0
Utile
Salut Cobuce,

Dans quelle unité as-tu déclaré ces variables ?
Et à quel endroit dans l'unité ?
Ne les déclare surtout pas dans w_visto.
Tu peux les déclarer dans l'unité FrmMain ou dans ton DataModule et de préférence dans la section var de l'interface de l'unité, pas dans la section publique de FrmMain.
Bien sûr, dans ce cas, vérifie la clause uses de w_visto pour que celle-ci ait accès aux variables.
N'hésite pas si problèmes...

A +
Thierry
Commenter la réponse de ThWilliam

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.