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 un TEdit en argument de procedure


Sujet :

Delphi

  1. #1
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut passer un TEdit en argument de procedure
    salut les gars !


    petite question surement bete mais je trouve pas

    j'ai une procedure :
    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
     
    procedure inverserCouleur(objet: TObject);
    begin
    	with objet do
    	begin
    		if Color = clRed then
    		begin
    			Color := clWhite;
    			Font.Color := clBlack;
    		end
    		else
    		begin
    			Color := clRed;
    			Font.Color := clWhite;
    		end;
    	end;
    end;
    que je declare comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var
    	procedure inverserCouleur(objet: TObject);

    et je pensais l'utiliser comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    inverserCouleur(Form1.txMasque);
    txMasque est un composant TEdit mais voici les erreurs :
    [Erreur] Unit1.pas(111): Identificateur non déclaré : 'Color'
    [Erreur] Unit1.pas(114): Identificateur non déclaré : 'Font'
    [Erreur] Unit1.pas(119): Opérateur ou point-virgule manquant

    il n'y a donc pas moyen de faire une procedure simple ou je passe une cible en parametre ?

    si a la place de with objet do je mets directement with Form1.txMasque do ... dans le code de la procedure la ca fonctionne mais je perds tout l'interet de la procedure


    merci

  2. #2
    Membre actif
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Andorre

    Informations forums :
    Inscription : Juin 2004
    Messages : 219
    Points : 241
    Points
    241
    Par défaut
    Salut

    tu dois faire un cast

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure inverserCouleur(objet: TObject);
    begin
      if object is TEdit then
        with TEdit(objet) do
        begin
          ....
        end;
    A+

  3. #3
    Membre éclairé
    Avatar de denokan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 434
    Points : 746
    Points
    746
    Par défaut
    TObject n'a pas de propriété Color ou Font, donc ca ne marche pas. solution :
    1. tu peux déclarer ta procedure pour qu'elle accepte un TEdit en paramètre
    2. tu peux laisser sa signature telle quelle, mais faire plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (object is TEdit) then begin
      (object as TEdit).Color := clRed;
      (object as TEdit).Font.Color := clRed;
    end;

  4. #4
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    hé bé ...
    j'ai bien fait de poser la question car je ne cherchais pas du tout dans cette direction

    le seul probleme c'est que cette procedure d'inversion de couleur doit fonctionner pour plusieurs types de composants :TEdit et TMemo

    donc pour l'instant j'ai testé ca ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	procedure inverserCouleur(objet:TEdit);overload;
    	procedure inverserCouleur(objet:TMemo);overload;
    mais ca m'oblige a declarer 2 fois la procedure

    j'ai donc suivit votre exemple et j'ai fait :
    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
    procedure inverserCouleur(objet: TObject);
    begin
    	if objet is TEdit then
    	begin
    		with TEdit(objet) do
    		begin
    			if Color = clRed then
    			begin
    				Color := clWhite;
    				Font.Color := clBlack;
    			end
    			else
    			begin
    				Color := clRed;
    				Font.Color := clWhite;
    			end;
    		end;
    	end
    	else if objet is TMemo then
    	begin
    		with TMemo(objet) do
    		begin
    			if Color = clRed then
    			begin
    				Color := clWhite;
    				Font.Color := clBlack;
    			end
    			else
    			begin
    				Color := clRed;
    				Font.Color := clWhite;
    			end;
    		end;
    	end;
    end;
    mais ca fait plein de begin et de end et ca oblige aussi a avoir aussi 2 fois le meme code
    c'est bete qu'on ne puisse pas utiliser un type générique
    decidement plus j'avance dans delphi et moins je trouve ca pratique


    merci

  5. #5
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 925
    Points : 6 040
    Points
    6 040
    Par défaut
    Peut-être qu'en passant par les messages tu y arriverais de manière plus générique .

    Mais, je ne garantis pas le fonctionnement ...

    L'idée étant d'envoyer l'ordre de changement de couleur, etc... via un SEND MESSAGE, en adressant le handle du composant.

  6. #6
    Membre averti
    Profil pro
    xxxxxxxxxxx
    Inscrit en
    Juin 2004
    Messages
    308
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : xxxxxxxxxxx

    Informations forums :
    Inscription : Juin 2004
    Messages : 308
    Points : 407
    Points
    407
    Par défaut
    Mais si Delphi c'est pratique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if GetPropInfo(objet, 'Color') <> nil then
              TColor(GetObjectProp(objet), 'Color')) := clWhite;
    (uses typinfo)

  7. #7
    DMO
    DMO est déconnecté
    Membre averti
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Points : 343
    Points
    343
    Par défaut
    Bien vu cmen76, ça me plait bien comme solution.

    Je propose juste une simplification du code de Lorenzo77, car concernant l'exemple de TEdit et TMemo, en jouant un peu du CTRL+Clic, on se rend compte qu'ils hérientent tous deux de TCustomEdit.

    Malheureusement, mais c'est parfaitement normal, TCustomEdit ne propose pas l'accès publique aux propriétés qui t'interessent, mais pour info on peut néanmoins accéder aux propriétés protégées d'une façon peu recommandable (mais bien pratique) en procédant comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    type
      TExplosedCustomEdit = class(TCustomEdit);
     
    procedure inverserCouleur(objet: TObject);
    begin
      if objet is TCustomEdit then
        with TCustomEditHack(objet) do
          begin
            ...
          end;
    end;
    En fait, on pourrait aller encore plus loin, puisque Font et Color sont définis dans TControl, mais bon, peut-être pas utile dans ton cas.

  8. #8
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    qi130 : SEND MESSAGE fait partie integrante de windows sauf erreur, je prefere les applications portables sur les autres systemes ...


    cmen76 : merci
    vu comme ca c'est sur que ca a l'air tout de suite + simple


    DMO : ben justement, j'ai essayé de remplacer la declaration de la procedure par :
    procedure inverserCouleur(objet: TControl);
    puisque c'est a partir de TControl que l'on trouve la declaration de Color ... mais j'ai eu les memes erreurs

    je vais essayer d'adapter ton code et celui de cmen76 mais ca va etre dur .... je le sens

  9. #9
    DMO
    DMO est déconnecté
    Membre averti
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Points : 343
    Points
    343
    Par défaut
    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
    type
      TExplosedControl = class(TControl);
     
    procedure inverserCouleur(unControle: TControl);
    begin
    	with TExplosedControl(unControle) do
    	begin
    		if Color = clRed then
    		begin
    			Color := clWindow;
    			Font.Color := clWindowText;
    		end
    		else
    		begin
    			Color := clRed;
    			Font.Color := clWhite;
    		end;
    	end;
    end;
    (pas testé, ni même compilé !)

  10. #10
    Membre averti
    Profil pro
    xxxxxxxxxxx
    Inscrit en
    Juin 2004
    Messages
    308
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : xxxxxxxxxxx

    Informations forums :
    Inscription : Juin 2004
    Messages : 308
    Points : 407
    Points
    407
    Par défaut
    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
     
    procedure inverserCouleur(unControle: TControl);
    var AColor : TColor;
        AFont : TFont;
    begin
      AColor := TColor(GetPropInfo(unControle, 'Color'));
      AFont := TFont(GetPropInfo(unControle, 'Font'));
      if AColor = clRed then
      begin
        AColor := clWindow;
        if assigned(AFont) then 
          AFont.Color := clWindowText;
      end
      else
      begin
        AColor := clRed;
        if assigned(AFont) then 
          AFont.Color := clWhite;
      end;
    end;
    Tout cuit, là !

  11. #11
    DMO
    DMO est déconnecté
    Membre averti
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Points : 343
    Points
    343
    Par défaut
    Citation Envoyé par cmen76
    Tout cuit, là !
    bien joué RTTI man, ça marche t'as testé ?

  12. #12
    Membre averti
    Profil pro
    xxxxxxxxxxx
    Inscrit en
    Juin 2004
    Messages
    308
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : xxxxxxxxxxx

    Informations forums :
    Inscription : Juin 2004
    Messages : 308
    Points : 407
    Points
    407
    Par défaut
    ça marche t'as testé ?
    Le procédé fonctionne parfaitement dans une de mes applis ;
    Le bout de code fourni, je viens de le modifier, il y aurait eu 3 erreurs de compil... Je laisse le soin à Lorenzo77 de nous confirmer que ça gazouille.

Discussions similaires

  1. [VB6]Comment puis-je passer une ComboBox en argument?
    Par Xan dans le forum VB 6 et antérieur
    Réponses: 20
    Dernier message: 26/02/2007, 16h03
  2. passer un tableau d'arguments à un thread
    Par madimane dans le forum POSIX
    Réponses: 5
    Dernier message: 14/04/2006, 08h08
  3. passer un char** en argument
    Par ben_popcorn dans le forum C
    Réponses: 11
    Dernier message: 26/03/2006, 22h57
  4. Comment passer une fonction en argument
    Par Pades75 dans le forum Langage
    Réponses: 4
    Dernier message: 16/02/2006, 11h34
  5. Passer une fonction comme argument à une fonction
    Par Cocotier974 dans le forum Général Python
    Réponses: 4
    Dernier message: 29/06/2004, 14h41

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