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 :

Passer une fiche en paramètre à une Unit.pas


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Technicien Indépendant
    Inscrit en
    Avril 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Technicien Indépendant

    Informations forums :
    Inscription : Avril 2011
    Messages : 13
    Par défaut Passer une fiche en paramètre à une Unit.pas
    Bonjour tous,
    Je débute en Delphi et je butte sur le problème suivant:
    J'ai créé une Unit qui me permet de faire un certain nombre de tâches particulièrement sur des chaînes de caractères pour renvoyer une chaine modifiés selon certains critères.
    Ce fichier est une sorte de bibliothèque ou je regroupe des fonctions et procédures que je vais appeler depuis le code d'une partie des fiches.

    J'aimerais pouvoir passer en paramètre ma fiche par exemple avec le mot self pour pouvoir le récupérer dans mon .pas pour traitement et ainsi déporté une portion de code qui sinon doit être ajouté à toutes les fiches.
    Est-ce un use à ajouter, est-ce impossible, je pense que j'ai un défaut de vocabulaire qui ne me permet pas de trouver la solution. Car quelque soit ma recherche je tombe à côté.

    donc depuis la fiche,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Use
    UnitBibl.pas
     
    procedure xyz;
      begin
        modifControls(self); 
      end;
    UnitBibl.pas
    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
     
     
    procedure modifControls(frm: Tform); //procédure qui fonctionne dans une fiche, mais s'en fiche dans un .pas sans fiche
        var
          i: Integer;
          chng: string;
        begin
     
     
          For i := 0 to frm.ComponentCount - 1 do
            Begin
              if Assigned(Components[i]) then
                if (Components[i].ClassName = 'TMenuItem') then
                  begin
     
                 fChangerCa((Self.Components[i] as TMenuItem).ce_que_je_veux_changer);
     
                  end;
            end;
     
        end;
    mais ni TForm ni le reste n'est accepté dans UnitBibl.pas. et ça m'énerve.
    Merci pour toutes pistes.

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 937
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 937
    Par défaut
    Self représente l'objet en cours. Pour l'utiliser, il faut que la procédure soit une méthode de cet objet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Uses UnitBibl.pas
     
    type
      TForm1 = class(TForm)
        procedure xyz;
      end;
     
    procedure TForm1.xyz;
    begin
      modifControls(self);
    end;
    TForm est une classe comme une autre. Pour l'utiliser dans une unité sans fiche, il faut ajouter manuellement l'unité Forms aux uses.
    Dans modifControls, la fiche est référencée par frm (l'argument), self n'est plus utilisable.
    Même si tester le nom de la classe peut fonctionner, on passera plutôt par l'opérateur is qui permettra aussi de trouver des classes dérivées.

    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
    uses Forms;
     
    procedure modifControls(frm: Tform); //procédure qui fonctionne dans une fiche, mais s'en fiche dans un .pas sans fiche
    var
      i: Integer;
     
    begin
      For i := 0 to frm.ComponentCount - 1 do
      Begin
        if (frm.Components[i] is TMenuItem then
        begin
          (frm.Components[i] as TMenuItem).Caption := fChangerCa;
        end;
      end;
    end;

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    c'est vieux mais toujours aussi vrai

    http://tothpaul.free.fr/tips.php?pv_class
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Membre averti
    Homme Profil pro
    Technicien Indépendant
    Inscrit en
    Avril 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Technicien Indépendant

    Informations forums :
    Inscription : Avril 2011
    Messages : 13
    Par défaut Voici mon résultat, fonctionnel, mais probablement pas parfait.
    Merci pour vos aides, j'ai finalement ajouté Vcl.Forms, et les Uses pour les composants que je veux gérer depuis le fichier .pas.

    donc dans mon fichier externe disons "FichierExterne.pas" j'ai ajouté utilisé le code suivant:

    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
     
    uses
    Vcl.Forms, Vcl.Menus {* je travail sur le menu là, mais pour modifier les autre composants, il faut les ajouter, dans cette section.
                                  il y a d'autres uses dans la section de mon .pas, que je n'ai pas ajouté pour plus de clarté.*}
     
    procedure UnitTesting(frm: TForm); 
        var
          x: TForm; //les noms des variables sont moches je sais.
          i: Integer;
          txt: string;
        begin
          x := TForm.Create(nil);
          x := frm;
     
          For i := 0 to x.ComponentCount - 1 do
            Begin
              if Assigned(x.Components[i]) then
                if (x.Components[i].ClassName = 'TMenuItem') then
                  begin
     
                    txt := pLng((x.Components[i] as TMenuItem).Caption); //pLng fait référence à une fonction qui modifie le menu selon la langue choisie. je ne sais pas si c'est la meilleure solution mais c'est la mienne.
                    (x.Components[i] as TMenuItem).Caption := txt;
     
                  end;
            end;
     
        end;
    J'obtiens le résultat souhaité en faisant appel depuis ma fiche de la manière suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    procedure Tform1.Activate(sender: TObject);
    begin
       UnitTesting(self);
    end;

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 937
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 937
    Par défaut
    Tu crées une fiche inutilement, travaille sur frm.
    De plus, cette nouvelle fiche n'est pas libérée et va entraîner une fuite mémoire.

  6. #6
    Membre averti
    Homme Profil pro
    Technicien Indépendant
    Inscrit en
    Avril 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Technicien Indépendant

    Informations forums :
    Inscription : Avril 2011
    Messages : 13
    Par défaut Merci
    Citation Envoyé par Andnotor Voir le message
    Tu crées une fiche inutilement, travaille sur frm.
    De plus, cette nouvelle fiche n'est pas libérée et va entraîner une fuite mémoire.
    merci pour le tuyau supplémentaire.

  7. #7
    Membre émérite Avatar de sergio_is_back
    Homme Profil pro
    Consultant informatique industrielle, développeur tout-terrain
    Inscrit en
    Juin 2004
    Messages
    1 188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant informatique industrielle, développeur tout-terrain
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 188
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Tu crées une fiche inutilement, travaille sur frm.
    De plus, cette nouvelle fiche n'est pas libérée et va entraîner une fuite mémoire.
    C'est de ça que Andnotor veut parler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          x := TForm.Create(nil); // C'est inutile de recréer une instance ici, supprimer cette ligne
          x := frm; // Tu affecte frm à x (c'est comme tu veux) du coup comment va-tu libérer la mémoire occupée par x avec le create au dessus ?
    Il n'est pas nécessaire de créer une instance d'une classe pour affecter une instance à une variable locale
    x et frm sont en réalité des pointeurs et si x est de type TForm et frm de type TForm aussi tu peux affecter directement frm à x. x pointera alors sur frm qui pointe lui même sur form1 (via self)

    De plus dans ton cas comme déjà dit x ne sert à rien...

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/07/2008, 19h26
  2. [PosGres] Existe-t-il une unité .pas?
    Par Caine dans le forum Bases de données
    Réponses: 9
    Dernier message: 23/07/2007, 19h41
  3. Réponses: 1
    Dernier message: 23/05/2006, 14h36
  4. Compiler une unité (*.pas to *.dcu)
    Par Enano2 dans le forum EDI
    Réponses: 2
    Dernier message: 20/03/2006, 14h38
  5. Passer une procédure en paramètre ?
    Par Cornell dans le forum Langage
    Réponses: 2
    Dernier message: 24/10/2003, 12h21

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