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 :

XE7 : Form - Création et passage de variables


Sujet :

Delphi

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut XE7 : Form - Création et passage de variables
    Bonjour,

    Pour transmettre une variable d'une Form à une autre, j'utilise une méthode assez classique.
    Exemple sur 3 Forms : Unit1 -> showmodal -> Unit2 -> showmodal -> Unit3
    Code du projet et des 3 Forms
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    program Project1;
     
    uses
      Vcl.Forms,
      Unit1 in 'Unit1.pas' {Form1},
      Unit2 in 'Unit2.pas' {Form2},
      Unit3 in 'Unit3.pas' {Form3};
     
    {$R *.res}
     
    begin
      Application.Initialize;
      Application.MainFormOnTaskbar := True;
      Application.CreateForm(TForm1, Form1);
      Application.CreateForm(TForm2, Form2);
      Application.CreateForm(TForm3, Form3);
     
      Application.Run;
    end.
     
    unit Unit1;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, unit2;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
        FString : string;
      public
        { Déclarations publiques }
        Property prString : string read FString;
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      FString := 'Test';
      with Form2 do
         try
           ShowModal;
          finally
            Free;
          end;
    end;
     
    unit Unit2;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, unit3;
     
    type
      TForm2 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
     
      private
        { Déclarations privées }
        FString : string;
      public
        { Déclarations publiques }
        Property prString : string read FString;
      end;
     
    var
      Form2: TForm2;
     
    implementation
     
    {$R *.dfm}
    uses Unit1;
     
     
    procedure TForm2.Button1Click(Sender: TObject);
    begin
      FString := Form1.prString;
      with Form3 do
        try
          ShowModal;
        finally
          Free;
        end;
    end;
     
    end.
     
    unit Unit3;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs;
     
    type
      TForm3 = class(TForm)
        procedure FormShow(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form3: TForm3;
     
    implementation
     
    {$R *.dfm}
    uses Unit2;
     
    procedure TForm3.FormShow(Sender: TObject);
    begin
      showmessage(Form2.prString);
    end;
     
    end.
    Le code ci-dessus est tout à fait fonctionnel.


    Maintenant, je modifie le code de l'Unit1 ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      FString := 'Test';
     
      if Assigned(Form2) then FreeAndNil(Form2);
      if not Assigned(Form2) then begin
        with TForm2.Create(Application) do
          try
            ShowModal;
          finally
            Free;
          end;
       end;
    end;
    La Form2 apparaît bien (i.e. sans erreur) et je peux obtenir Form1.prString (par un showmessage par exemple).
    Mais l'appel de Form3 à partir de Form2 entraîne une violation d'accès... au moment de lire Form2.prString.

    Dans Form1, c'est visiblement la création avec with TForm2.Create(nil) qui pose problème... lors du passage de la variable de Form2 vers Form3. Pourquoi ? Le nil ? Qu'est-ce qui est rompu et pas recréé (un pointeur ?).

    Je crois que je vais essayer une autre méthode de gestion des Forms. La désassignation me semble très périlleuse et visiblement je n'en comprends pas son mécanisme... ou ma perception (ce à quoi elle sert exactement) en est très erronée. Si un spécialiste passe par là...
    Merci.
    Dernière modification par Invité ; 30/11/2014 à 20h20.

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

Discussions similaires

  1. passage de variable via form
    Par emilek dans le forum Langage
    Réponses: 2
    Dernier message: 21/11/2007, 14h12
  2. [vb net]passage de variable entre form !
    Par ChristopheOce dans le forum Windows Forms
    Réponses: 5
    Dernier message: 12/09/2006, 13h06
  3. [VB.Net][debutant]passage de variable entre windows form
    Par ChristopheOce dans le forum Windows Forms
    Réponses: 1
    Dernier message: 26/07/2006, 14h18
  4. Réponses: 2
    Dernier message: 29/06/2006, 01h36
  5. [C#] Passage de variables entre 2 forms
    Par Tips dans le forum C#
    Réponses: 6
    Dernier message: 06/12/2005, 16h48

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