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 :

Changer la propriétés des Objets


Sujet :

Langage Delphi

  1. #1
    Membre confirmé Avatar de JustMe
    Inscrit en
    Juillet 2002
    Messages
    479
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 479
    Points : 594
    Points
    594
    Par défaut Changer la propriétés des Objets
    Bonjour ,
    Je veux en exécution changer les objets qui contiennent une propriété particulière j'ai essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetOrdProp(Sender,Nom_Propriete, Valeur_A_Affecter);
    ça marche bien, seulement dans le cas ou la propriété est imbriquée dans une autre je ne trouve pas comment la modifier.
    Exemple
    font.color

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetOrdProp(Sender,'Font.Color', clBlue);
    n'est pas permise je veux être capable d'accéder à de tel type de propriétés.
    Merci.

  2. #2
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    pourquoi cassé la tête avec sa?
    même si t'as des dizaine de composant, soit tu fait une boucle, soit les maitre sur un TPanel,

  3. #3
    Membre confirmé Avatar de JustMe
    Inscrit en
    Juillet 2002
    Messages
    479
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 479
    Points : 594
    Points
    594
    Par défaut
    Et bien il y a de quoi se casser la tête, j'ai en faite une procedure d'un événement qui détecte le changement de focus copié ici je veux juste la rendre plus générale pour toucher tous les objets que j'utilise. En bref c'est ça c'est plus ergonomique de rendre plus évidant le focus lorsqu'on travail sur une application.

  4. #4
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    dans Controls.pas:
    { VCL control message IDs }

    const
    CM_BASE = $B000;
    CM_ACTIVATE = CM_BASE + 0;
    CM_DEACTIVATE = CM_BASE + 1;
    CM_GOTFOCUS = CM_BASE + 2;
    CM_LOSTFOCUS = CM_BASE + 3;
    CM_CANCELMODE = CM_BASE + 4;
    CM_DIALOGKEY = CM_BASE + 5;
    CM_DIALOGCHAR = CM_BASE + 6;
    CM_FOCUSCHANGED = CM_BASE + 7;
    ....
    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
     
    ....
      private
        { Déclarations privées }
        localWP:TWndMethod;
        Procedure NWP(var msg:TMessage);
    ...
     
    procedure TForm1.FormCreate(Sender: TObject);
    var  i:integer;
    begin
         localWP:=WindowProc;
         WindowProc:=nwp;
         Memo1.Clear;
    end;
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
         WindowProc:=localWP;
    end;
    procedure TForm1.NWP;
    begin
         if (msg.Msg=CM_FOCUSCHANGED)  then
           begin
             Memo1.Lines.Add('Focus est changer '+ActiveControl.Name);
           end;
         localWP(msg);
    end;

  5. #5
    Membre confirmé Avatar de JustMe
    Inscrit en
    Juillet 2002
    Messages
    479
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 479
    Points : 594
    Points
    594
    Par défaut
    Merci pour ta réponse, Très instructif ce que tu viens d'envoyer mais la question reste là on a détecté que le focus a changé alors comment on procède pour changer la propriété d'un objet s'il contient une propriété particulière? en connaissant seulement le nom de sa propriété?

    je pense que la réponse est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetOrdProp(Sender,Nom_Propriete, Valeur_A_Affecter);
    ce qui me ramène à ma première question comment je peux modifier une propriété imbriquée d'un objet sans à avoir a connaitre son type ?
    Merci encore

  6. #6
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    active control est de type TWinControl, qui a des dizaine de propriété,
    donne un exemple de propriété que tu veux changer par exemple

  7. #7
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    Salut,

    Par exemple pour changer la taille de la police d'une bouton, je ferais un truc comme ça au premier abord...le code est assez explicit je pense.

    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
     
    var
      P: PPropInfo;
      C: TClass;
      O: TObject;
    begin
      P := GetPropInfo(MonButton, 'Font');
      if P <> nil then
      begin
        C := GetObjectPropClass(P);
        if C.InheritsFrom(TFont) then
        begin
          O := GetObjectProp(MonButton, P);
          if O <> nil then
            SetPropValue(O, 'Size', 12);
        end;
      end;
    end;

  8. #8
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
      private
     
        localWP:TWndMethod;
        Contol:TWinControl;
        Procedure NWP(var msg:TMessage);
        Procedure EntrControl(cont:TWinControl);
        Procedure ExitControl(cont:TWinControl);
    .....
    procedure TForm1.FormCreate(Sender: TObject);
    var  i:integer;
    begin
         Contol:=nil;
         localWP:=WindowProc;
         WindowProc:=nwp;
    ....
    end;
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
    .....
         WindowProc:=localWP;
    end;
    procedure TForm1.NWP;
    begin
         if (msg.Msg=CM_FOCUSCHANGED)  then
           begin
             if Contol<>nil then ExitControl(Contol);
             Contol:=ActiveControl;
             EntrControl(Contol);
           end;
         localWP(msg);
    end;
    procedure TForm1.EntrControl;
    begin
         cont.Brush.Color:=$FF;
         cont.Invalidate;
    end;
    procedure TForm1.ExitControl;
    begin
         cont.Brush.Color:=$FF000;
         cont.Invalidate;
    end;

  9. #9
    Membre confirmé Avatar de JustMe
    Inscrit en
    Juillet 2002
    Messages
    479
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 479
    Points : 594
    Points
    594
    Par défaut
    Re Bonjour
    Merci edam de t'avoir préoccupé de mon problème.
    Je pense que Kaféine (merci) a bien saisie ce que je veux faire.
    donc je vais essayer d'être bref et précis :
    Si on vous demandais d'écrire une procedure qui affecte une valeur à une propriété d'un objet X avec le prototype suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure ChangerPropriete(X : TObject; PropName : String; PropValue : Variant);
    Comment pouvez vous implémenter une telle procedure?
    Remarque : La propriété peut être simple de type Button.Caption ou imbriquée de type Button.Font.size
    Une fois de plus merci.

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 665
    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 665
    Points : 25 459
    Points
    25 459
    Par défaut
    Tu dois te faire un parser sur le point "." et faire un Get jusqu'à l'avant dernier et faire le Set sur le Dernier ... avec bien sur tous les risques d'affectation

    Biensur, ne continuer à descendre que si GetPropInfo renvoie un tkClass ... bon un code pondu directement sur le forum ...

    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
    procedure ChangerPropriete(X : TObject; PropName : String; PropValue : Variant);
    var
      A: TStringDynArray;
      I: Integer;
      P: PPropInfo;
    begin
      if (ExplodeLazy(PropName, A, '.') > 0) and (Length(A) > 1) then
      begin
        for I := Low(A) to Pred(High(A)) do
        begin
          P := GetPropInfo(X, A[I]);
          if Assigned(P) then
          begin
            if PropInfo^.PropType^^.Kind = tkClass then
              X := GetObjectProp(X, A[I])
            else
              raise EPropertyError.CreateFmt('Propriété "%s" non Objet dans "%s"', [A[I], PropName]);            
          end
          else
            raise EPropertyError.CreateFmt('Propriété "%s" Inconnue dans "%s"', [A[I], PropName]);     
        end;
     
        SetPropValue(X, A[High(A)], PropValue);
      end
      else
        SetPropValue(X, PropName, PropValue);
    end;



    ExplodeLazy est la version ultra courte de la fonction Explode qui traine sur le Forum

    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
    {* -----------------------------------------------------------------------------
    la fonction ExplodeLazy retourne un tableau de chaînes. Ce sont les sous-chaînes, extraites de S, en utilisant le séparateur Separator.
    @param S Chaine à découper
    @param A Tableau de Chaine qui recevra la découpe
    @param Separator Caractère qui délimitent une chaine pour la découpe
    @return Nombre de Séparateur Trouvé (peut-être différent du nombre de chaine dans A !)
    ------------------------------------------------------------------------------ }
    function ExplodeLazy(const S: string; out A: Types.TStringDynArray; Separator: Char): Integer;
    var
      I, J, K: integer;
      iLenS: integer;
    begin
      iLenS := Length(S);
     
      if iLenS = 0 then
      begin
        SetLength(A, 1);
        Result := 0;
        A[Result] := '';
        Exit;
      end;
     
      Result := 0;
      for I := 1 to iLenS do
        if S[I] = Separator then
          Inc(Result);
     
      if S[iLenS] = Separator then
        SetLength(A, Result)
      else
        SetLength(A, Result + 1);
     
      K := 1;
      J := 0;
      for I := 1 to iLenS do
        if S[I] = Separator then
        begin
          if K <> I then
            A[J] := Copy(S, K, I - K);
     
          Inc(J);
          K := I + 1;
        end;
      if K <= iLenS then
        A[J] := Copy(S, K, MaxInt);
    end;

  11. #11
    Membre confirmé Avatar de JustMe
    Inscrit en
    Juillet 2002
    Messages
    479
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 479
    Points : 594
    Points
    594
    Par défaut
    On ne trouve pas tous les jours du code servit à la cuillère comme ça.
    T'as pas idée combien ça m'a fait plaisir .
    Merci ShaiLeTroll c'est un plaisir de t'avoir dans ce forum t'as toujours des posts de qualité.
    Merci edam, Kaféine pour l'aide que vous m'avez apporté.

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

Discussions similaires

  1. Perl tk : propriété des objets
    Par developpeur99 dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 02/12/2008, 19h15
  2. [CR ?] gerer les propriétés des objets via les formules?
    Par Flamby38 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 25/06/2008, 17h01
  3. Userform Propriété des objets : ou ?
    Par Victor21 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/02/2008, 18h39
  4. Réponses: 1
    Dernier message: 09/11/2006, 13h34

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