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

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 176
    Points : 123
    Points
    123
    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 sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    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;

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

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

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 176
    Points : 123
    Points
    123
    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 sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    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;

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 176
    Points : 123
    Points
    123
    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.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 176
    Points : 123
    Points
    123
    Par défaut
    @ Paul TOTH
    Je viens à l'instant de reprendre ton dernier code, avec la cervelle un peu plus claire
    WAOU-OU-OU-HHH !!! Ça y est, je crois que je viens enfin de comprendre VRAIMENT comment on créait un objet !!! Cela offre des perspectives vertigineuses !!! .
    Je vais donc appliquer ce soir le tag Résolu. Peut-être serait-il bien de le flanquer du tag Délestage ? Qu'en penses-tu ?
    M'autorises-tu à t'adresser un MP ?
    Amicalement,
    Alain

  8. #8
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    Citation Envoyé par alainvh Voir le message
    @ Paul TOTH
    Je viens à l'instant de reprendre ton dernier code, avec la cervelle un peu plus claire
    WAOU-OU-OU-HHH !!! Ça y est, je crois que je viens enfin de comprendre VRAIMENT comment on créait un objet !!! Cela offre des perspectives vertigineuses !!! .
    Je vais donc appliquer ce soir le tag Résolu. Peut-être serait-il bien de le flanquer du tag Délestage ? Qu'en penses-tu ?
    M'autorises-tu à t'adresser un MP ?
    Amicalement,
    Alain
    Résolu me semble plus indiqué.

    Quand au MP, si c'est pour me demander comment faire un don ou me demander mes tarifs, je veux bien, mais pour les questions Delphi c'est ici que ça se passe

    Je ne connais pas ton niveau de programmation, mais j'ai voulu dans "Delphi 7 Studio" aux éditions Eyrolles faire un ouvrage qui explique les rouages de Delphi...c'est donc un livre fait pour réfléchir, mais il demande un minimum de connaissance en programmation car il ne reprend pas les bases.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 176
    Points : 123
    Points
    123
    Par défaut
    @ Paul TOTH

    Bonjour,
    Je vais me mettre en quête de ton ouvrage. Quant au MP, je laisse tomber, c'était juste pour t'adresser un remerciement chaleureux : on ne s'épanche pas en public, pudeur oblige
    Bonnes fêtes de fin d'année.
    Cordialement,
    Alain

+ 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