Cobuce
Messages postés19Date d'inscriptionmardi 10 mai 2005StatutMembreDernière intervention 1 août 2006
-
4 juil. 2006 à 04:32
ThWilliam
Messages postés418Date d'inscriptionmardi 3 janvier 2006StatutMembreDernière intervention26 novembre 2013
-
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.
ThWilliam
Messages postés418Date d'inscriptionmardi 3 janvier 2006StatutMembreDernière intervention26 novembre 20134 7 juil. 2006 à 13:38
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
Cobuce
Messages postés19Date d'inscriptionmardi 10 mai 2005StatutMembreDernière intervention 1 août 2006 5 juil. 2006 à 01:34
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.
ThWilliam
Messages postés418Date d'inscriptionmardi 3 janvier 2006StatutMembreDernière intervention26 novembre 20134 5 juil. 2006 à 09:32
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;
ThWilliam
Messages postés418Date d'inscriptionmardi 3 janvier 2006StatutMembreDernière intervention26 novembre 20134 5 juil. 2006 à 18:56
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Cobuce
Messages postés19Date d'inscriptionmardi 10 mai 2005StatutMembreDernière intervention 1 août 2006 6 juil. 2006 à 02:11
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.
ThWilliam
Messages postés418Date d'inscriptionmardi 3 janvier 2006StatutMembreDernière intervention26 novembre 20134 6 juil. 2006 à 23:20
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.
Cobuce
Messages postés19Date d'inscriptionmardi 10 mai 2005StatutMembreDernière intervention 1 août 2006 7 juil. 2006 à 10:07
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;
Cobuce
Messages postés19Date d'inscriptionmardi 10 mai 2005StatutMembreDernière intervention 1 août 2006 11 juil. 2006 à 19:38
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.
ThWilliam
Messages postés418Date d'inscriptionmardi 3 janvier 2006StatutMembreDernière intervention26 novembre 20134 11 juil. 2006 à 19:54
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...