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

Signaler
Messages postés
19
Date d'inscription
mardi 10 mai 2005
Statut
Membre
Dernière intervention
1 août 2006
-
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
-
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+
 

10 réponses

Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
3
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
Messages postés
19
Date d'inscription
mardi 10 mai 2005
Statut
Membre
Dernière intervention
1 août 2006

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
 
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
3
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
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
3
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
Messages postés
19
Date d'inscription
mardi 10 mai 2005
Statut
Membre
Dernière intervention
1 août 2006

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
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
3
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 
Messages postés
19
Date d'inscription
mardi 10 mai 2005
Statut
Membre
Dernière intervention
1 août 2006

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
Messages postés
19
Date d'inscription
mardi 10 mai 2005
Statut
Membre
Dernière intervention
1 août 2006

Salut Thwilliam,
OK, tout est bon, merci pour votre intervention. Je vous souhaite bonne continuation sur delphifr.

A+
Cobuce

 
Messages postés
19
Date d'inscription
mardi 10 mai 2005
Statut
Membre
Dernière intervention
1 août 2006

 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
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
3
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