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 :

[D7] Problème avec Form.Create et/ou Form.Activate


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 75
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 181
    Par défaut [D7] Problème avec Form.Create et/ou Form.Activate
    Bonjour à toutes et tous.
    Description : depuis une Form1, un bouton Go lance une Form2.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TForm1.BoutonGoClick(Sender: TObject);
    begin
      Form2.ShowModal;
    end;
    J'utilise Form2.Create et Form2.Application pour positionner mes composants et dessiner un rectangle noir de "decorum". Ce rectangle noir sera ensuite écrasé par le dessin d'un diagramme dessiné ligne par ligne via un clic sur un bouton. Form2 se ferme par un Close.
    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
     
    procedure TForm2.FormCreate(Sender: TObject);
    begin
      // Passer plein écran
      Form2.WindowState := wsMaximized;
      Form2.BorderStyle := bsNone;
      //
    end;
     
    procedure TForm2.FormActivate(Sender: TObject);
    begin
      // Positionnement des composants...
      Button1.Top:=10;
      Edit1.Left:=20;
      // etc... Fin du Positionnement des composants
     
      // Decorum (donc simplement pour faire un effet
      // de présentation) : un rectangle noir
      Form2.Canvas.Pen.Color:=clBlack;
      Form2.Canvas.Brush.Color:=clBlack;
      Form2.Canvas.Rectangle(X1,Y1,X2,Y2);
    end;
     
    procedure TForm2.BoutonAfficheDiagrammeClick(Sender: TObject);
    begin
      // ici Instructions pour dessiner le diagramme
      // en écrasant le rectangle noir de Decorum
    end;
     
    procedure TForm2.BoutonStopClick(Sender: TObject);
    begin
      Close; // j'ai essayé Release (conseillé par Cl@udius).
             // Destroy ou Free = plantage
    end;
    Problème : lors de la première utilisation, le lance Form2.ShowModal : tout est Ok. Je ferme alors Form2 via Close pour revenir sur Form1. Mais si je relance Form2.ShowModal, mes composants sont bien positionnés, mais le rectangle noir ne s'affiche plus !

    Je ne demande pas une solution pour afficher à tout prix mon rectangle noir (ce n'est que du Decorum ), mais un éclairage pour m'aider à mieux comprendre les Form.Create et Form.Activate.

    D'avance merci, cordialement.

    Alain

  2. #2
    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
    l'évènement OnPaint est là pour "dessiner" la fiche

    sinon c'est une très mauvaise idée d'utiliser Form2 dans une méthode de TForm2

    Form2 est une variable globale qui pointe sur une instance de TForm2.

    si tu devais créer une seconde instance de TForm2, les méthodes de celle-ci manipuleraient la première instance !

    si tu utilises Form2 pour bénéficier de l'aide à la saisie, préfère lui Self, sinon le préfixe n'est pas nécessaire en Pascal (contrairement à "this" dans la plupart des langages objet).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TForm2.FormCreate(Sender: TObject);
    begin
      // utilise Self
      Self.WindowState := wsMaximized;
      // ou rien car nous sommes dans TForm2 et Delphi s'y retrouve :)
      BorderStyle := bsNone;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 75
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 181
    Par défaut
    Merci bien.
    Je vais explorer ta piste.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 75
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 181
    Par défaut
    Voici où j'en suis arrivé :
    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
     
    procedure TForm2.FormCreate(Sender: TObject);
    begin
      // Passer plein écran
      Self.WindowState := wsMaximized;
      BorderStyle := bsNone; 
    end;
     
    procedure TForm2.FormActivate(Sender: TObject);
    begin
      // Positionnement des composants...
      Button1.Top:=10;
      Edit1.Left:=20;
      // etc... Fin du Positionnement des composants
     
      // Decorum supprimé ici : voir procedure TForm2.FormPaint
    end;
     
    procedure TForm2.FormPaint(Sender: TObject);
    var X1,X2,Y1,Y2:integer;
    begin
      // définition de X1,X2,Y1,Y2 etc...
      Self.Canvas.Pen.Color:=clBlack;
      Self.Canvas.Brush.Color:=clBlack;
      Self.Canvas.Rectangle(X1,Y1,X2,Y2);
    end;
    ... et ça marche, mon rectangle revient bien en scène à chaque rappel

    Ton éclairage sur les instances (j'étais jusque là complètement passé à côté : dur d'être autodidacte ) me donne donc à penser que j'ai tout intérêt à modifier systématiquement mon code, à savoir, par exemple :
    Remplacer ce code...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure toto;
    begin
      Form1.Edit1.Text:='Bonnes fêtes à tous';
      // etc...
    end;
    ... par celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure toto(MaForme:TForm);
    begin
      MaForme.Edit1.Text:='Bonnes fêtes à tous';
      // etc...
    end;
     
    // en appelant la procédure toto ainsi:
    toto(self);
    Ceci étant, je n'ai toujours pas compris pourquoi mon code d'origine affichait bien mon rectangle noir sur un premier Form2.ShowModal et refusait de le faire sur un second Form2.ShowModal

  5. #5
    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
    je suis autodidacte

    alors OnPaint est appelé automatiquement quand la fiche doit se dessiner...ou se redessiner, donc le rectangle est toujours présent.

    OnActivate ne se produit qu'une fois voila tout

    Sinon ton histoire de toto me laisse perplexe

    1) si ton application ne possède qu'un Fiche Form1 et que la procédure toto intervient uniquement sur elle, pas besoin de changer le code.

    2) si ta réponse à (1) est OUI, alors toto devrait être une méthode de Form1 et non une procédure

    3) l'appel toto(Self) n'est vrai dans ton exemple que si cet appel est effectué depuis une méthode de TForm1 (voir remarque n°2 et 1)

    Rappel: SELF est un pointeur vers l'instance d'objet a qui appartient la méthode en cours d'execution.

    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
     
    type
      TMonObjet = class
       procedure Exec;
      end;
     
    var
      o1, o2: TMonObjet;
     
    procedure TMonObjet.Exec;
    begin
      if Self = o1 then WriteLn('Je suis o1 !');
      if Self = o2 then WriteLn('Je suis o2 !');
    end;
     
    begin
      o1 := TMonObjet.Create;
      o2 := TMonObjet.Create;
      o1.Exec;
      o2.Exec;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 75
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 181
    Par défaut
    Merci beaucoup pour ta pédagogie.
    Je vais potasser l'éclairage que tu me donnes : j'ai l'impression, encore vague, que ça progresse dans ma pauvre tête
    Je n'applique pas le tag Résolu ce soir...
    Bonne continuation.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 11/05/2010, 10h17
  2. Réponses: 1
    Dernier message: 17/03/2008, 12h42
  3. Réponses: 5
    Dernier message: 20/09/2007, 17h53
  4. Problème avec MetafileCanvas.create
    Par patrice rabiller dans le forum Delphi
    Réponses: 2
    Dernier message: 02/11/2006, 01h52
  5. [VB.NET] Problème avec le Owner d'un form
    Par boulete dans le forum Windows Forms
    Réponses: 2
    Dernier message: 03/03/2006, 14h02

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