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

 Delphi Discussion :

Réutiliser une procédure


Sujet :

Delphi

  1. #1
    Membre habitué Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut Réutiliser une procédure
    Bonsoir tous le monde,

    J'ai une procédure qui est utilisé sur 3 feuilles différentes. C'est exactement la même donc je voudrais l'avoir une seule fois et ensuite juste l'appeler.

    Dans cette procédure, il y a des .text et des .visible ... et je ne sais pas comment faire la procédure :s

    Voilà un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    If trouve then
     Begin
      gb_coord.Visible:=true;
      gb_gene.Visible:=true;
      za_nom.Visible:=true;
      zs_nom.Visible:=true;
      ...
    je ne sais pas comment gérer cela.
    "J'glande pas ! Ça compile ..."

    4rocky4
    - Un con qui marche ira plus loin q'un intellectuel assis -

  2. #2
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut
    Bonjour.

    Facile ......... quand on sait !

    C'est néamoin simple. Commence par créer une Unité. Voici ce qui apparaît

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    unit Unit1;
     
    interface
     
    implementation
     
    end.
    Ajoute du code pour arriver à ceci

    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
    unit Unit1;
     
    uses
      SysUtils, Variants, Classes;   // j'ai mis au hasard
     
    Type
        TFonction = class(TApplication)
     Private
     
     Public
     
    end;
     
    Var
       Fonction : TFonction;     // le nom est au choix
     
    implementation
     
    uses    // si tu en as besoin
     
    end.
    Enregistre, par exemple sous le nom de MesFontions.

    Ensuite tu peux créer ce que tu veux. Voici un exemple

    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
    unit MesFonctions;
     
    uses
      SysUtils, Variants, Classes;
     
    Type
        TFonction = class(TApplication)
     Private
     
     Public
          function Calcul(var Montant : real; Origine : integer) : boolean;
    end;
     
    Var
       Fonction : TFonction;
     
    implementation
     
    uses  //  ce dont tu as besoin
     
    function TFonction.Calcul(var Montant : real; Origine : integer) : booelan
    begin
        if Origine = 0 then
           Result := false
        else  begin
     
            Montant := 1485/Origine;
            Result := true;
       end;
    end;
    end.
    Et dans tes fenêtres tu ajoutes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    .
    ..
    uses MesFonctions,......;
    .
    .
    .
       Test := Fonction.Calcul(Montant,Diviseur);
    .
    .
    .
    Tu peux alors ajouter autant de sous-fonctions que tu veux dans MesFonctions. En revanche pour voir ton code de MesFonctions, passe par Fichier/Ouvrir.

    Bon code et Bon weekEnd
    Ce qui se conçoit bien s'énonce clairement
    Et les mots pour le dire viennent aisément (Boileau)

  3. #3
    Membre habitué Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    Mon problème est toujours le même ...

    Dans ma procédure, j'utilise des xxxx.text et des xxxx.visible

    xxxx ici est un Tedit qui est le même sur chaque formulaire.

    Donc il y a une erreur sur tous les text et visible. Faut il les déclarer ?
    "J'glande pas ! Ça compile ..."

    4rocky4
    - Un con qui marche ira plus loin q'un intellectuel assis -

  4. #4
    Membre habitué Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    Ah c'est bon, j'ai trouvé où il fallait les mettre, en dessous de type lol
    "J'glande pas ! Ça compile ..."

    4rocky4
    - Un con qui marche ira plus loin q'un intellectuel assis -

  5. #5
    Membre habitué Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    j'obtiens une erreur par contre quand je clic sur le bouton appelant la procédure et quand je mets arrêter, j'arrive a cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If intermed.NOPERSO=strtoint(zs_numero.text) then
    Classe d'exception EAccessViolation avec message 'Access violation at adress ... in module 'pj_rocky

    Pourtant cette procédure marche très bien normalement.
    Intermed et NOPERSO sont déclarés dans unit_principale.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Type
    Personnestandard = record
                               NOPERSO : integer;
                               ...
     
    var 
     
    intermed : personnestandard
    Dans unit_procedure, j'ai mis un uses unit_principale.
    "J'glande pas ! Ça compile ..."

    4rocky4
    - Un con qui marche ira plus loin q'un intellectuel assis -

  6. #6
    Membre habitué Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    Je sais pas si je me suis bien expliqué lol
    J'vais rééssayer

    J'ai un quatre formulaires : modifier, ajouter, supprimer, consulter.
    Sur chaque formulaire, j'ai un bouton rechercher qui appel exactement la même procédure.
    Dans cette procédure, des Tedits sont utilisés. Par exemple, la recherche se fait par le numéro saisie dans zs_numero. Ces champs là sont les même sur tout les forumulaires.

    Donc ce que je veux faire, c'est une seule procédure puis l'appeler sur chaque bouton rechercher (formulaire : modifier, ajouter, supprimer, consulter)
    "J'glande pas ! Ça compile ..."

    4rocky4
    - Un con qui marche ira plus loin q'un intellectuel assis -

  7. #7
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Euh On va reprendre depuis le début parce que presque tout ce qui a été dit est faux/inadapté. Désolé.

    Le problème initial et profond est que, le gb_coord d'une form n'est pas le gb_coord d'une autre. Ce n'est pas parce que leur nom est le même que l'entité est la même.

    Autrement dit, des deux procédures ne sont pas les mêmes. Elles prennent la même forme textuelle, mais pas la même forme compilée.

    Il y a deux moyens de résoudre ce problème. Un propre et délicat à mettre en place si ton appli est fort avancée. Un pas propre mais faisable en 3 minutes.

    La solution pas propre est de récupérer tes composants à partir de leur nom vraiment (propriété Name), et donc utiliser FindComponent.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure DoSomething(Form: TForm; Trouve: Boolean);
    begin
      if Trouve then
      begin
        (Form.FindComponent('gb_coord') as TControl).Visible := True;
        (Form.FindComponent('gb_gene') as TControl).Visible := True;
        (Form.FindComponent('za_nom') as TControl).Visible := True;
        (Form.FindComponent('zs_nom') as TControl).Visible := True;
      end;
    end;
    La solution nettement plus propre est de construire ta fiche par héritage (les 4 composants concernés seront dans la fiche parente) ou avec une frame (cadre).
    Si tes 4 composants forment un groupe sémantique logique, tu peux créer un cadre les contenant, et ce cadre possèdera la méthode DoSomething. Ensuite, il suffira de placer ce cadre sur tes deux fiches.

    Par héritage, euh... Ce sera casse-gueule si tu ne maîtrise pas encore le reste. Perso, je n'ai jamais utilisé l'héritage de fiches, parce que c'est tellement plus difficile à gérer, et que les cadres peuvent souvent proposer une solution plus simple.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  8. #8
    Membre habitué Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    Je te remercie pour ta réponse, l'héritage, je connais mais avec l'objet.

    Je vais prendre la "pas propre" comme solution.

    Tu dit qu'il faut reprendre dès le début ... mais jusqu'où lol, dans la nouvelle unité créée, je ne déclare pas comme ci dessus, je passe directement à la procédure c'est cela ?
    "J'glande pas ! Ça compile ..."

    4rocky4
    - Un con qui marche ira plus loin q'un intellectuel assis -

  9. #9
    Membre habitué Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    Je n'y suis toujours pas parvenue
    Peut on mieux m'expliquer la dernière solution car là je tourne en rond
    "J'glande pas ! Ça compile ..."

    4rocky4
    - Un con qui marche ira plus loin q'un intellectuel assis -

  10. #10
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Tu fais une unité Common.pas avec :
    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
    unit Common;
     
    interface
     
    uses
      Classes, Forms;
     
    procedure DoSomething(Form: TForm; Trouve: Boolean);
     
    implementation
     
    procedure DoSomething(Form: TForm; Trouve: Boolean);
    begin
      if Trouve then
      begin
        (Form.FindComponent('gb_coord') as TControl).Visible := True;
        (Form.FindComponent('gb_gene') as TControl).Visible := True;
        (Form.FindComponent('za_nom') as TControl).Visible := True;
        (Form.FindComponent('zs_nom') as TControl).Visible := True;
      end;
    end;
     
    end.
    Et dans tes événements de boutons tu appelles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoSomething(Self, Trouve);
    Tout en ayant bien sûr ajouté Common aux uses des deux unités qui définissent tes forms.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  11. #11
    Membre habitué Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    Excusez moi mais ça ne marche pas ...

    Sur la première ligne comme toutes les autres, il y a un problème ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Form.FindComponent('gb_coord') as TControl).Visible := True;
    Delphi me dit que Tcontrol et visible ne sont pas déclarés.
    "J'glande pas ! Ça compile ..."

    4rocky4
    - Un con qui marche ira plus loin q'un intellectuel assis -

  12. #12
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Eh bien tu fais F1 sur TControl, cela te donnera quelque part le nom de l'unité dans laquelle est déclarée TControl, et tu rajoutes cette unité à la clause uses de Common.pas.

    Je ne le fais pas pour toi parce que c'est un truc que tu dois absolument pouvoir faire toi-même.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  13. #13
    Membre habitué Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    Merci bien c'est très utile oui merci beaucoup !
    Par contre je ne trouve pas .text
    Dois je mettre .caption ? mais je ne trouve pas non plus là


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Form.FindComponent('zs_nom') as tcontrol).Text:=Intermed.NOM;
    "J'glande pas ! Ça compile ..."

    4rocky4
    - Un con qui marche ira plus loin q'un intellectuel assis -

  14. #14
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 859
    Points : 11 307
    Points
    11 307
    Billets dans le blog
    6
    Par défaut
    pê faut-il tenir compte du type de contrôle trouvé, pour transtyper de manière adaptée et avoir accès à ses propriétés ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MyComponent:=Form.FindComponent('zs_nom'); // var MyComponent: TComponent;
    if  MyComponent is TEdit then TEdit(MyComponent).Text:=Intermed.NOM;
    if  MyComponent is TLabel then with MyComponent as TLabel do Caption:= Intermed.NOM;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  15. #15
    Membre habitué Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    zs_nom est toujours un Tedit, je dois quand même faire cela ?

    C'est ma dernière erreur que delphi me trouve pour l'instant, c'est stressant
    "J'glande pas ! Ça compile ..."

    4rocky4
    - Un con qui marche ira plus loin q'un intellectuel assis -

  16. #16
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 859
    Points : 11 307
    Points
    11 307
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Form.FindComponent('zs_nom') as TEdit).Text:=Intermed.NOM;
    suffit si c'est toujours un TEdit : les exemples avant servaient juste à montrer plusieurs syntaxes utilisables.

    NB : si les bugs te stressent autant, remplace la prog par le yoga ;-)
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  17. #17
    Membre habitué Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    La prog et le yoga, ça va ensemble :-)

    Pour une zone d'un TMaskEdit, Tedit ne passe pas. Normal mais si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Form.FindComponent('zs_cp') as TMaskEdit).Text:=Intermed.CP;
    Ca marche pas, c'est pas aussi simple que ça
    "J'glande pas ! Ça compile ..."

    4rocky4
    - Un con qui marche ira plus loin q'un intellectuel assis -

  18. #18
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,
    Citation Envoyé par 4rocky4 Voir le message
    Pour une zone d'un TMaskEdit, Tedit ne passe pas. Normal mais si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Form.FindComponent('zs_cp') as TMaskEdit).Text:=Intermed.CP;
    Ca marche pas, c'est pas aussi simple que ça
    Quelle est l'erreur stp ?
    Chez moi, le code suivant fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Form1.FindComponent('zs_cp') as TMaskEdit).Text:='15';

  19. #19
    Membre habitué Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    Il fallait mettre mask dans le uses.
    C'est tout bon maintenant :-)
    "J'glande pas ! Ça compile ..."

    4rocky4
    - Un con qui marche ira plus loin q'un intellectuel assis -

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/05/2012, 13h45
  2. Réponses: 8
    Dernier message: 31/05/2011, 09h43
  3. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 16h48
  4. Réutiliser une procédure stockée dans une vue
    Par pgagne dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/07/2007, 10h59
  5. Fin de programme dans une procédure
    Par Sinclair dans le forum Langage
    Réponses: 13
    Dernier message: 29/11/2002, 22h30

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