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 :

Override Form.Show ?


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2010
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 52
    Points : 30
    Points
    30
    Par défaut Override Form.Show ?
    Bonjour à tous,

    Je travaille actuellement sur une application assez grosses (plusieurs centaines de form), et je dois implanter un petit bout de code d'a peine quelque lignes dans le form.show, une histoire d'ajustement d'écran, bref, là n'est pas le problème.

    Évidemment, au nombre de form présente... j'ai pas très envie de toutes les faire à coup de copier-coller... et comme programmeur je me doute qu'il y a un moyen beaucoup plus efficace de le faire!

    Cependant je cherche, je fouille, j'essaie, j'échoue des compilations, mais je n'arrive pas a trouvé un moyen d'appliquer mon petit bout de code a chaque fois qu'un Form.Show s'effectue dans l'application. J'ai pensé a overloadé la méthode, mais je n'arrive pas plus a mes fins

    Es-ce que quelqu'un a une idée, ou mieux à déjà effectuer une opération du genre et aurait la bienveillance de partager ses connaissances?

    Sincèrement,
    Amuny

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 862
    Points : 11 318
    Points
    11 318
    Billets dans le blog
    6
    Par défaut
    un petit code qui les énumèrerait pour faire pointer leur OnShow sur une procédure unique ?

    à condition qu'il n'y ait rien de spécifique dans le OnShow de ces fiches
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 396
    Points : 640
    Points
    640
    Par défaut
    tu peux peut-être mettre ton code dans Screen.OnActiveFormChange l'évenement est déclenché à l'activation d'une fiche

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2010
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 52
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    un petit code qui les énumèrerait pour faire pointer leur OnShow sur une procédure unique ?

    à condition qu'il n'y ait rien de spécifique dans le OnShow de ces fiches
    Ça fait parti de ma problématique effectivement!

    Citation Envoyé par exoseven Voir le message
    tu peux peut-être mettre ton code dans Screen.OnActiveFormChange l'évenement est déclenché à l'activation d'une fiche
    Je commence a fouiller dans cet optique, mais comment pourrai-je l'affecter a toute les forms d'un seul coup?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 396
    Points : 640
    Points
    640
    Par défaut
    tu n'as pas besoin de l'assigner à toute tes formes, lors de l'ouverture de ton programme tu fais

    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
     
    procedure TMainForm.FormCreate(Sender: TObject);
    begin
     Screen.OnActiveFormChange := OnChangeForm;
     ...
    end;
     
    procedure TMainForm.OnChangeForm(Sender: TObject);
    begin
     
     // Screen.ActiveForm contient la forme active
     
     // ici ton code pour modifier tes formes
     
    end;

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2010
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 52
    Points : 30
    Points
    30
    Par défaut
    Le projet blabla.exe a déclanché la classe d'exception EInvalidOperation avec le message "Impossible de focaliser une fenêtre désactivée ou invisible"
    Continuer...
    Le projet blabla.exe a déclanché la classe d'exception EInvalidPointer avec le message "Invalid Pointer Operation"
    Continuer...
    Crash.

    avec ce code:

    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
    procedure TMainForm.Resizing (Sender:TObject);
    var
    aForm : TForm;
    begin
      aForm := Screen.ActiveForm;
      if (Screen.Width/Screen.Height) = (16/10) then
      begin
        //aForm.Nimportequoi
      end;
    [...]
    end;
     
    procedure TMainForm.FormCreate(Sender: TObject);
    begin
    Screen.OnActiveFormChange := Resizing;
    [...]
    end;
    j'essaie de faire n'importe quel traitement des plus anodins (Show, Close, SendToBack... juste pour tester), mais dès que j'essaie de faire quoique ce sois sur le aForm(donc la form active), les messages du haut apparaissent et le programme ne démarre pas
    Je continue a faire des essais et recherches activement

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 396
    Points : 640
    Points
    640
    Par défaut
    avant pense à tester si screen.ActiveForm n'est pas à nil ce qui peut arriver

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2010
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 52
    Points : 30
    Points
    30
    Par défaut
    oups
    du coup ca fonctionne mieux

    Merci beaucoup pour toute l'aide!

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2010
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 52
    Points : 30
    Points
    30
    Par défaut
    Reoups, crier victoire trop rapidement!

    En fait la la réaction donne ca:
    Dès que j'ouvre ou ferme une form, c'est la form principale qui est toujours affectée

    Edit: Apparemment, le OnActiveFormChange ne prend pas en compte le Form.Show mais lorsque je ferme la Form, oui. Donc j'affiche une form autre que la principale: Rien. Je la referme: Traite la forme active, en l'occurrence la main. Donc je me retrouve a faire mon traitement en boucle que sur la form principale dès que je referme une autre form du projet.

    Edit2: Oubliez ca... c'est le ScaleBy apparemment qu'il aime pas. J'ai fait la même chose avec un form Color et ca fonctionne bien... je retourne a mes besognes

  10. #10
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 740
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 740
    Points : 13 283
    Points
    13 283
    Par défaut
    personnellement, je créerais une fiche de base qui implémenterait le OnShow et modifierais toutes les fiches pour qu'elles en héritent. Même s'il y a 100 fiches à modifier, ça devrait être fait assez rapidement. (C'est du copier/coller)

    1. Ajout de la nouvelle unité dans uses.
    2. Modification de la classe de base de la fiche.
    3. Ajout de inherited dans OnShow si l'événement est déjà implémenté.
    4. Remplacement du mot object par inherited dans le dfm.

  11. #11
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 740
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 740
    Points : 13 283
    Points
    13 283
    Par défaut
    Une autre approche plus rapide: redéclarer TForm dans une nouvelle unité et surcharger DoShow.

    Tu n'as plus qu'à ajouter cette nouvelle unité dans les uses. (Obligatoirement après 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
    unit FormsEx;
     
    interface
     
    uses Math, Forms;
     
    type
      TForm = class(Forms.TForm)
      protected
        procedure DoShow; override;
      end;
     
    implementation
     
    { TForm }
     
    procedure TForm.DoShow;
    begin
      inherited;
     
      if SameValue(Screen.Width/Screen.Height, 16/10, 0.001) then
      begin
        //N'importe quoi
      end;
    end;
     
    end.

  12. #12
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Et pourquoi pas surcharger le DoShow en définissant une classe comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    type
      TForm = class(Forms.TForm)
      protected 
        procedure DoShow; override;
      end;
     
    implementation
     
    procedure TForm.DoShow;
    begin
      // Le code à insérer...
      inherited  DoShow;
    end;
    Il suffit ensuite d'inclure cette unité dans les uses, après Forms bien entendu.
    Astuce classique pour accéder aux méthodes et propriétés protected.

    [Edit]
    Grilled ! Je me disais aussi.

    @+

  13. #13
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 740
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 740
    Points : 13 283
    Points
    13 283
    Par défaut

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2010
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 52
    Points : 30
    Points
    30
    Par défaut
    Je viens d'appliquer la dernière solution sortie en double

    Plus efficace pour ce que je veux en faire, ça fonctionne super bien, merci encore

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

Discussions similaires

  1. Problème d'ouverture de fenêtre (Form.show)
    Par steelidol dans le forum Windows Forms
    Réponses: 3
    Dernier message: 30/08/2008, 16h10
  2. [C++/Cli] form->Show() - form->Hide()
    Par gabest dans le forum C++/CLI
    Réponses: 4
    Dernier message: 03/12/2007, 12h35
  3. form.show & form.hide / variable globale
    Par turf_trader dans le forum Delphi
    Réponses: 4
    Dernier message: 01/07/2007, 17h20
  4. form.show affichage d'une nouvelle fiche
    Par nadia2222 dans le forum Bases de données
    Réponses: 1
    Dernier message: 10/06/2007, 06h44
  5. Problème de form.show()
    Par tbdarkspirit dans le forum Windows Forms
    Réponses: 7
    Dernier message: 08/05/2007, 19h58

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