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 :

initialisation d'une var


Sujet :

Delphi

  1. #1
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Points : 2 336
    Points
    2 336
    Par défaut initialisation d'une var
    Hello,

    Je cherche à initialisé une variable qui est définit dans une Form.

    Example j aimerais pouvoir passé lors de la création d une Form un attribut CurrentLanguage et ainsi loadé les Caption des boutons correspondant
    que dois je ajouter dans ma class appellante j ai ceci pour le moment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TSDIAppForm.ButtonGoodiesClick(Sender: TObject);
    var
     FormGoodies : TFormGoodies;
    begin
      FormGoodies := TFormGoodies.Create(self);
      FormGoodies.Show;  
    end;

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 422
    Points : 5 822
    Points
    5 822
    Par défaut
    salut

    tu peut tres bien creer une methode dans lequel tu passe tes parametre

    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
     
     TFormGoodies = Class(Tform)
    ...
    Public
      Init(Monparam : Integer) ;
    end;
    ...
    TFormGoodies.init(Monparam : Integer) ;
    begin
      ...
      Show
    end;
     
     
    procedure TSDIAppForm.ButtonGoodiesClick(Sender: TObject);
    var
     FormGoodies : TFormGoodies;
    begin
      FormGoodies := TFormGoodies.Create(self);
      FormGoodies.init(monParam);  
      ...
    end;
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Février 2003
    Messages
    4 341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 4 341
    Points : 5 953
    Points
    5 953
    Par défaut
    Tu peux créér un constructeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       Private
           Variable1 : String;
           Variable2 : Integer;
       Public
          Constructor MaCreation( AOwner: TComponent; MonParam1 : String; MonParam2 : Integer); override;

    Ensuite dans l'implémentation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Constructor TForm1.MaCreation( AOwner: TComponent; MonParam1 : String; MonParam2 : Integer);
    Begin
        inherited Create( AOwner);
     
        Variable1 := MonParam1;
        Variable2 := MonParam2;
    end;
    Par contre, il ne faut pas que la fenêtre soit créée automatiquement en début de projet, mais que tu la créés dynamiquement dans ton programme en faisant, par exemple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Procedure TForm2.Button1Cliqk( Sender : TObject);
    Begin
        Form1 := TForm1.MaCreation( Self, "Toto", 18);
        Form1.ShowModal;
        Form1.Free;
    End;
    En espérant t'avoir aidé...

    Kwasin

  4. #4
    Membre confirmé
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Points : 647
    Points
    647
    Par défaut
    Salut

    Kwasin a écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    Procedure TForm2.Button1Cliqk( Sender : TObject);
    Begin
        Form1 := TForm1.MaCreation( Self, "Toto", 18);
        Form1.ShowModal;
        Form1.Free;
    End;
    ATTENTION : C'est plantage assuré. La méthode Free d'une fiche (TForm) libère la mémoire mais ne détruit pas l'objet. Il faut (impérativement) utiliser la méthode Release.
    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    Procedure TForm2.Button1Cliqk( Sender : TObject);
    Begin
        Form1 := TForm1.MaCreation( Self, "Toto", 18);
        Form1.ShowModal;
        Form1.Release;
    End;
    Rien n'est moins sur que l'incertain : Pierre DAC

  5. #5
    Inactif  
    Profil pro
    Inscrit en
    Février 2003
    Messages
    4 341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 4 341
    Points : 5 953
    Points
    5 953
    Par défaut
    Citation Envoyé par Philippe Gormand
    ATTENTION : C'est plantage assuré. La méthode Free d'une fiche (TForm) libère la mémoire mais ne détruit pas l'objet. Il faut (impérativement) utiliser la méthode Release.
    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    Procedure TForm2.Button1Cliqk( Sender : TObject);
    Begin
        Form1 := TForm1.MaCreation( Self, "Toto", 18);
        Form1.ShowModal;
        Form1.Release;
    End;
    T'es sûr ?
    J'ai toujours utiliser Free, et j'ai jamais eu de plantage !
    Rmq, je suis en Delphi5, c'est peut-être la raison.

  6. #6
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Citation Envoyé par kwasin
    T'es sûr ?
    J'ai toujours utiliser Free, et j'ai jamais eu de plantage !
    Rmq, je suis en Delphi5, c'est peut-être la raison.
    En fait ce n'est pas obligatoire que ça plante. Mais je confirme ce que dit philippe il faut utiliser Release au lieu de Free. D'ailleurs même l'aide Delphi le confirme (Et c'est valable sur la version 5) :

    Tous les gestionnaires d'événements de la fiche ou ses enfants doivent utiliser Release àla place de Free (Delphi)ou delete (C++).Sinon,des erreurs d'accès àla mémoire se produiront.

  7. #7
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Points : 2 336
    Points
    2 336
    Par défaut
    merci de vos réponses

  8. #8
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 968
    Points
    6 968
    Par défaut
    Citation Envoyé par Philippe Gormand
    ATTENTION : C'est plantage assuré. La méthode Free d'une fiche (TForm) libère la mémoire mais ne détruit pas l'objet. Il faut (impérativement) utiliser la méthode Release.
    Je ne comprend pas. Comment un objet peut-il exister s'il n'existe plus en mémoire ?

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  9. #9
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Citation Envoyé par Lung
    Je ne comprend pas. Comment un objet peut-il exister s'il n'existe plus en mémoire ?

    En fait l'objet n'existe plus avec un Free. Le problème vient simplement du fait que le Free libère la fiche directement sans s'occuper des évenements possibles. Du coup des plantages sont possible. La doc Delphi dit ceci :
    Release ne détruit pas la fiche avant que tous les gestionnaires d'événements de la fiche et des composants de la fiche n'aient eu le temps de terminer leur exécution.Cette procédure garantit aussi que tous les messages de la file d'attente des événements de la fiche sont traités avant la libération de la fiche.

  10. #10
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Salut,

    Dans ce cas précis, j'utiliserais un propriété avec un methode Setter.
    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
    TFormGoodies = Class(Tform)
    private
      procedure SetMonParam(Value : Integer);
    Public
    Property MonParam : integer write SetMonParam;
    end;
    ...
    TFormGoodies.SetMonParam(Value : Integer) ;
    begin
     // tu met ici toutes les actions à faire en fonction de value : genre modification de caption bouton, menu, etc
      .....
    end;
     
     
    procedure TSDIAppForm.ButtonGoodiesClick(Sender: TObject);
    var
     FormGoodies : TFormGoodies;
    begin
      FormGoodies := TFormGoodies.Create(self);
      FormGoodies.MonParam := 10;  
      ...
    end;
    Voilà.

    A+
    On progresse .....

  11. #11
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Juste pour revenir au Release vs Free

    +1 pour le Release.

    Bien qu' un Free derriere un ShowModal théoriquement il y a peu de chance de plantage (quoi que... ).

    Release fait un Free par message (voir source de TCustomForm.Release), message qui se retrouve à la fin de la file d'attente.
    On est donc assuré, que tous les messages précédents sont traités, et le Free traité en dernier.

    Par contre cela n'a rien a voir avec les gestion de la mémoire il me semble...
    Release fait un Free purement et simplement... mais en étant sur que c'est à la fin de tout traitement.
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  12. #12
    Inactif  
    Profil pro
    Inscrit en
    Février 2003
    Messages
    4 341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 4 341
    Points : 5 953
    Points
    5 953
    Par défaut
    Je comprend la différence entre Release et Free. Toutefois je pense que les problemes ne peuvent provenir que dans le cas de traitement non modal, car après un showmodal, il ne devrait plus y avoir de problème.

    Pour plus de sureté, j'utiliserai dorenavant Release.

    Merci pour les explications

    PS : Ca ne change rien au principe du constructeur surchargé pour passer des paramètres.

  13. #13
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Bonjour,

    La méthode "Free" pour détruire un Tform doit être à la méthode "Application.Terminate" ce qui permet de quitter un programme.

    Autrement dit, pas ces méthodes bourrines, une méthode "Release" pour détruire un TForm et une méthode "Close" pour quitter un programme. Là aussi cette méthode "Close" permet de liquider dans les règles de l'art et proprement les éventuelles séquences en file du programme.

    Enfin... si j'ai bien suivi

  14. #14
    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
    pour ma part j'utlise toujour release
    free est déconseillé surtout si il est applé dans la meme fiche, (comme si en sie un branche....)
    pour le multilangue déjà ce sujet est passé, fait un peut de recherche
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

Discussions similaires

  1. Case a contourné l'initialisation d'une var
    Par Asmod_D dans le forum C++
    Réponses: 5
    Dernier message: 20/08/2006, 22h26
  2. Initialisation d'une colonne par rapport à une autre colonne
    Par jeromesco dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 13/04/2005, 17h15
  3. Affectation d'un champs blob dans une var de type TStrings
    Par Andry dans le forum Bases de données
    Réponses: 1
    Dernier message: 16/03/2005, 18h26
  4. [Initialisation] Remplir une structure une fois
    Par Kimael dans le forum Langage
    Réponses: 14
    Dernier message: 08/06/2004, 15h33
  5. [FLASH 5] Passer une var ou un paramètre
    Par Harry dans le forum Flash
    Réponses: 8
    Dernier message: 18/03/2004, 17h46

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