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

Langage Delphi Discussion :

Appel de procédures entre unités


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 178
    Points : 79
    Points
    79
    Par défaut Appel de procédures entre unités
    Bonjour à tous,
    Voici mon problème, c'est un classique.
    Pour faire simple, je souhaite appeler depuis une unité une procédure située dans une autre unité. Mes unités sont déclarées dans les clause uses, rien n'y fait.
    Quand j'appelle la procédure depuis l'unité où elle se trouve, ça fonctionne. J'ai souvent des soucis avec les déclarations d'unités.
    Merci à tous
    Cordialement

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    B A BA des unités

    1) une unité comprend deux parties, INTERFACE et IMPLEMENTATION, seul ce qui est dans la partie INTERFACE est visible de l'extérieur

    2) pour qu'une unité A utilise un symbole déclaré dans l'unité B il faut ajouter un "uses UnitB" dans la partie interface ou implementation

    donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    unit UnitB;
     
    interface
     
    procedure test(); // dans l'interface, c'est la déclaration
     
    implementation
     
    procedure test(); // dans l'implementation ... on implémente...
    begin
    end;
     
    end,
    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
     
    unit unitA;
     
    interface
     
    uses
      UnitB; // la procédure test est accessible
     
    implementation
     
    procedure demo;
    begin
      test(); // ou UnitB.test()
    end;
     
    end.
    cf les références circulaires pour la différence entre un uses dans la partie interface et la partie implementation

  3. #3
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 178
    Points : 79
    Points
    79
    Par défaut
    Merci Paul Toth pour la proposition mais ça ne fonctionne toujours pas.
    J'ai bien déclaré l'unité secondaire dans le uses d'INTERFACE de l'unité A, le WVBrowser1 de l'unité B n'est toujours pas reconnu par l'unité A.
    L'instruction WVBrowser1.Navigate est soulignée en rouge.
    Même en ajoutant le non le l'unité B devant l'instruction, rien n'y fait.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TMainForm.Button1Click(Sender: TObject);
    begin
      BrowserFrame.WVBrowser1.Navigate('https://www.eqsl.cc/qslcard/Index.cfm');
    end;
    J'ai le cas avec d'autres unités. Par exemple je dois ajouter Datas devant QContact pour que ça fonctionne bien que uDatas soit déclaré dans l'unité A.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TMainForm.cbContinent1Change(Sender: TObject);
    begin
    With Datas.QContacts do
      begin
        SQL.Clear;
       .............
    C'est un vieux problème récurrent que je ne suis jamais parvenu à résoudre.
    Merci d'essayer de trancher ce nœud gordien.
    Cordialement

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 710
    Points : 25 593
    Points
    25 593
    Par défaut
    Est-ce un problème de nom d'unité ou plutôt de la gestion des instances de TForm et TDataModule ?
    BrowserFrame est le nom de l'unité comme l'est uDatas ?
    ou plutôt l'instance de TForm à l'instar de Datas qui est une instance de TDataModule ?

    Avez-vous instancier la TForm contenant dans BrowserFrame ?
    Peut-être sans le savoir dans le DPR via Application.CreateForm.
    Attention, le navigateur TWebBrowser requiert un affichage pour que le Handle soit disponible pour gérer les Events du DOM, si c'est un composant tiers, il faut vous renseigner à son sujet.

    Vous devriez rendre votre code le moins dépendant que possible
    Par exemple en faisant une procédure (pas une méthode) pour invoquer votre Navigate comme si c'était un Prompt.
    On pourrait envisager des méthodes de classes mais ça serait prématuré vu votre connaissance du langage, cela serait cependant plus pratique pour vous, tout en évitant des variables globales au cycle de vie mal maitrisée.

  5. #5
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 178
    Points : 79
    Points
    79
    Par défaut
    Merci ShaiLeTroll. Je vais voir tout ça en fonction de votre réponse. Mais vu effectivement mon niveau de connaissance du langage, à mon avis c'est assez mal barré !!! Mais bon, je vais essayer...
    Bonnes fêtes de fin d'année à tous.
    Cordialement

  6. #6
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 614
    Points
    3 614
    Par défaut
    Citation Envoyé par f5jcg_Lulu Voir le message
    L'instruction WVBrowser1.Navigate est soulignée en rouge.
    Hum, oui, alors la couleur, selon la version de l'IDE, faut pas trop s'en préoccuper. Seule la compilation permet de s'assurer que ça passe ou ça casse.

    Pour le fond du sujet, tout a été dit, tu devrais y arriver.

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 268
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 268
    Points : 41 671
    Points
    41 671
    Billets dans le blog
    64
    Par défaut
    Bonjour,

    ton problème est que tu veux utiliser des fonctions ou des procédures liées à des composants, il y a là confusion avec le titre.
    Paul t'a décrit la déclaration classique d'utilisation de fonction/procédure (non liées à des composants)
    Dans les deux cas que tu nous présentes ensuite, il s'agit de WebBrowser et d'un TQuery.

    pour prendre l'exemple du Datas si tu avais écrit une fonction dans l'unité datas genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function datas.OpenQContact : boolean;
    begin
    With QContacts do
      begin
        SQL.Clear;
       .............  
     end;
     try QContacts.Active:=True;
     
    except
    end;
      result:=QContacts.Active;
    end;
    alors, tu aurais pu écrire OpenQContact;

  8. #8
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    BrowserFrame, je suppose que c'est un TFrame...les TFrame contrairement aux TForm ne déclarent pas de variable globale

    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
     
    Unit Unit1;
     
    interface
     
    type
      Tform1 = class(TForm)
       ...
      end;
     
    var
      Form1: TForm1;
     
    implementation
    ...
    avec un Uses Unit1, les symboles TForm1 et Form1 sont connu...si TForm1 contient un bouton Button1, celui-ci n'est connu qu'à travers une instance de Form1 (il peut y en avoir plusieurs): Form1.Button1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    unit Unit2;
     
    interface
     
    type
      TFrame1 = class(TFrame)
      end;
     
    implementation
    ...
    pour un Cadre, seul le type est déclaré, et donc si je place un TFrame1 dans TForm1 je vais pouvoir écrire (avec un Uses Unit1) Form1.Frame1.Button1 pour accéder au bouton Button1 dans le cadre Frame1 qui se trouve dans TForm1

    la visibilité est hiérarchique

    question à deux balles, si j'écris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    begin
      Form1 := TForm1.Create(Application);
      Form1 := TForm1.Create(Application);
    end;
    je vais avoir deux fiches à l'écran...comment modifier le bouton de la première fiche ? vu que Form1.Button1.Caption pointera sur le bouton de la deuxième fiche crée ?

    spoiler alert !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var
      Form1a: TForm1;
      Form1b: TForm1;
    begin
      Form1a := TForm1.Create(Application);
      Form1b := TForm1.Create(Application);
    end;
    je peux déclarer d'autres variable de type TForm1...et dans ce cas Form1 (ajoutée par Delphi automatiquement) ne sera pas utilisée, Form1.Button plantera sur Form1 vide alors que j'ai créé deux TForm1...C'est une erreur de débutant de penser que Form1 et TForm1 sont forcément liés....ils le sont par défaut car Delphi crée une seule variable Form1 qui est utilisée pour stocker la seule instance de TForm1.

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/05/2015, 12h47
  2. Réponses: 1
    Dernier message: 12/02/2015, 12h00
  3. Comment appeler une procédure dans une autre unité ?
    Par michel71 dans le forum Langage
    Réponses: 1
    Dernier message: 19/09/2007, 17h27
  4. Appel de procédure dans une page ASP
    Par PrinceMaster77 dans le forum ASP
    Réponses: 5
    Dernier message: 02/04/2004, 17h59
  5. Appel de procédure...
    Par AmaX dans le forum Langage
    Réponses: 4
    Dernier message: 24/11/2002, 18h48

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