IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

[TForm] Ne pas autoriser l'ouverture d'un form


Sujet :

Composants VCL Delphi

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 147
    Points : 144
    Points
    144
    Par défaut [TForm] Ne pas autoriser l'ouverture d'un form
    Salut.
    J'ai une application qui a plein de Forms.
    Dans une bdd, j'ai une table d'autorisation où ,pour chacune d'entre elles, on sait si l'utilisateur courant est autorisé à ouvrir cette form.
    Pour résumer, j'ai un menu, accessible à tout le monde. Je souhaite que lorsqu'un utilisateur clique sur un élément du menu, le prog aille voir dans la base si l'utilisateur a le droit d'ouvrir la form correspondante (form1.Showmodal)
    Comment faire pour que, aprés le showmodal, la form APPELéE fasse la vérification, et le cas échéant n'ouvre pas le formulaire.
    Mon problème vient du fait que le contrôle du droit doit être fait par la fenêtre appelée. Dans une procédure showmodal, quand on met un "ModalResult:=mrOK" ça ne fait rien.
    Que pouisje mettre pour ne pas ouvrir le formulaire? ou plutôt, qu'il se ferme de lui même?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    Une piste...

    - dans l'événement OnCreate de ta fenêtre mets un champ booléen interne à True (ex : PremiereConnexion)
    - dans l'événement OnActivate (apparition de la fenêtre), teste si PremiereConnexion = Tru, auquel cas tu peux appeler ta boîte de dialogue d'autorisation utilisateur. Sinon, cela signifie que cet utilisateur a déjà les droits nécessaires

    Attentsion, si ta TForm est créée dynamiquement (et non pas autocréée par le programme), chaque création va entraîner la saisie des droits...

    A+

    Didier

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    Une autre solution consiste à explorer chaque option du menu et à la mettre Enabled ou non en fonction des droits.
    J'ai fait cela dans l'Activate de ma fenêtre de menu.

    D'une part c'est facile à programmer et d'autre part l'utilisateur sait à quoi s'en tenir.

    (Ce qui ne m'empechera pas de venir râler mais c'est une autre histoire)

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 147
    Points : 144
    Points
    144
    Par défaut oui mais...
    C'est ce que j'ai commencé à faire, Michel, mais le problème est que mes différents formulaires (qui sont crées dynamiquement) peuvent être appelés de nombreux endroits :
    -d'access
    -du menu principal
    -des autres formulaires
    -d'une application MapInfo, qui appelle mes formulaires par le biais d'une dll qui contient mes formulaires

    Voila pourquoi j'ai besoin d'une solution où c'est au niveau des formulaires appelés qu'il faut autoriser ou non l'ouverture

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 34
    Points : 22
    Points
    22
    Par défaut
    Pour rejoindre l'idée de Didier, moi, je ferai ma recherche de droits dans le Create de la Form en mettant à jour une propriété booleenne en fonction du résultat de la recherche (OK à true si l'utilisateur a le droit d'ouvrir cette fenetre, false sinon).
    Puis au moment de faire le ShowModal, faire le test sur OK :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Form.OK then Form.ShowModal

  6. #6
    Membre chevronné
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Points : 1 943
    Points
    1 943
    Par défaut
    J'ai une autre solution que je pense être beaucoup plus simple et plus robuste. Il s'agit tout simplement de ne pas utiliser ShowModal dans le code de la fenêtre appelante. Il suffit de créer une méthode dans les fenêtres filles qui se charge d'afficher ou non cette fenêtre en fonction des tests désirés. Voici le code de 3 fenêtres:
    La premiere est la fenêtre principale utilisant les 2 formes d'appel décrites plus loin.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
    uses
      Unit2, Unit3;
     
    {$R *.DFM}
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      with TForm2.Create(Application) do
      try
        case CheckAndShow of
          mrOk : Application.MessageBox('OK', 'Résultat', MB_OK);
          mrCancel: Application.MessageBox('Annulé', 'Résultat', MB_OK);
          mrNone: Application.MessageBox('Interdit', 'Résultat', MB_OK);
          // etc
        end;
      finally
        Free;
      end;
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      case TForm3.CreateShowAndDestroy of
        mrOk : Application.MessageBox('OK', 'Résultat', MB_OK);
        mrCancel: Application.MessageBox('Annulé', 'Résultat', MB_OK);
        mrNone: Application.MessageBox('Interdit', 'Résultat', MB_OK);
          // etc
      end;
    end;
     
    end.
    La deuxième illustre le procédé dont j'ai parlé au début qui consiste à fournir une nouvelle méthode d'affichage de la fenêtre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    unit Unit2;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
     
    type
      TForm2 = class(TForm)
      private
        { Déclarations privées }
        function IsAllowed: boolean;
      public
        { Déclarations publiques }
        function CheckAndShow: Integer;
      end;
     
    implementation
     
    {$R *.DFM}
     
    { TForm2 }
     
    function TForm2.CheckAndShow: Integer;
    begin
      if IsAllowed then
        result:= ShowModal
      else
        result:= mrNone;
    end;
     
    function TForm2.IsAllowed: boolean;
    begin
      // Ici le code testant si l'utilsateur a le droit de voir cette fenêtre
      result:= true;
    end;
     
    end.
    La troisième illustre une variante de ce type de code consistant à n'utiliser qu'une seule méthode de classe pour la création, l'affichage et la destruction de la fenêtre. Du coup, la fenêtre principale est complètement débarrasée de tout code superflu.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    unit Unit3;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
     
    type
      TForm3 = class(TForm)
      private
        { Déclarations privées }
        function IsAllowed: boolean;
      public
        { Déclarations publiques }
        class function CreateShowAndDestroy: Integer;
      end;
     
    implementation
     
    {$R *.DFM}
     
    { TForm3 }
     
    class function TForm3.CreateShowAndDestroy: Integer;
    begin
      with TForm3.Create(Application) do
      try
        if IsAllowed then
          result:= ShowModal
        else
          result:= mrNone;
      finally
        Free;
      end;
    end;
     
    function TForm3.IsAllowed: boolean;
    begin
      // Ici le code testant si l'utilsateur a le droit de voir cette fenêtre
      result:= true;
    end;
     
    end.

  7. #7
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 147
    Points : 144
    Points
    144
    Par défaut Merci
    Merci Pierre.
    Je n'utiliserai pas la technique que tu m'as fournie, car elle m'obligerait à changer encore trope de choses, notamment sur l'appel des formulaires.
    Mais ça m'a permis de voir un nouveau "truc" :
    class function TForm3.CreateShowAndDestroy ....

    Je ne connaissais pas ce type de déclaration. Connaitrais tu un site qui explique ce type de déclaration? Je n'ai pas trop compris dans ton code "ce que ça fait"

    Ps : Pour mon problème, si ca interresse quelqu'un, j'ai mis un timer dans une form de mon projet., qui s'appelle "Tools".
    Dans chaque fiche "appelée", j'appelle une procédure qui se trouve dans tools et qui déclanche le Timer. L'évennement du timer est la vérif des droits . Ainsi, la form appelée a le temps de s'ouvrir complétement. Quand je vérifie les droits, si on n'a pas le droit, je fais un modalresult sur la form appelée à partir de la procédure qui se trouve dans l'évennement du timer.
    Voilou.
    rePS: Encore merci Pierre et à tous ceux qui font un super boulot sur ce forum.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [TinyMCE] ne pas autoriser l'ajout d'images
    Par Magjjy dans le forum Bibliothèques & Frameworks
    Réponses: 3
    Dernier message: 22/06/2007, 12h19
  2. Réponses: 2
    Dernier message: 05/10/2006, 13h01
  3. ne pas autoriser les liens web ?
    Par isa150183 dans le forum Langage
    Réponses: 5
    Dernier message: 17/09/2006, 13h47
  4. Réponses: 8
    Dernier message: 15/09/2006, 20h37
  5. [W3C] Ne pas autoriser l'écriture dans un champ INPUT
    Par kerlann dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 24/04/2006, 11h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo